Contare fronte di salita segnale

Come posso contare solo il fronte di salita di un segnale dal pin digitale? Dovrei realizzare un conta accessi con delle fotocellule e mi serve contare solo il fronte di salita altrimenti il conteggio sale all' infinito. Ho già provato a inserire un ritardo ma non risolve il mio problema.

Il metodo più semplice è il seguente:

static bool pinOld;
if (!pinOld && digitalRead(pin)){
  //Quello che devi fare
};
pinOld = digitalRead(pin);

L'alternativa è usare attachInterrupt() (http://arduino.cc/en/Reference/AttachInterrupt) impostandolo su rising, ma ricordati che le variabili che modifichi dentro l'interrupt le devi definire come "volatile".

Scusate ma non sono ancora molto pratico a programmare, anche a me serve un foronte di discesa da utilizzare per programmare un ascensore. puoi spiegarmi cosa significa questo: static bool pin01d; E a cosa serve il punto esclamativo davanti a pin01d? "&&" è come dire "and" ? Pin01d è una variabile?

oibboz: Dovrei realizzare un conta accessi con delle fotocellule e mi serve contare solo il fronte di salita altrimenti il conteggio sale all' infinito.

Ehhhh ????? :astonished: :astonished: :astonished:

Ma come hai collegato queste "fotocellule" ??? ... perché è un problema abbastanza banale senza andarsi ad impelagare in fronti di salita ed interrupt ...

Guglielmo

Guarda questo esempio --> http://arduino.cc/en/Tutorial/ButtonStateChange Memorizzi lo stato del pulsante in modo che anche se tenuto premuto il conteggio non aumenti.

Janos: Il metodo più semplice è il seguente:

static bool pinOld;
if (!pinOld && digitalRead(pin)){
  //Quello che devi fare
};
pinOld = digitalRead(pin);

Sbaglio o così gli conteggia anche i fronti di discesa????

No, conta solo i fronti di salita, ovvero quando pinOld vale false e digitalRead(pin) vale true. Per far contare anche i fronti di discesa la condizione sarebbe stata:

static bool pinOld;
if (pinOld != digitalRead(pin)){
  //Quello che devi fare
};
pinOld = digitalRead(pin);

@giammy-vise Mi sa che devi studiarti un po' il C++. Non vuol essere un rimprovero ma se non sai neppure cosa è l'operatore di confronto && prima di andare avanti il mio consiglio è di fermarti un attimo e leggerti qualche guida o meglio ancora un buon libro di C++... Passi il non sapere cosa significa la parola chiave static, ma credo sia anche difficile spiegartelo se non sai le regole di visibilità e tempo di vita di una variabile, cose fondamentali da sapere anche per una programmazione di base.

P.S. Se proprio volessimo fare i pignoli, nell'esempio che ho scritto sopra c'è il rischio che non funzioni in quanto ci sono due digitalRead diverse e potrebbe succedere che lo stato del pin cambi proprio nel mezzo fra le due (caso improbabile ma non impossibile). Per evitare questo dovremmo fare una cosa del genere:

static bool pinOld;  //Stato del pin al ciclo precedente
bool pinAct;                           //Stato del pin in questo ciclo

pinAct = digitalRead(pin); //Faccio una sola digitalRead
if (!pinOld && pinAct ){
  //Quello che devi fare
};
pinOld = pinAct ;

Hai ragione, conta solo le salite! Dovrei evitare di esaminare programmi prima di aver bevuto il quinto caffè del mattino :grin: