🚦 Arduino • Semaforo • Chiamata pedoni

Semaforo con Arduino e pulsante chiamata pedoni

Partiamo dal classico semaforo Arduino e aggiungiamo un pulsante per la richiesta di attraversamento pedonale, con LED dedicati per rosso e verde pedoni.

DifficoltàPrincipiante / Intermedia
IngressiPulsante su D2
Uscite5 LED
In poche parole: quando il pedone preme il pulsante, Arduino attende il tempo minimo previsto, porta il traffico automobilistico al rosso, abilita il verde pedonale per alcuni secondi e poi ripristina la normale circolazione.

Cosa imparerai

  • come gestire una chiamata tramite pulsante;
  • come coordinare due gruppi di LED;
  • come usare millis() per impedire richieste troppo ravvicinate;
  • come creare una funzione dedicata alla sequenza del semaforo;
  • come far lampeggiare il verde pedonale prima dello stop;
  • come migliorare lo sketch con INPUT_PULLUP e macchina a stati.

Come funziona il progetto

Questo progetto è l’evoluzione del precedente semaforo Arduino: aggiunge un pulsante di chiamata e due LED dedicati ai pedoni, uno rosso e uno verde.

Materiale necessario

🔌 Arduino Uno
🚦 LED per semaforo auto
🚶 LED rosso e verde pedoni
🔘 Pulsante
〰️ Resistenze da 220 Ω
〰️ Resistenza da 10 kΩ
🧩 Breadboard
🔗 Cavetti jumper

🧰 Kit Arduino consigliato

Molti progetti del sito utilizzano LED, pulsanti, resistenze e breadboard. Un kit completo può essere comodo per iniziare.

👉 Guarda il kit Arduino consigliato

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

📘 Vuoi imparare Arduino passo dopo passo?

Se vuoi approfondire e realizzare progetti più completi, puoi dare un’occhiata anche ai miei libri dedicati ad Arduino. All’interno troverai spiegazioni semplici, schemi chiari e molti progetti pratici pensati per chi parte da zero.

👉 Scopri i miei libri su Arduino

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

Schema di collegamento

Schema Arduino semaforo con chiamata pedoni

schema del semaforo con pulsante di chiamata pedoni.

Pin utilizzati

ElementoPin Arduino
Rosso autoD12
Giallo autoD11
Verde autoD10
Rosso pedoniD9
Verde pedoniD8
Pulsante chiamataD2

Sequenza del semaforo

FaseAutoPedoni
NormaleVerdeRosso
Preparazione stopGialloRosso
Stop trafficoRossoRosso
AttraversamentoRossoVerde
Fine attraversamentoRossoVerde lampeggiante
RipartenzaGiallo → VerdeRosso

Codice Arduino commentato

Semaforo con pulsante pedoni
// ==========================================================
// SEMAFORO CON CHIAMATA PEDONI
// ==========================================================

// LED del semaforo auto
const int carRed = 12;
const int carYellow = 11;
const int carGreen = 10;

// LED del semaforo pedoni
const int pedRed = 9;
const int pedGreen = 8;

// Pulsante di chiamata
const int button = 2;

// Tempo concesso ai pedoni per attraversare
const unsigned long crossTime = 5000;

// Memorizza il momento dell'ultima sequenza
unsigned long changeTime = 0;

void setup() {

 pinMode(carRed, OUTPUT);
 pinMode(carYellow, OUTPUT);
 pinMode(carGreen, OUTPUT);

 pinMode(pedRed, OUTPUT);
 pinMode(pedGreen, OUTPUT);

 // Manteniamo la logica del progetto:
 // pulsante con resistenza esterna da 10 kΩ
 pinMode(button, INPUT);

 // Stato iniziale:
 // auto verde, pedoni rossi
 digitalWrite(carGreen, HIGH);
 digitalWrite(pedRed, HIGH);
}

void loop() {

 // Legge lo stato del pulsante
 int state = digitalRead(button);

 // Accetta la richiesta solo se sono passati
 // almeno 5 secondi dall'ultima sequenza
 if (state == HIGH && (millis() - changeTime) > 5000) {
 changeLights();
 }
}

void changeLights() {

 // 1. Spegne il verde auto
 // e accende il giallo
 digitalWrite(carGreen, LOW);
 digitalWrite(carYellow, HIGH);
 delay(2000);

 // 2. Porta le auto al rosso
 digitalWrite(carYellow, LOW);
 digitalWrite(carRed, HIGH);

 // Breve intervallo di sicurezza
 delay(1000);

 // 3. Abilita il verde pedonale
 digitalWrite(pedRed, LOW);
 digitalWrite(pedGreen, HIGH);

 delay(crossTime);

 // 4. Fa lampeggiare il verde pedoni
 // per segnalare la fine dell'attraversamento
 for (int x = 0; x < 10; x++) {

 digitalWrite(pedGreen, HIGH);
 delay(250);

 digitalWrite(pedGreen, LOW);
 delay(250);
 }

 // 5. Pedoni di nuovo al rosso
 digitalWrite(pedRed, HIGH);
 delay(500);

 // 6. Prepara la ripartenza delle auto
 digitalWrite(carYellow, HIGH);
 digitalWrite(carRed, LOW);
 delay(1000);

 // 7. Ripristina il verde auto
 digitalWrite(carGreen, HIGH);
 digitalWrite(carYellow, LOW);

 // Memorizza il momento della modifica
 changeTime = millis();
}

Perché usare millis()

Nel ciclo principale lo sketch controlla che siano trascorsi almeno 5 secondi dall’ultima sequenza prima di accettare una nuova richiesta. In questo modo una pressione ripetuta del pulsante non riavvia immediatamente il ciclo pedonale.

Concetto chiave: millis() è usato qui come filtro temporale tra due richieste, mentre la sequenza vera e propria usa ancora delay().

Come migliorare ulteriormente il progetto

Per un progetto didattico questo approccio funziona bene, ma una versione più avanzata potrebbe evitare completamente i delay() e usare una macchina a stati basata su millis(). In questo modo Arduino continuerebbe a leggere pulsanti e sensori anche durante le transizioni.

INPUT oppure INPUT_PULLUP?

Lo sketch utilizza INPUT e una resistenza esterna da 10 kΩ. Una versione moderna può semplificare il cablaggio usando INPUT_PULLUP, collegando il pulsante tra il pin e GND. In quel caso la logica si inverte: pulsante premuto = LOW.

Non mischiare le due configurazioni: se mantieni lo schema con resistenza esterna, lascia INPUT. Se passi a INPUT_PULLUP, modifica anche il cablaggio e la condizione nel codice.

Video dimostrativo

Simulazione Tinkercad

▶️ Apri la simulazione Tinkercad

Immagini del progetto

Semaforo Arduino con chiamata pedoni
Progetto semaforo pedonale Arduino

Scarica lo sketch

⬇️ Scarica semaforo_con_chiamata_pedoni.ino

Debug rapido

  • controlla la polarità di tutti i LED;
  • verifica le resistenze in serie ai LED;
  • controlla il pulsante e la resistenza da 10 kΩ;
  • verifica che il pin 2 cambi realmente stato quando premi il pulsante;
  • se la chiamata non parte subito, ricorda il blocco minimo di 5 secondi;
  • se un LED resta acceso nella fase sbagliata, ricontrolla i pin 8–12.

Varianti del progetto

  • aggiungere un buzzer per segnalazione acustica pedonale;
  • usare INPUT_PULLUP per semplificare il pulsante;
  • aggiungere un display con conto alla rovescia;
  • eliminare tutti i delay usando millis();
  • aggiungere un secondo pulsante pedonale;
  • realizzare un incrocio completo con più direzioni.

Cosa devi ricordare

  • Il pulsante pedoni è collegato al pin D2.
  • Le auto usano i pin D10, D11 e D12.
  • I pedoni usano D8 e D9.
  • La funzione changeLights() contiene tutta la sequenza.
  • millis() impedisce richieste troppo ravvicinate.
  • Il lampeggio finale avvisa che il tempo di attraversamento sta terminando.

Domande frequenti

Perché il pulsante non funziona subito dopo l’avvio?

Lo sketch richiede che siano trascorsi almeno 5 secondi prima di accettare una nuova chiamata.

Posso usare INPUT_PULLUP?

Sì. Devi però collegare il pulsante a GND e invertire la logica, considerando LOW come pulsante premuto.

Posso eliminare i delay?

Sì. Una macchina a stati basata su millis() rende il progetto più reattivo e permette di gestire altre funzioni contemporaneamente.

Posso aggiungere un buzzer per non vedenti?

Sì, come esercizio didattico puoi aggiungere una segnalazione sonora sincronizzata con il verde pedonale, usando frequenze e tempi appropriati.