02. Pulsante di accensione led

Nota:

Quando il pulsante è premuto tutti i piedini sono in collegamento tra loro.

Componenti:

La resistenza da 10K ohm assolve al ruolo di resistenza di pull-down (pressione del bottone), ossia la resistenza ha lo scopo di non far andare in corto circuito Arduino quando viene premuto pulsante.


Soluzione

Sketch

int buttonstatus;

void setup()

{

   pinMode(12, OUTPUT);

   pinMode(8, INPUT);

   digitalWrite(12, LOW);

}

void loop()

{

   buttonstatus = digitalRead(8);       // lettura dell'ingresso

   if (buttonstatus == HIGH) {          // pulsante premuto?

      digitalWrite(12, HIGH);        // accendo il LED

   }

   else if (buttonstatus == LOW) {      // pulsante rilasciato?

      digitalWrite(12, LOW);         // spengo il LED

   }

}

Nota

Il valore delle resistenze pull-up/pull-down può essere scelto in un ampio range di valori.

Se sono troppo piccole la corrente a pulsante premuto è troppo grande e di conseguenza carica in modo eccessivo la fonte di alimentazione  (valori sotto il K ohm).

Se sono troppo grandi non riescono a portare l'entrata al potenziale definito. 

Tutti i valori intermedi possono essere adeguati. Valori sensati per la maggiore parte dei casi sono tra 1 e 100 K ohm.

Per gli ingressi di tipo digitale i valori di riferimento sono:


Variante 1

Introduciamo ora una variante per definire un nuovo comportamento del pulsante. Vogliamo fare in modo che premendo una volta il pulsante il led si accenda permanentemente e premendolo nuovamente il led si spenga permanentemente.

Gli stati da gestire sono dunque i seguenti:

Sketch

int ledpin=12;

int buttonpin=8;

int buttonstatus;

int previous_buttonstatus=LOW;

int status = 0;

void setup()

{

   pinMode(ledpin, OUTPUT);

   pinMode(buttonpin , INPUT);

   digitalWrite(ledpin, LOW);

}

void loop()

{

   buttonstatus = digitalRead(buttonpin);   

   if (buttonstatus == HIGH && previous_buttonstatus == LOW) { 

      status++;

      status = status % 2;                                               

      previous_buttonstatus = HIGH;                                     

   }

   else if (buttonstatus == LOW)

      previous_buttonstatus = LOW;   

   

  if (status==0){

    digitalWrite(ledpin, LOW);

  }

  else if (status == 1){

     digitalWrite(ledpin, HIGH);

  } 

}


Variante 2

Utilizziamo ora il pulsante per introdurre il nuovo stato "led lampeggiante".

Gli stati da gestire sono dunque i seguenti:

Premendo il pulsante si passerà da uno stato al successivo in modo circolare come accade, ad esempio, con la serie di luci natalizie.

Sketch

int ledpin=12;

int buttonpin=8;

int buttonstatus;

int previous_buttonstatus=LOW;

int status = 0;

void setup()

{

   pinMode(ledpin, OUTPUT);

   pinMode(buttonpin , INPUT);

   digitalWrite(ledpin, LOW);

}

void loop()

{

   buttonstatus = digitalRead(buttonpin);   

   if (buttonstatus == HIGH && previous_buttonstatus == LOW) { 

      status++;

      status = status % 3;   

      previous_buttonstatus = HIGH;                                     

   }

   else if (buttonstatus == LOW)

      previous_buttonstatus = LOW;   

   

  if (status==0){

    digitalWrite(ledpin, LOW);

  }

  else if (status == 1){

     digitalWrite(ledpin, HIGH);

  }

  else if (status == 2){

     digitalWrite(ledpin, HIGH);

     delay(2000);

     digitalWrite(ledpin, LOW);

     delay(2000);

  } 

}

Nota:

La presenza del delay all'interno del loop rende il sistema poco reattivo all'input. In pratica il pulsante talvolta sembra non avere effetto, il che è alquanto frustrante per l'utente.


Variante 3

Questa variante non implementa nuovi comportamenti ma elimina il problema della scarsa reattività al nuovo input sperimentato con il precedente sketch.

Sketch

int ledpin=12;

int buttonpin=8;

int buttonstatus;

int previous_buttonstatus=LOW;

int status = 0;

long TIMER1;

int lampeggiante;

#define SPENTO 0

#define ACCESO 1

int timer(long *t, long millisecondi)

{

    long x;

  

    x=millis();

    if (!*t){

        *t=x;

        return 0;

    }

    else if (x-*t > millisecondi) {

       *t=millis();

       return 1;

    }

    else

      return 0;      

}

void setup()

{

   pinMode(ledpin, OUTPUT);

   pinMode(buttonpin , INPUT);

   digitalWrite(ledpin, LOW);

}

void loop()

{

   buttonstatus = digitalRead(buttonpin);  // lettura stato bottone

   if (buttonstatus == HIGH && previous_buttonstatus == LOW) {      

                                           // pulsante premuto?

       status++;

       status = status%3;

       previous_buttonstatus = HIGH;

   }

   else if (buttonstatus == LOW) {      // pulsante rilasciato?    

       previous_buttonstatus = LOW;

   }

   if (status==0) {                     // stato led spento

       digitalWrite(ledpin, LOW);

   }

   else if (status == 1) {              // stato led acceso

       digitalWrite(ledpin, HIGH);

   }

   else if (status == 2) {              // stato led lampeggiante

       if (timer(&TIMER1, 100))         // sono trascorsi 100 ms?

       {

          if (lampeggiante == SPENTO){  // il led è spento?

              digitalWrite(ledpin, HIGH);

              lampeggiante=ACCESO;

          }

          else {                        // il led è acceso

              digitalWrite(ledpin, LOW);

              lampeggiante=SPENTO;

          }

       }

    }

}