In questo tutorial affronteremo la seconda parte del progetto "Led e Pulsante" che consiste nel trasformare un pulsante in in un interruttore, partendo dal circuito del Tutorial precedente.
Problema del "Rimbalzo"
Il malfunzionamento dipende dal fatto che i pulsanti meccanici rimbalzano per alcuni millisecondi nel momento in cui sono premuti e rilasciati.
Codice
Tempo stimato (in millisecondi) della durata delle oscillazioni. Più il valore è alto più sicurezza abbiamo che il pulsante non risenta del problema del rimbalzo.
int ledPin = 6;
int pulsantePin = 9;
int ledStato = LOW;
int pulsanteStato = LOW;
int attesaDebounce = 50;
long ultimoTempoDebounce = 0;
/*long assume valori interi compresi tra da -2147483648 a 2147483647*/
int ultimaLettura = LOW;
void setup(){
pinMode(ledPin, OUTPUT);
/*Led*/
pinMode(pulsantePin, INPUT);
/*Pulsante*/
digitalWrite(ledPin, ledStato);
}
void loop(){
/*Leggo e memorizza lo stato del pulsante*/
int lettura = digitalRead(pulsantePin);
/*Se lo stato del pin è cambiato tra una lettura e l`altra...*/
if(lettura != ultimaLettura){
ultimoTempoDebounce = millis();
}
}
void loop(){
...
if((millis - ultimoTempoDebounce) > attesaDebounce){
if((lettura != pulsanteStato) && (lettura == HIGH)){
ledStato = !ledStato; /*Cambio lo stato del pin 6*/
digitalWrite(ledPin, ledStato);
}
pulsanteStato = lettura; /*Assegno lo stato del pulsante al pin 9*/
}
/*Assegno l'ultima lettura allo stato del pulsante*/
ultimaLettura = lettura;
delay(10);
Codice Finale
int ledPin = 6;
int pulsantePin = 9;
int ledStato = LOW;
int pulsanteStato = LOW;
int attesaDebounce = 50;
long ultimoTempoDebounce = 0;
/*long assume valori interi compresi tra da -2147483648 a 2147483647*/
int ultimaLettura = LOW;
void setup(){
pinMode(ledPin, OUTPUT);
/*Led*/
pinMode(pulsantePin, INPUT);
/*Pulsante*/
digitalWrite(ledPin, ledStato);
}
void loop(){
/*Leggo e memorizza lo stato del pulsante*/
int lettura = digitalRead(pulsantePin);
/*Se lo stato del pin è cambiato tra una lettura e l`altra...*/
if(lettura != ultimaLettura){
ultimoTempoDebounce = millis();
}
if((millis - ultimoTempoDebounce) > attesaDebounce){
if((lettura != pulsanteStato) && (lettura == HIGH)){
ledStato = !ledStato; /*Cambio lo stato del pin 6*/
digitalWrite(ledPin, ledStato);
}
pulsanteStato = lettura; /*Assegno lo stato del pulsante al pin 9*/
}
/*Assegno l'ultima lettura allo stato del pulsante*/
ultimaLettura = lettura;
delay(10);
}
Componenti Utilizzati
- Scheda Arduino
- Breadboard
- Led
- Pulsante
- Resistore da 220 ohm da collegare al Led
- Resistore da 1 kohm da collegare al Pulsante