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