• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Oświetlenie Led PWM
#3
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:
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++;
   
       }
     }
   }
 }
}
}
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.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Wiadomości w tym wątku
Oświetlenie Led PWM - przez Lobaf - 04-05-2019, 08:28
RE: Oświetlenie Led PWM - przez es2 - 04-05-2019, 10:35
RE: Oświetlenie Led PWM - przez kaczakat - 04-05-2019, 15:16
RE: Oświetlenie Led PWM - przez es2 - 04-05-2019, 16:58
RE: Oświetlenie Led PWM - przez Lobaf - 05-05-2019, 18:43
RE: Oświetlenie Led PWM - przez es2 - 05-05-2019, 18:51
RE: Oświetlenie Led PWM - przez kaczakat - 05-05-2019, 19:13

Skocz do:


Przeglądający: 1 gości