Biblioteki typu Timer są wykorzystywane we wszelkich programach w których chcemy wywoływać cykliczne działania, bez używania niezwykle popularnej, ale bardzo nieprzydatnej z powodu stopowania procesora funkcji delay(). Oto jedna z nich.
ŹRÓDŁO:
- Świetny opis wykorzystania biblioteki Timers.h
- http://forum.arduinopolska.pl
- Opis biblioteki napisany przez autora(?)
- https://majsterkowo.pl/forum/gotowiec-4-obsluga-watkow-koniec-z-uciazliwym-delay-t1974.html
Najprostsze użycie biblioteki, wywołanie funkcji co 1 sekundę
#include <Timers.h>
Timers <2> akcja;
void setup(){
akcja.attach(0, 1000, zrob_cos_co1sek); // inicjalizacja procesu
}
void loop(){
akcja.process(); //pooling - cyklicznie wywolanie by sprawdzic czy juz czas dzialac
}
void zrob_cos_co1sek() {
//wlasny podprogram do wykonania co 1 sek
}
Jednokrotne wywołanie funkcji po zadanym czasie. (Źródło Arduino na dobry początek)
#include <Timers.h>
Timers <2> akcja;
int i=1;
void setup(){
akcja.attach(0, 0, zrob_cos_raz); // inicjalizacja procesu
}
void loop(){
akcja.process(); //pooling - cyklicznie wywolanie by sprawdzic czy juz czas dzialac
if (i) akcja.setInterval(0,5000); // zrob cos za 5 sek
}
void zrob_cos_raz() {
akcja.updateInterval(0,0); //wylacz timer
i=0;
//wlasny podprogram do wykonania jednokrotnie
}
OPIS BIBLIOTEKI (skrócony)
pobrany ze strony:
http://forum.arduinopolska.pl/watek-biblioteka-timers-koniec-z-uciążliwym-delay?highlight=Timers.h
—————————-
Czym biblioteka Timers różni się od biblioteki Timer, TimerOne czy TimerTree?
Przede wszystkim prostotą użycia jej w programie. Zasadniczo korzystamy z 4 wygodnych funkcji składowych klasy Timers:
1) Konstruktor – inicjalizacja obiektu klasy Timers.
Przykład:
Timers <8> akcja; – Powołujemy do życia obiekt klasy Timers o przykładowej nazwie akcja, który może obsłużyć 8 niezależnych wątków (zdarzeń)
2) Funkcja attach(nr wątku, interwał wywołania, funkcja obsługi), gdzie:
– numer wątku, to numer jednego z 8 wcześniej zdefiniowanych w konstruktorze wątków;
– interwał – odstęp czasu w ms. W tych odstępach będzie wywoływana funkcja obsługi
– funkcja obsługi – nazwa funkcji, która ma być wykonywana.
W tym zakresie funkcja attach jest łudząco podobna do funkcji attachInterrupt.
Przykłady:
akcja.attach(2,5000,pokazTemp); – co 5 sekund wątek 3 (liczymy od 0) wywołuje funkcję pokazTemp()
akcja.attach(0, 1000, pokazCzas); – co 1 sekundę wątek pierwszy wywołuje funkcję pokazCzas()
akcja.attach(1,0,flopKierunek); – definiujemy wątek nr 2, ale nie mamy na razie zamiaru z niego korzystać – interwał =0
UWAGA!!!
Funkcja attach musi być zainicjowana w funkcji setup() dla każdego z wątków.
Jeśli nie mamy zamiaru od razu korzystać z danego wątku, to w funkcji attach ustawiamy interwał na 0
3) Funkcja updateInterval(nr wątku, akt interwał), gdzie:
– nr wątku, to numer jednego z 8 wcześniej zdefiniowanych w konstruktorze wątków;
– akt interwał – dynamiczna zmiana czasu wywoływania funkcji, w szczególnym przypadku dla interwał=0 wyłączamy obsługę wątku.
Przykłady:
akcja.updateInterval(2,0); – zatrzymanie obsługi wątku nr 3
akcja.updateInterval(4,189); – zmiana lub ustawienie dla wątku nr 5 czasu wywoływania funkcji obsługi na 189 ms.
4) funkcja process() – wywoływana w pętli loop, uruchamia globalną obsługę wszystkich zadeklarowanych
w konstruktorze wątków
Przykład:
akcja.process();