Elettronica E Hardware

Interruttore ON OFF

Pulsante "Toggle" con LED (Acceso/Spento a Pressione Singola)

Arduino | Interruttore ON OFF
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.


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 int PIN_PULSANTE = 2;
const int PIN_LED = 13;

// Variabili di Stato Globali
int statoLed = LOW;             // Memorizza lo stato desiderato (HIGH/LOW)
int statoPulsantePrecedente = HIGH; // Lo stato precedente del pulsante (fondamentale)
    

La variabile

statoPulsantePrecedente
è la chiave: ci serve per capire se il pulsante è appena stato premuto, o se è ancora premuto da prima.


3 Lo Sketch Completo con Logica Toggle

Carica questo sketch. La parte più importante è il blocco

if
che esegue l'azione solo al momento del *click* (Edge Detection).

void setup() {
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_PULSANTE, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Pulsante Toggle pronto.");
}

void loop() {
  int statoPulsanteCorrente = 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 fisico
  digitalWrite(PIN_LED, statoLed);

  // 4. Aggiorna la variabile per il prossimo ciclo
  statoPulsantePrecedente = 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").