389 1671634     [javascript protected email address]

Come usare e collegare un pulsante con Arduino

Condividi questo post:

Uno dei componenti più semplici in un circuito elettronico è il pulsante, su Arduino lo possiamo utilizzare praticamente per qualsiasi cosa ci passi per la testa, ma lo scopo finale è quello di far eseguire una porzione di codice a nostra scelta quando il pulsante viene premuto.

In questo articolo vediamo come utilizzarlo nella maniera più semplice e completa possibile.

Pulsante al positivo o al negativo

Un pulsante ha due fili: Uno dei due viene collegato alla tensione e l’altro viene collegato ad uno dei pin di arduino, pin che dovrà essere configurato come ingresso. Quando il pulsante viene premuto la tensione positiva (o negativa) viene portata verso il pin di ingresso.

I pin di Arduino, configurati come ingresso, non hanno di default uno stato specifico, si trovano infatti sempre in uno stato di “isteresi” dove il segnale non è né HIGH né LOW, ed è possibile quindi che arduino faccia confusione. Pertanto dobbiamo forzare il pin di ingresso ad essere di default HIGH oppure LOW, in modo che il pulsante possa invertire lo stato quando è premuto, scatenando una condizione scelta da noi.

Abbiamo quindi due possibilità, collegare il filo di partenza al positivo o al negativo. Qual’è la differenza?

A livello teorico nessuna, a livello pratico serve in entrambi i casi una resistenza collegata al pin di ingresso, da (1Kohm a 10Kohm) va benissimo.
Collegando la resistenza tra il pin e GND, avremo il pin sempre a livello LOW, mentre collegando la resistenza al positivo (5V) avremo sempre il pin a livello HIGH.

Arduino permette (solo nel secondo caso) di attivare una resistenza interna al microprocessore ATMEL, che mantiene il pin a livello HIGH, così potremmo utilizzare sempre pulsanti collegati al negativo senza dover mai usare resistenze esterne.

Collegheremo quindi il pulsante a GND, negativo, e risulterà premuto quando il pin di input passerà dal valore di default HIGH al livello LOW.


Per forzare quindi il pin di ingresso ad essere HIGH di default sfrutteremo il metodo “INPUT_PULLUP” che oltre a settare il pin come ingresso, attiva anche la resistenza interna, che mantiene il pin a livello HIGH. (La traduzione di PULL-UP infatti è “spingi verso l’alto”, la traduzione di HIGH è appunto “ALTO”).

void setup() {

//configuro il pin 2 come ingresso, attivando anche la resistenza di pullup
pinMode(2, INPUT_PULLUP);
}

void loop() {
//normalmente il pin 2 avrà valore HIGH

  //se il pin 2 assume valore LOW, allora significa che il pulsante è premuto
  if (digitalRead(2) == LOW) {
    //esegui il codice dentro a questa condizione (fino alla parentesi graffa di chiusura)
  } //chiudo if

} //chiudo loop

Il codice qui sopra funziona, ma è incompleto. La velocità di esecuzione del loop infatti è altissima pertanto premendo il pulsante un solo colpetto quella porzione di codice verrà eseguita svariate volte. Non diciamo al programma infatti di attendere che il pulsante venga rilasciato, o di eseguire il codice dopo qualche momento dalla pressione del pulsante.

Per renderci conto della velocità con cui il loop viene eseguito possiamo usare il seguente codice (ricordatevi di aprire il monitor seriale dopo aver caricato lo sketch su arduino).

void setup() {
//attivo la seriale a velocità 9600 baud
Serial.begin(9600);
//configuro il pin 2 come ingresso, attivando anche la resistenza di pullup
pinMode(2, INPUT_PULLUP);
}

void loop() {
//normalmente il pin 2 avrà valore HIGH

  //se il pin 2 assume valore LOW, allora significa che il pulsante è premuto
  if (digitalRead(2) == LOW) {
    Serial.println("Pulsante premuto");
  } //chiudo if

} //chiudo loop

Ora che ci siamo resi conto della velocità di esecuzione del codice di Arduino, possiamo ottimizzarlo in 3 modi per decidere come si dovrà comportare il programma quando premiamo il pulsante.

Metodo 1: pressione pulsante – attesa – esecuzione

void loop() {

  if (digitalRead(2) == LOW) {
    delay(2000); //attendo due secondi (2000 millisecondi)
    Serial.println("Pulsante premuto");
  }

} //chiudo loop

Metodo 2: pressione pulsante – esecuzione – attesa

void loop() {

  if (digitalRead(2) == LOW) {
    Serial.println("Pulsante premuto");
    delay(2000); //attendo due secondi (2000 millisecondi)
  }

} //chiudo loop

Come possiamo vedere i metodi 1 e 2 sono molto simili, il primo attende due secondi poi esegue il codice, il secondo esegue subito il codice e poi attende due secondi.
Funzionano per il semplice motivo che due secondi sono un tempo sufficiente per premere il pulsante e rilasciarlo, senza quindi scatenare due azioni ravvicinate.
E’ possibile capirlo, abbassando il valore 2000 con 200 o valori più bassi.

Metodo 3 (professionale): pressione pulsante – attesa infinita – esecuzione

void loop() {

  if (digitalRead(2) == LOW) {
    
    while (digitalRead(2) == LOW) {
      //mentre il pulsante rimane premuto non eseguire nulla
    }
    
    //il pulsante è stato rilasciato, attendo qualche millisecondo e proseguo con l'esecuzione
    delay(250);
    Serial.println("Pulsante premuto");
  } //chiudo if

} //chiudo loop

Nel metodo 3 viene aggiunto un ciclo WHILE che non esegue nulla al suo interno fintanto che il pulsante rimane premuto, praticamente crea un’attesa infinita, e solo al suo rilascio attende 250 millisecondi (1/4 secondo) e prosegue con il codice successivo.

Quando il progetto diventa complesso e si desidera rendere più stabile il funzionamento del nostro circuito inoltre è bene imparare a filtrare gli ingressi e le uscite di arduino.

Spero che gli esempi vi siano utili, se avete dubbi o domande commentate qui sotto ed eventualmente suggeriteci metodi alternativi!

Post che potrebbero interessarti

Vuoi risolvere un problema? Chiamaci al 389 1671634
o mandaci una mail a [javascript protected email address]

Ti risponderò personalmente per qualsiasi necessità o emergenza, anche tramite un messaggio Whatsapp! Invia una mail