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.
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
🧰 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 consigliatoLink 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 ArduinoLink di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.
Schema di collegamento
schema del semaforo con pulsante di chiamata pedoni.
Pin utilizzati
| Elemento | Pin Arduino |
|---|---|
| Rosso auto | D12 |
| Giallo auto | D11 |
| Verde auto | D10 |
| Rosso pedoni | D9 |
| Verde pedoni | D8 |
| Pulsante chiamata | D2 |
Sequenza del semaforo
| Fase | Auto | Pedoni |
|---|---|---|
| Normale | Verde | Rosso |
| Preparazione stop | Giallo | Rosso |
| Stop traffico | Rosso | Rosso |
| Attraversamento | Rosso | Verde |
| Fine attraversamento | Rosso | Verde lampeggiante |
| Ripartenza | Giallo → Verde | Rosso |
Codice Arduino commentato
// ==========================================================
// 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.
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.
INPUT. Se passi a INPUT_PULLUP, modifica anche il cablaggio e la condizione nel codice.Video dimostrativo
Simulazione Tinkercad
▶️ Apri la simulazione TinkercadImmagini del progetto
Scarica lo sketch
⬇️ Scarica semaforo_con_chiamata_pedoni.inoDebug 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.

