Biblioteka Timers v.16.4.0 – Program sterowany czasem

Użyto zdjęcia na licencji CC: https://www.flickr.com/photos/michael_mayer/6969282632

Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. Badum-tsss.

Właściwie tutaj mógłbym skończyć swoje filozofowanie i wrócić do pisania kolejnej mrugającej diody. Jednak do dzwonka jeszcze daleko i nie chcę zostawić cię szanowny czytelniku z niczym.

Bo wkurza mnie, że na Arduino tak trudno napisać coś bardziej skomplikowanego. Wielu już próbowało. Wielu się nawet udało. Jednak ich kod wyglądał po tej operacji jak koń po westernie.

Jedną z większych bolączek jest funkcja “delay(czas)”. Użyjesz takiej, to ci zablokuje cały program. Więc program może robić tylko jedną rzecz. Jak chcesz zrobić inną w tym samym czasie – dokup drugie Arduino! Prawie jak tablety.

Moim remedium na te problemy jest…

Biblioteka Timers

Jej idea jest prosta. Rodzice podróżują z dziećmi samochodem. Dzieci co jakiś czas pytają “kieeedy dojedziemyyyy?”. Rodzice wymyślają jakąś odpowiedź i mamy spokój na kolejne 15 minut, w czasie których każdy może robić swoje.

Gdyby taką wycieczkę organizowało Arduino. Po zapytaniu, wszyscy zamarliby w bezruchu aż jakimś cudem samochód dotoczy się na miejsce przeznaczenia – czyli do rowu.

Postanowiłem napisać bibliotekę, która działa wg naturalnego scenariusza.
Ustawiasz timer na jakiś czas. Program robi swoje i co jakiś czas sprawdza specjalną funkcję, która odpowiada, że czas już minął, albo nie minął. To tyle. Jak minął to dzieją się rzeczy które miały się dziać po tym czasie. Jak nie minął to dzieją się inne.

W końcu człowiek jak spojrzy na zegarek to nie zatrzymuje się aż będzie godzina na którą czekał. Tylko robi coś innego i co jakiś czas sprawdza czas.

Moje rozwiązanie jest nawet lepsze, bo pozwala stworzyć dużo timerów i sprawdzać na każdym inny odliczany czas.
Oznacza to, że Arduino może teraz robić wiele rzeczy na raz. To tak jakbyś miał stertę budzików i w zależności od tego który zadzwoni, robiłbyś coś innego. Genialne!

Jak działa biblioteka Timers

Najpierw trzeba wytworzyć timer. Robi się go jak zmienną. Wystarczy napisać.

Timer mojTimer;

Teraz pod nazwą “mojTimer” masz swój timer do odliczania czasu.
Możesz zrobić więcej takich timerów pod różnymi nazwami, albo ich tablicę.

Potem ustalasz ile czasu timer ma odliczać.

mojTimer.begin(3000);

W tym przypadku kazałem mu odliczać 3000 milisekund czyli 3 sekundy.

Oczywiście to nie blokuje programu. Program wykonuje dalsze rozkazy. Skąd wiadomo, że czas upłynął?

if (mojTimer.available()) {
// Tu wpisujesz co ma się dziać kiedy czas timera upłynie
}

Funkcja o nazwie “available” należąca do “mójTimer” to takie “spojrzenie na zegarek”, czy już?
Program się nie blokuje tylko odpowiada, że czas już minął, albo nie minął. Jeśli tak to wykona się kawałek programu w nawiasach klamrowych po “if”.

Jeśli chcesz by timer zaczął liczyć od nowa, wystarczy użyć:

mojTimer.restart();

To są podstawy użycia biblioteki Timers. W tej prostocie tkwi siła niczym w Minecraft ;-) Tylko zamiast klocków są timery.

Działanie biblioteki Timers w praktyce

No i doigrałem się. Pierwszy praktyczny przykład mojej biblioteki to te oklepane mruganie diodą. Ale co poradzić. Na jego przykładzie przekonasz się o zaletach tego rozwiązania.

#include <Timers.h>

Timer ledBlinkTimer;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  ledBlinkTimer.begin(SECS(2));
}

void loop() {
  if (ledBlinkTimer.available())
  {
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
    ledBlinkTimer.restart();
  }
}

Na początku za pomocą “include” informujesz, że będzie używana biblioteka Timers.
Potem tworzysz timer o nazwie “ledBlinkTimer”.
W funkcji “setup” ustawiasz timer na 2 sekundy za pomocą “begin” i “SECS”.
W funkcji “loop” program sprawdza czy upłynął już czas timera.
Jeśli tak to zamieniane jest świecenie diody z nieświeceniem i następuje reset timera za pomocą funkcji “restart”. Potem wszystko dzieje się od nowa.

Do funkcji “loop” możesz dopisać kolejne elementy programu. Nic nie będzie blokowane i wiele niezależnych elementów programu może współpracować razem. W ten sposób Arduino może robić więcej niż jedną rzecz na raz. W końcu można pisać rozbudowane programy bez zbędnych zmartwień.

Jeśli spodobała Ci się ta biblioteka, przejdź na stronę projektu, pobierz ją i zapoznaj się z dodatkowymi funkcjami oraz przykładami.

Biblioteka współpracuje z płytkami TinyBrd, Arduino, Teensy, ESP8266 i innymi.