Problemi libreria METRO!!!!

Ciao a tutti! Sono svariati giorni che provo a capire come funziona la libreria metro ma con scarso successo… Mi spiego meglio:

#include <Metro.h>;
#define LED 12
#define INGRESSO 3

int state=LOW;

Metro ledMetro = Metro(250);

void setup()
{
Serial.begin(9600);
pinMode(LED,OUTPUT);
digitalWrite(LED,state);
pinMode(INGRESSO,INPUT);

}

void loop()
{

state=digitalRead(INGRESSO);
if (ledMetro.check() == 1){// controlla che non viene passato il tempo di Metro

if (state==HIGH) // se lo stato è alto aspetta 2 secondi e poi interroga
{

//ledMetro.reset();
state=HIGH;
ledMetro.interval(1000);
Serial.print(state);
}

else
{ // altrimenti se è basso interroga ogni due secondi
//ledMetro.reset();

state=LOW;
ledMetro.interval(1000);
Serial.print(state);
}
digitalWrite(LED,state);// accende il led se alto, spenge il led se è basso
}

}

Questo è il codice, dovrebbe secondo me, ogni secondo interrogare l’ingresso digitale 3 e lo fa, peccato che quando vario lo stato ( da 5v a 0) il contatore continua a vedere lo stato 1 per 4 volte prima di tornare a 0(circa 4 secondi)… come mai??? Ho notato inoltre che aumentando il tempo d’intervallo i livelli alti diminuiscono. Grazie…

Qlc potrebbe aiutarmi.. è una cosa importante... Grazie!!!! :wink:

Arduix,
il codice in linea di massima sembrerebbe ok.
A parte il fatto che attendi 1 secondo DOPO aver letto il valore dal pin INGRESSO...

Che tipo di input hai su quel pin?

grazie della risposta...in input ho un 5V!

Arduix, dovresti essere più.. verboso

Ho capito che arrivano 5v, ma da cosa arrivano? Come son connessi al pin (direttamente o in mezzo c'è qualche componente)? Come definisci che da 5v passi a 0v (interruttore/componente/..)?

Ho capito che arrivano 5v, ma da cosa arrivano?

I 5V arrivano da un partitore resistivo che mi restituisce 5.2 V.

Come son connessi al pin (direttamente o in mezzo c'è qualche componente)?

Sono direttamente connessi al pin 3.

Come definisci che da 5v passi a 0v (interruttore/componente/..)?

Inserisco e disinserisco i 5V manualmente!!

cmq se non sono stato chiaro ti spiego cosa vorrei fare... vorrei leggere ogni secondo il valore in input.. se ho degli zeri il led rimane spento, appena legge un 1 aspetta un secondo e se lo rilegge allora accende il led..

vorrei leggere ogni secondo il valore in input.. se ho degli zeri il led rimane spento, appena legge un 1 aspetta un secondo e se lo rilegge allora accende il led..

non è attualmente quello che fa il codice che hai postato.
Nel tuo codice PRIMA viene letto il valore del pin INGRESSO, quindi viene atteso 1 secondo.
Poi in base allo stato del pin INGRESSO recuperato 1 secondo prima, viene acceso o spento il led:

....
state=digitalRead(INGRESSO);     // lettura pin
 if (ledMetro.check() == 1){     // controlla che non viene passato il tempo di Metro 
...
 digitalWrite(LED,state);     // accende il led se alto, spenge il led se è basso
...

Inoltre a questo livello potresti semplificare il codice, poichè sia che lo stato sia HIGH che LOW esegui esattamente le stesse operazioni.

Grazie mille per le preziose informazioni.. ora ho risolto questo problema però colgo l'occasione per chiederti un consiglio...

devo fare un programma ciclico che se ho in ingresso tre volte 1 mi fa accendere un led, (legge 3 volte 1 accende un led,legge 3 volte 1 e accende un led, ) se invece legge 0101 accende un altro led... come posso fare per fargli capire la variazione di stato????

..forse potesti semplicemente usare una variabile int inizializzata a 0.
Nel tuo loop, in fase di lettura del valore del pin INGRESSO, se tale valore è HIGH allora incrementi la variabile int, altrimenti l'azzeri.

Ad ogni loop verifichi anche se tale variabile int sia uguale a 3.
Nel caso sia uguale a 3, accendi il led e azzeri la variabile stessa.

In questo modo solo e solo se ci son 3 occorrenze successive di HIGH, viene acceso il led.

:slight_smile:

io sono riuscito a fargli leggere i tre 1 successivi e far accendere il led ma il problema nasce sul secondo led, non so come fargli capire l'alternanza dei valore 1 e 0..

ah ok, non avevo capito fosse un caso specifico.

Ad ogni modo, in questo casi si tratta di logica.
Qui dovresti spremerti un pochino le meningi pure tu...

Quando poi avrai bisogno di portare la logica in codice, è un altro paio di maniche.