Arduino countdown con display LCD I2C e buzzer
Realizziamo un timer conto alla rovescia con Arduino: il tempo viene mostrato su LCD 16×2 e, quando arriva a zero, un buzzer segnala automaticamente la fine.
Introduzione
Un countdown Arduino è un ottimo progetto per imparare a gestire il tempo senza bloccare continuamente il microcontrollore. In questo esempio il timer parte da un valore impostato nel codice, diminuisce ogni secondo e visualizza il tempo rimanente sul display LCD.
Quando il conteggio raggiunge 00:00, Arduino mostra il messaggio di fine e fa lampeggiare acusticamente il buzzer.
- creare un conto alla rovescia con minuti e secondi;
- gestire intervalli temporali con millis();
- visualizzare il tempo su LCD 16×2 I2C;
- attivare un buzzer quando il timer termina;
- gestire lo stato di un’automazione senza usare delay() nel loop principale.
Materiale necessario
🧰 Non hai ancora i componenti?
Un kit Arduino per principianti contiene molti dei componenti di base utilizzati nei progetti del sito.
Vedi 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?
Nei miei libri dedicati ad Arduino trovi spiegazioni, schemi e numerosi progetti pratici pensati anche 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.Libreria necessaria
Per pilotare il display viene utilizzata la libreria LiquidCrystal_I2C, installabile dal Gestore librerie dell’IDE Arduino.
Schema di collegamento
📟 LCD I2C
- VCC → 5 V
- GND → GND
- SDA → A4
- SCL → A5
🔔 Buzzer attivo
- positivo (+) → pin 9
- negativo (−) → GND

Codice Arduino
La versione seguente migliora il codice originale: visualizza subito il valore iniziale, evita i delay(1000) usati per far suonare il buzzer e gestisce sia il countdown sia l’allarme con millis().
// ============================================
// Progetto 111 - Timer countdown con buzzer
// LCD I2C + allarme finale non bloccante
// ============================================
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int buzzer = 9;
// Imposta qui il tempo iniziale
const int minutiIniziali = 0;
const int secondiIniziali = 10;
int minuti = minutiIniziali;
int secondi = secondiIniziali;
unsigned long ultimoSecondo = 0;
unsigned long ultimoBeep = 0;
const unsigned long intervalloSecondo = 1000;
const unsigned long intervalloBeep = 500;
bool timerFinito = false;
bool buzzerAcceso = false;
void mostraTempo() {
lcd.setCursor(0, 1);
if (minuti < 10) {
lcd.print("0");
}
lcd.print(minuti);
lcd.print(":");
if (secondi < 10) {
lcd.print("0");
}
lcd.print(secondi);
lcd.print(" ");
}
void setup() {
pinMode(buzzer, OUTPUT);
digitalWrite(buzzer, LOW);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Countdown");
mostraTempo();
ultimoSecondo = millis();
}
void loop() {
unsigned long ora = millis();
// ---------------------------------
// COUNTDOWN
// ---------------------------------
if (!timerFinito) {
if (ora - ultimoSecondo >= intervalloSecondo) {
// Mantiene stabile la cadenza temporale
ultimoSecondo += intervalloSecondo;
if (secondi > 0) {
secondi--;
} else if (minuti > 0) {
minuti--;
secondi = 59;
} else {
timerFinito = true;
}
mostraTempo();
// Il timer è appena arrivato a 00:00
if (minuti == 0 && secondi == 0) {
timerFinito = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tempo scaduto!");
lcd.setCursor(0, 1);
lcd.print("ALLARME");
ultimoBeep = ora;
}
}
}
// ---------------------------------
// ALLARME NON BLOCCANTE
// ---------------------------------
if (timerFinito) {
if (ora - ultimoBeep >= intervalloBeep) {
ultimoBeep = ora;
buzzerAcceso = !buzzerAcceso;
digitalWrite(
buzzer,
buzzerAcceso ? HIGH : LOW
);
}
}
}Come funziona il countdown
Tempo iniziale
I valori minutiIniziali e secondiIniziali stabiliscono la durata del conto alla rovescia. Nell’esempio il timer parte da 10 secondi.
Aggiornamento ogni secondo
Arduino confronta il valore corrente di millis() con l’istante dell’ultimo aggiornamento. Quando è trascorso un secondo, decrementa il timer.
Passaggio tra minuti e secondi
Quando i secondi raggiungono zero e restano minuti disponibili, il programma diminuisce i minuti di uno e porta i secondi a 59.
Fine countdown
Quando minuti e secondi raggiungono 00:00, il timer viene dichiarato concluso e sul display compare il messaggio di allarme.
Buzzer
Il buzzer viene acceso e spento periodicamente tramite millis(), senza bloccare Arduino con lunghe chiamate a delay().
Perché evitare delay()?
Nel codice originale il buzzer veniva acceso per un secondo e spento per un altro secondo usando delay(). Durante quei due intervalli Arduino non poteva eseguire altre operazioni nel loop.
Con la gestione non bloccante diventa molto più semplice aggiungere in futuro pulsanti Start/Stop, Reset, sensori o altre funzioni.

