(09-02-2023, 21:58)kaczakat napisał(a): Można sobie użyć gotowej funkcji sprintf, np. taki kod:
W efekcie daje wydruk co 1s:Kod://sprintf - formatowanie do bufora http://mikrokontrolery.blogspot.com/2011/02/printf-instrukcja-rodzina.html
/*
* flash/RAM
* Sprintf 3646/223 - + 1300flash i bufor
kolejna linijka z Sprintf 3708/223
Skrótem 2340/201
Pelny z F 2460/199
Pelny bez F 2390/203
*
*/
uint32_t czasTeraz,czasPoprzedni,tik=10; //tik musi byc mniejszy niz 1000 i dzilic 1000ms na rowne czesci
uint8_t nTik,sekundy,minuty,godziny,dni; //liczniki tikow, sekund, itd.
bool fnTik,fsekundy,fminuty,fgodziny,fdni; //flagi zdarzen nowy tik, nowa sekunda,minuta, godzina, dzien
char napis[10];
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(LED_BUILTIN,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
czas();
if(fsekundy) {
sprintf(napis,"%03d:%02d:%02d",godziny,minuty,sekundy);
Serial.println(napis);
}
if(fnTik&&! (nTik%20)) digitalWrite(LED_BUILTIN,! digitalRead(LED_BUILTIN));//gdy nowy tik i co 20 tikow
}
void czas()
{
czasTeraz=millis();
fnTik=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik) //tan napisany warunek jest odporny na "klątwe 50 dni millis()"
{
czasPoprzedni=czasTeraz;
fnTik=1;
nTik++;
if(nTik>=(1000/tik))
{
nTik=0;
sekundy++;
fsekundy=1;
if (sekundy>=60)
{
sekundy=0;
minuty++;
fminuty=1;
if (minuty>=60)
{
minuty=0;
godziny++;
fgodziny=1;
if (godziny>=24)
{
godziny=0;
fdni=1;
dni++;
}
}
}
}
}
}
000:00:01
000:00:02
000:00:03
itd.
Bardzo, bardzo dziekuję. Jeszcze u mnie
nie zadziałało, ale pracuje nad tym