Led e Interruttore

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.

Come è possibile vedere dalla figura, appena il pulsante viene premuto o rilasciato si genera un segnale “sporco”, per ovviare il problema via software, come vedremo più avanti, è necessario aggiungere una funzione ”antirimbalzo”.Tempo stimato (in millisecondi) della durata delle oscillazioni. Più il valore è alto più sicurezza abbiamo che il pulsante non risenta del problema del rimbalzo.

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;

Inizializziamo i Pin e impostiamo il il Pin 6 (led) su LOW:

void setup(){
   pinMode(ledPin, OUTPUT);   /*Led*/
   pinMode(pulsantePin, INPUT);   /*Pulsante*/
   digitalWrite(ledPin, ledStato);
}

Memorizza quanti millisecondi sono trascorsi dall'inizio dell'esecuzione del programma:

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();
   }
}

Riutilizziamo la funzione millis () per sapere il tempo attuale dal quale sottraiamo il tempo dell'ultimo cambio di stato del pulsante, in questo modo otteniamo il tempo trascorso dall'ultimo cambio. Se il tempo trascorso è maggiore del valore della variabile attesaDebounce possiamo supporre che le oscillazioni siano terminate e quindi possiamo eseguire il codice sottostante.

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

Circuito

Circuito realizzato da Lorenzo Ermini




Related Posts

Led e Pulsante

Led e Seriale

Most Read

Cos'è Arduino?

Arduino IDE

Setup() & Loop()

Funzioni, Variabili e Strutture

Related Posts

Led e Pulsante

Led e Seriale

Catagories