Esiste una soluzione piu' lineare che e' quella di usare le JeeLib con la funzione Sleepy::loseSomeTime che corrisponde ad una funzione delay con il sistema in sonno profondo che si risveglia senza la necessita' di un interrupt esplicitp
in modo molto semplice lo sketch base e'
----------------------------
#include <JeeLib.h>
ISR(WDT_vect) { Sleepy::watchdogEvent(); }
void setup() {
}
void loop() {
// fai qualcosa
Sleepy::loseSomeTime(5000);
}
----------------------------L'unica accortezza con questa funzione e' il parametro e' in millisecondi ed il suo formato e' una word per cui al massimo si puo' arrivare a 65535 (ovvero circa 65 secondi). Per effettuare ritardi piu' lunghi si deve inserire la funzione in un ciclo del tipo
---------------------------
unsigned int minuti = 60; //ritardo in minuti
Sleepy::loseSomeTime(60000); //60.000 microsecondi = 1 minuto
----------------------------
Visto che in fase di sleep e' disabilitato il clock dall'oscillatore al quarzo, il calcolo del tempo risulta non accurato (un utente riporta che loseSomeTime(60000) termina dopo 59 secondi)
Non sono riuscito a fare misure dirette (il mio misuratore Volt/Amp si ferma alla decina di mA) ma sembra che in fase di sleep il consumo del microcontrollore sia inferiore di circa un fattore 10 per scendere a qualche microA
Nessun commento:
Posta un commento