Verifica risolta su Arduino: pulsante che controlla due LED

Traccia del progetto da realizzare con Arduino

Realizzare un circuito con due led e un pulsante, che inizialmente abbia i due led entrambi spenti, e alla pressione del pulsante accenda il primo led, alla successiva pressione accenda il secondo led e spenga il primo, alla successiva li accenda entrambi e infine alla successiva li spenga entrambi. Il ciclo si ripeterà per le successive pressioni.

Il progetto è stato realmente assegnato agli studenti di un tecnico industriale della provincia di Lecce.

Soluzione proposta

Schema del circuito

Collega i due LED a dei pin digitali (in questo esempio, ho usato il pin 13 per il primo LED e il pin 12 per il secondo LED) e il pulsante a un altro pin digitale (ho usato il pin 2), inoltre il pulsante va alimentato. Assicurati di utilizzare le resistenze appropriate per limitare la corrente attraverso i LED.

Codice

const int buttonPin = 2;
const int led1Pin = 13;
const int led2Pin = 12;
int buttonState = 0;
int led1State = LOW;
int led2State = LOW;
int LastButtonState=0;
void setup() {
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
//leggo lo stato del bottone
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH && led1State == LOW && led2State == LOW) {
digitalWrite(led1Pin, HIGH);
led1State = HIGH;
delay(500);
}
else if (buttonState == HIGH && led1State == HIGH && led2State == LOW)
{
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, HIGH);
led1State = LOW;
led2State = HIGH;
delay(500);
}
else if (buttonState == HIGH && led1State == LOW && led2State == HIGH)
{
digitalWrite(led1Pin, HIGH);
digitalWrite(led2Pin, HIGH);
led1State = HIGH;
led2State = HIGH;
delay(500);
}
else if (buttonState == HIGH && led1State == HIGH && led2State == HIGH)
{
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
led1State = LOW;
led2State = LOW;
delay(500);
}
}

Soluzione per veri nerd

Eccoti una versione del codice più concisa che implementa lo stesso risultato finale:

const int buttonPin = 2;
const int led1Pin = 13;
const int led2Pin = 12;
int ledState = 0;
int lastButtonState = LOW;
void setup() {
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == HIGH && lastButtonState == LOW) {
ledState = (ledState + 1) % 4;
digitalWrite(led1Pin, ledState == 1 || ledState == 3);
digitalWrite(led2Pin, ledState == 2 || ledState == 3);
}
lastButtonState = buttonState;
}

Ecco lo stesso codice commentato:

const int buttonPin = 2; // Pin del pulsante
const int led1Pin = 13; // Pin del primo LED
const int led2Pin = 12; // Pin del secondo LED
int ledState = 0; // Variabile per tenere traccia dello stato dei LED
int lastButtonState = LOW; // Variabile per tenere traccia dello stato precedente del pulsante
void setup() {
pinMode(led1Pin, OUTPUT); // Imposta il pin del primo LED come OUTPUT
pinMode(led2Pin, OUTPUT); // Imposta il pin del secondo LED come OUTPUT
pinMode(buttonPin, INPUT); // Imposta il pin del pulsante come INPUT
}
void loop() {
int buttonState = digitalRead(buttonPin); // Legge lo stato attuale del pulsante
// Verifica se il pulsante è stato premuto (passaggio da LOW a HIGH)
if (buttonState == HIGH && lastButtonState == LOW) {
ledState = (ledState + 1) % 4; // Incrementa lo stato dei LED e riavvolgi a 0 dopo 3
// Controlla lo stato dei LED in base a ledState
digitalWrite(led1Pin, ledState == 1 || ledState == 3); // Accendi il primo LED se ledState è 1 o 3
digitalWrite(led2Pin, ledState == 2 || ledState == 3); // Accendi il secondo LED se ledState è 2 o 3
}
lastButtonState = buttonState; // Salva lo stato attuale del pulsante per il prossimo ciclo
}

Il secondo codice che che ho proposto può essere facilmente modificato in modo che il comportamento richiesto si abbia a seguito del rilascio del pulsante e non appena è pigiato.
Per far ciò basta modificare l’istruzione condizionale seguente:

if (buttonState == HIGH && lastButtonState == LOW)

con questa:

if (buttonState == LOW && lastButtonState == HIGH)

Ossia invece che modificare lo stato dei LED quando c’è il passaggio da “non pigiato” a “pigiato” lo si modifica quando passa da “pigiato” a “non pigiato”.

A cura del Dott. Ing. Prof. Eugenio Cuppone