04-05-2019, 15:16
Ja używam wbudowanej w Arduino funkcji millis() - tiku systemowego co 1ms, jest na bazie liczby 32bity, więc raz w loop zamieniam sobie na różne flagi oznaczające upływ części sekundy, sekundy, minuty itp. Używając timerów pamiętaj, że powinieneś wiedzieć, które są już użyte, by nie rozwalić tego co już działa. Zabawa z millis() i micros() jest łatwiejsza:
Jeśli wystarcza zmieniać ściemnianie z krokiem 1s można użyć if(fsekundy)...., jeśli co 100ms if (fnTik && (nTik%10==0))... , ostatnie można zapisać też !(nTik%10) - gdy od poprzedniego tyknięcie upłyneło 10ms, to jest nowe i jednocześnie licznik tych tyknięć podzielony przez 10 nie ma reszty (==0). Tak, wiem, że liczba jest max 255 i często będzie coś gubić w tym wypadku, ale oko tego nie zauważy. Do sterowania szwajcarskim zegarkiem w aptece można to zrobić inaczej. Trzeba też pamiętać, że jak są zakamarki w programie, gzie program znacząco dłużej niż nTik znika z loop błąd pomiaru wszystkich liczników będzie mocno odjeżdżał od normalnych sekund i minut. Z drugiej strony funkcję czas() czy każdą inną opartą o millis() uruchomisz na Arduino z AVR, STM, ESP i co tam kiedyś wymyślą i uczynią zgodnym z Arduino IDE.
Kod:
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++;
}
}
}
}
}
}
Miło być decenianym https://buycoffee.to/kaczakat