..Arduino, tempo….. e Metro lib


Gestire gli intervalli di tempo con un arduino è un po’ rognoso se non si è degli abili programmatori! Per risolvere questo problema ho provato mesi fa un’ottima libreria che si fa carico del lavoro sporco..

La libreria in questione è Metro e come dice la descrizione:

Rende semplice l’implementazione di eventi ricorsivi basati sul tempo come:

  • lampeggio di led
  • controllo di servomotori
  • comunicazioni seriali



Ho scoperto l’esistenza di questa libreria quando durante la mia tesi di laurea, mi trovavo a dover eseguire operazioni cicliche e basate sul tempo, tipo leggere il valore del pH all’interno della camera di coltura di un bioreattore ogni circa 30 secondi (in condizioni normali) e visualizzare il dato su un display, successivamente inviare una lettura sulla porta seriale ogni circa 30 minuti… le celluline non fanno variare il pH molto velocemente….

Questi intervalli da gestire, insieme alla necessità di poterli variare in base alle condizioni rilevate all’interno della camera di coltura (i delay dovevano cambiare quando il pH scendeva sotto un certo valore) mi hanno convinto ad optare per una libreria che gestisse il tutto.

Come funziona la libreria:

CREAZIONE

Metro(unsigned long interval)

Creazione dell’oggetto Metro e configurazione dell’intervallo interval in ms (autoreset=false)

Metro(unsigned long interval, byte autoreset)

Creazione dell’oggetto Metro e configurazione dell’intervallo interval in ms.

Se autoreset è settato TRUE (1), il timer interno si resetterà in automatico perdendo gli eventi “mancati“. Questa funzione dovrebbe essere interessante quando non si chiama costantemente o frequentemente il check. LA FUNZIONE AUTORESET NON E’ STATA TESTATA (da me).

METODI

La libreria Metro non fa uso di interrupts, sarà quindi necessario “controllare” lo stato regolarmente.

byte check()

Restituisce TRUE quando è trascorso l’intervallo settato in precendeza. Altrimenti FALSO.

void interval(unsigned long interval)

Cambia l’intervallo precedentemente settato con il nuovo valore interval.

void reset()

Resetta/riavvia il timer.

Di seguito l’esempio 1 riportato sulla pagina originale tradotto (più o meno…)

/* Questo sketch farà lampeggiare il led connesso al pin 13 resterà acceso per 0.25 seconds. e spento per 1 second. */ #include <Metro.h> //Include Metro library #define LED 13 // Define the led's pin //Creazione di una variabile in cui tener traccia dello stato int state = HIGH; // creazione dell'oggetto metro e settaggio dell'intervallo a 250 milliseconds (0.25 seconds). Metro ledMetro = Metro(250); void setup() {   pinMode(LED,OUTPUT);   digitalWrite(LED,state); } void loop() {   if (ledMetro.check() == 1) { // controlla se metro ha "passato"l'intervallo.     if (state==HIGH)  {       state=LOW;       ledMetro.interval(250); // se il pin è HIGH, setta l'intervallo a 0.25 seconds.     }     else {       ledMetro.interval(1000); // se il pin è LOW, setta l'intervallo a 1 second.       state=HIGH;     }     digitalWrite(LED,state);   } }


Potete trovare la pagina originale sul playground di arduino


Tag: , ,

Lascia un Commento