Sito web di notizie tecnologiche e videogames.

Un pulsante per controllarli tutti

32

Vediamo come possiamo usare un solo pulsante per controllare 3 LED… faremo in modo che Arduino conti quante volte premeremo il pulsante e che agisca di conseguenza…

L’idea

Vogliamo fare in modo che il nostro sistema Arduino sia controllato da un pulsante e:

  • se premiamo una volta il pulsante si accenda il LED verde;
  • se premiamo due volte il pulsante si accenda il LED giallo;
  • se premiamo tre volte il pulsante si accenda il LED rosso;

Il circuito

Il circuito che useremo è riportato di seguito

Un pulsante per controllarli tutti

Per realizzare questo progetto sono necessari 3 LED, 3 resistori di 220Ω, 1 resistore da 10KΩ, 1 pulsante e cavi di connessione.

Per il circuito bisogna collegare il connettore GND della scheda Arduino alla riga blu della sezione di alimentazione della scheda 400 fori, il connettore 5V alla riga rossa della sezione di alimentazione della scheda 400 fori.

Posizionare i LED come riportato nell’immagine in figura e collegare:

  • al connettore 13 il LED verde con una resistenza da 220Ω;
  • al connettore 9 il LED giallo con una resistenza da 220Ω;
  • al connettore 3 il LED rosso con una resistenza da 220Ω;

Il passaggio successivo è posizionare il pulsante a cavallo della striscia di separazione tra le due sezioni della basetta 400 fori dove stiamo lavorando, proprio come in figura. Colleghiamo una parte del pulsante, i piedini che sono uno accanto all’altro, uno ai 5V e uno a GND con la resistenza da 10KΩ. Nella parte opposta colleghiamo il piedino disposto di fronte a quello collegato a GND al connettore 2 della scheda Arduino.

Perché 10KΩ?

Le specifiche di Arduino per la scheda prototipale Arduino UNO e Arduino Mega richiedono una resistenza di 10KΩ detta resistenza di pull-down. Questa resistenza serve a fare in modo che una volta premuto il pulsante questo non generi un corto circuito tra alimentazione e GND. In questo modo il livello alto, i 5V, vanno sul connettore usato come ingresso sulla scheda Arduino.

Lo sketch

Vediamo ora il codice che ci permetterà di pilotare i 3 LED con un solo pulsante.

/*
* Single Button
*
* Turns ON one LED for every pression on the button
*
* For every pression turn OFF the previous LED and turn ON the successive
*
*
*
* created 2018
* by MOSX
*
*/

// definition of input/output pins:
const int button = 2;
const int green = 13;
const int yellow = 9;
const int red = 3;

// variables:
int buttonCounter = 0;
int buttonState = 0;
int lastButtonState = 0;

void setup() {
// put your setup code here, to run once:
pinMode(button, INPUT);
pinMode(green, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(red, OUTPUT);
}

void loop() {
// put your main code here, to run repeatedly:
buttonState = digitalRead(button);

if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
buttonCounter++;
} else {
// do nothing
}
delay(50);
}

lastButtonState = buttonState;

if (buttonCounter == 1){
digitalWrite(green, HIGH);
digitalWrite(yellow,LOW);
digitalWrite(red,LOW);
}

if (buttonCounter == 2){
digitalWrite(green, LOW);
digitalWrite(yellow,HIGH);
digitalWrite(red,LOW);
}

if (buttonCounter == 3){
digitalWrite(green, LOW);
digitalWrite(yellow,LOW);
digitalWrite(red,HIGH);
buttonCounter = 0;
}
}

Analizziamolo pezzo per pezzo.

Variabili

// definition of input/output pins:
const int button = 2;
const int green = 13;
const int yellow = 9;
const int red = 3;

In queste righe di codice definiamo le variabili che sono legate ai connettori che abbiamo usato nei collegamenti durante la realizzazione del circuito. Si usa la parola chiave const per dire al compilatore che quel valore non potrà cambiare durante l’esecuzione ma rimarrà costante per sempre.

// variables:
int buttonCounter = 0;
int buttonState = 0;
int lastButtonState = 0;

Qui stiamo definendo le 3 variabili utili per l’esecuzione del nostro codice. In particolare in buttonCounter andremo a memorizzare il conteggio del numero di volte che è stato premuto il pulsante, in lastButtonState memorizzeremo lo stato passato del pulsante prima di quello attuale memorizzato in buttonState.

Setup

Il setup è simile a quello che si è usato nell’ Hello World.

void setup() {
// put your setup code here, to run once:
pinMode(button, INPUT);
pinMode(green, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(red, OUTPUT);
}

Qui abbiamo definito il connettore a cui è collegato il pulsante come piedino di input perché è da li che partirà l’evento scatenante per accendere i LED. Mentre i connettori dove sono collegati i LED sono definiti come output.

Il Loop

Vediamo ora la parte Loop del nostro codice, cioè la parte contente il codice che esegue l’idea che abbiamo spiegato ad inizio articolo.

Analizziamo i vari pezzi che compongono il Loop:

buttonState = digitalRead(button);

con questa riga di codice stiamo memorizzando all’interno della variabile buttonState lo stato che leggiamo sul connettore a cui è collegato il pulsante in ingresso.

if (buttonState != lastButtonState) {
if (buttonState == HIGH) {
buttonCounter++;
} else {
// do nothing
}
delay(50);
}

ora in questa sezione di codice memorizziamo quante volte è stato premuto il pulsante. In particolare partiamo verificando che lo stato attuale del pulsante sia diverso da quello precedente. Se lo stato attuale è ALTO allora memorizziamo il fatto che il pulsante è stato premuto aumentando di 1 il valore della variabile buttonCounter (buttonCounter++). Nella sezione ELSE, ossia la sezione dove si arriva se il pulsante ha stato BASSO, non si farà nulla. Infine si applicherà un ritardo di 50ms (delay(50)) prima del controllo successivo. Il ritardo è utile perché Arduino non creda che abbiamo premuto il pulsante più volte anche se in realtà noi lo abbiamo premuto una volta sola e tenuto premuto, in particolare i 50ms sono necessari per prendere il considerazione il tempo di apertura del pulsante sommato al tempo al tempo necessario a noi per non premere più il pulsante.

Memorizziamo l’ultimo stato del pulsante con: lastButtonState = buttonState;

Infine vediamo come scegliamo quali LED dovrà accendere la nostra scheda ad ogni pressione del tasto.

if (buttonCounter == 1){
digitalWrite(green, HIGH);
digitalWrite(yellow,LOW);
digitalWrite(red,LOW);
}

if (buttonCounter == 2){
digitalWrite(green, LOW);
digitalWrite(yellow,HIGH);
digitalWrite(red,LOW);
}

if (buttonCounter == 3){
digitalWrite(green, LOW);
digitalWrite(yellow,LOW);
digitalWrite(red,HIGH);
buttonCounter = 0;
}

In questo pezzo di codice controlliamo quante volte è stato premuto il pulsante, ossia poniamo una condizione su buttonCounter, e se è pari a

  • 1 attiviamo il LED verde
  • 2 attiviamo il LED giallo
  • 3 attiviamo il LED rosso

e per ogni caso spegniamo tutti gli altri LED.

Il codice di questo piccolo esempio è scaricabile qui.

Commenti