Jakékoliv měření času se dá provést přes funkci millis(). Spoustu pěkného povídání je zde. Celé povídání zdůrazňuje měření intervalu a ne jednotlivých časů. Potom je také možné díky modulární aritmetice pohodově překonat přetečení unsigned long typu, co nastava asi každých 47 dní. Pokud je potřeba čas prodloužit, článek doporučuje použít 64 bitů pro uložení času přes”
uint64_t millis64() { static uint32_t low32, high32; uint32_t new_low32 = millis(); if (new_low32 < low32) high32++; low32 = new_low32; return (uint64_t) high32 << 32 | low32; }
Pokud nepotřebujeme v uptime měřit sekundy, tak se pomocí zjednodušení na minuty dostaneme na nekolik tisíc let i pomoci unsigned long. Jenom je potreba pracovat s millis() jednou za minutu (to je 60 000 ticku). Kód pak může vypadat napriklad takhle”
unsigned long TT,upM=0,upH=0,upD=0; if (millis()-TT >60000) { upM++; if (upM == 60) { upM = 0; upH++; } if (upH == 24) { upH = 0; upD++; } TT = millis(); }
Hezke, ale je tam spousta chyb. Kdyz nebudes millis nulovat, bude prvni podminka po minute splnena pri kazdem pruchodu …
Mozna takhle?
if (millis()-TT >60000) { //kdyz je cas behu – poznaceny cas vetsi nez 60s
upM++; //navys minuty o jednu
TT = millis(); //a poznamenej cas
if (upM == 60) { //je li minut 60
upM=0; //vynuluj minuty
upH++; //navys hodinu o jednu
}
if (upH == 24) { //je-li hodin 24
upH=0; //vynuluj hodiny
upD++; //pricti jeden den
}
else { //jinak (kdyz neni cas behu – poznamenany cas vetsi nez 60s) to znamena po preteceni
TT=0; //vynuluj poznamenany cas
}
Diky za komentář. Bylo to myšleno jako studijní příklad, přesto souhlasím, že tam něco chybí:-) To něco je:
TT = millis();
před poslední závorkou. Pokud by se to nulovalo, tak to nebude fungovat. Opravil jsem to i v kódu.
Ještě jednou díky.