LABORATORIO
Pulsante ON/OFF (Toggle)
In questo laboratorio imparerai a trasformare un semplice pulsante, che è un interruttore momentaneo, in un interruttore persistente di tipo ON/OFF (Toggle). Questa tecnica, che richiede la gestione dello Stato e del Rilevamento del Bordo, è fondamentale per qualsiasi interazione utente e come base per la logica Client/Server.
- Scheda Arduino (es. Uno)
- Breadboard
- 1x LED (qualsiasi colore)
- 1x Resistore da 220 Ω (per il LED)
- 1x Pulsante (a 4 piedini)
- Cavi Jumper
1 Assemblaggio del Circuito Ordinato
Utilizza lo schema di cablaggio più ordinato che sfrutta le linee di alimentazione ($\text{5V}$ e $\text{GND}$) della breadboard per ridurre gli intrecci. Ricorda di usare la configurazione **INPUT_PULLUP** per il pulsante.
- Collega il Pin 13 al LED (tramite resistenza) e poi a $\text{GND}$. (Output LED)
- Collega il Pin 2 a un lato del pulsante. L'altro lato del pulsante va a $\text{GND}$. (Input Pulsante)
- Assicurati che il tuo codice imposterà il Pin 2 con
.INPUT_PULLUP
In questa configurazione, il pulsante legge LOW quando premuto e HIGH quando rilasciato.
2 Dichiarazione delle Variabili di Stato
Il segreto di questo laboratorio è la logica. Dobbiamo introdurre tre variabili per memorizzare e confrontare gli stati nel tempo, cosa impossibile con il semplice ON/OFF del primo esercizio.
// Definizioni dei Pin const intPIN_PULSANTE = 2;const intPIN_LED = 13;// Variabili di Stato GlobaliintstatoLed = LOW;// Memorizza lo stato desiderato (HIGH/LOW)intstatoPulsantePrecedente = HIGH;// Lo stato precedente del pulsante (fondamentale)
La variabile è la chiave: ci serve per capire se il pulsante è appena stato premuto, o se è ancora premuto da prima.statoPulsantePrecedente
3 Lo Sketch Completo con Logica Toggle
Carica questo sketch. La parte più importante è il blocco che esegue l'azione solo al momento del *click* (Edge Detection).if
void setup() {pinMode(PIN_LED, OUTPUT);pinMode(PIN_PULSANTE, INPUT_PULLUP);Serial.begin(9600);Serial.println("Pulsante Toggle pronto.");}void loop() {intstatoPulsanteCorrente =digitalRead(PIN_PULSANTE);// CONDIZIONE CHIAVE: L'azione avviene solo quando il pulsante// passa da rilasciato (HIGH) a premuto (LOW).if(statoPulsanteCorrente == LOW && statoPulsantePrecedente == HIGH) {// 1. Esegue la commutazione (inverte lo stato)if(statoLed == LOW) {statoLed = HIGH;Serial.println("-> ACCESO");} else {statoLed = LOW;Serial.println("-> SPENTO");}// 2. Breve pausa per ignorare il rimbalzo del pulsante (debounce)delay(50);}// 3. Scrive lo stato memorizzato sul pin fisicodigitalWrite(PIN_LED, statoLed);// 4. Aggiorna la variabile per il prossimo ciclostatoPulsantePrecedente = statoPulsanteCorrente;delay(5);}
4 Analisi della Logica e Testing
Carica lo sketch e apri il Monitor Seriale. Prova a premere il pulsante e osserva il comportamento:
- Quando premi e rilasci velocemente, il LED commuta lo stato. Il messaggio appare una sola volta.
- Se tieni premuto il pulsante per un secondo, il LED non dovrebbe continuare ad accendersi/spegnersi, ma solo commutare una volta al momento iniziale della pressione.
Questo controllo sullo stato precedente è un'ottima base per capire come le tue future applicazioni Client/Server dovranno gestire le richieste (es. "Ho ricevuto la richiesta di accendere? Bene, non la eseguire di nuovo finché non ricevo l'ordine di spegnere").