Okazało się, że nie mogę używać biblioteki Timer razem z CayenneMQTTESP8266 ponieważ występuje konflikt klas. Potrzebowałem funkcji, która będzie odmierzała czas po zanotowaniu ustania ruchu przez czujnik mikrofalowy. Oczywiście zatrzymująca pracę procesora funkcja delay() nie wchodzi w rachubę. W czasie gdy procesor jest blokowany inny czujnik może potrzebować uwagi. Znalazłem w necie artykuł i podobną do Timer bibliotekę millisDelay. Świetnie się nadaje do mojego projektu.
keywords.txt
millisDelay KEYWORD1
start KEYWORD2
stop KEYWORD2
repeat KEYWORD2
restart KEYWORD2
finish KEYWORD2
justFinished KEYWORD2
isRunning KEYWORD2
getStartTime KEYWORD2
remaining KEYWORD2
delay KEYWORD2
Najprostszy szkic zastępujący funkcję delay()
#include <millisDelay.h>
int led = 13;
// Pin 13 has an LED connected on most Arduino boards.
millisDelay ledDelay;
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
digitalWrite(led, HIGH); // turn led on
// start delay
ledDelay.start(10000);
}
void loop() {
// check if delay has timed out
if (ledDelay.justFinished()) {
digitalWrite(led, LOW); // turn led off
}
}
Zastosowanie metody repeat()
#include <millisDelay.h>
int led = 13;
// Pin 13 has an LED connected on most Arduino boards.
bool ledOn = false; // keep track of the led state
millisDelay ledDelay;
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT); // initialize the digital pin as an output.
digitalWrite(led, LOW); // turn led off
ledOn = false;
// start delay
ledDelay.start(1500);
}
void loop() {
// check if delay has timed out
if (ledDelay.justFinished()) {
ledDelay.repeat(); // start delay again without drift
// toggle the led
ledOn = !ledOn;
if (ledOn) {
digitalWrite(led, HIGH); // turn led on
} else {
digitalWrite(led, LOW); // turn led off
}
}
}
Oprócz objaśnionych przykładami metod start(zwłoka), justFinished() i repeat(), biblioteka millisDelay używa też następujących metod:
- stop(), która pauzuje odliczanie zwłoki (justFinished() nadal przyjmuje wartość false),
- isRunning() dzięki której sprawdzamy czy odliczanie trwa,
- restart() ponawia odliczanie z wcześniej określoną zwłoką,
- finish() wymusza wcześniejsze zakończenie odliczania zwłoki,
- remaining() zwraca ilość milisekund aż odliczanie zwłoki się zakończy
- delay() zwraca wartość zwłoki ustalonej metodą start()