Testato:
leo ma a questo punto possiamo dire di avere inventato il "mio" Delay2.0 ?
Guarda che l'ho chiamato myDelay, e non testatoDelay :P
cioe' posso usare in autonomia myDelay, sostituendolo ai delay normali di arduino, senza creare nessun AddJob ?
Lo puoi fare ma a questo punto è inutile la lib.
cioe' questo funziona e non e' bloccante ?
BLINK 2.0
(idea Testato - creazione Leo :-) )
void loop() {
digitalWrite(13, HIGH);
myScheduler.myDelay(1000);
myScheduler.scheduler();
digitalWrite(13, LOW);
myScheduler.myDelay(1000);
myScheduler.scheduler();
}
Funziona ma non va bene ed il myDelay è bloccante per il codice così come il delay. Non è bloccante per i job inseriti nello scheduler. Ma se non usi nessun job nello scheduler, a che ti serve myDelay?
Ti spiego perché il tuo codice non va bene. Questo andrebbe bene:
BLINK 2.0
(idea Testato - creazione Leo :-) )
void loop() {
digitalWrite(13, HIGH);
myScheduler.myDelay(1000);
digitalWrite(13, LOW);
myScheduler.myDelay(1000);
}
Non so se hai visto il codice di myDelay che ho postato un paio di messaggi sopra per capire come funziona ma in pratica si tratta di un ciclo while che chiama costantemente lo scheduler finché non sono trascorsi i ms passati come parametro. Se il myDelay è l'ultima istruzione del loop, puoi evitare di chiamare lo scheduler perché l'ultima cosa fatta da myDelay è appunto l'invocazione di esso.
Ma a questo punto il codice qui sopra non va bene lo stesso perché nello scheduler non c'è nulla. Che lo fai a fare uno sketch del genere? :P
Il codice giusto per avere un Blink non bloccante è invertire le cose e mettere il codice del lampeggio in un job e lasciare tutto il resto nel loop. Ad esempio, questo fa il blink mentre ad intervalli di 1 secondo stampa un valore sulla seriale:
#include "looper.h"
looper myScheduler;
byte led1Status = 0;
const byte LED1 = 13;
int counter = 0;
void setup() {
pinMode(LED1, OUTPUT);
Serial.begin(19200);
myScheduler.addJob(flashLed1, 100);
}
void loop() {
Serial.println(++counter);
myScheduler.myDelay(1000);
}
void flashLed1() {
led1Status^=1;
digitalWrite(LED1, led1Status);
}
Questo è un esempio concreto del delay 2.0, che non ferma l'esecuzione dei job in background ma funziona invece come delay classico per il codice principale.