Progetto #111 • Timer e automazione

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.

Difficoltà★★☆☆☆ Facile
Tempo25–40 minuti
Concettimillis() • LCD • Buzzer

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.

Cosa imparerai
  • 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

Arduino UNO
Display LCD 16×2 I2C
Buzzer attivo
Breadboard
Cavi jumper

🧰 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.

Nota: il codice usa i metodi init() e backlight(). Verifica che la versione della libreria installata li supporti.

Schema di collegamento

📟 LCD I2C

  • VCC → 5 V
  • GND → GND
  • SDA → A4
  • SCL → A5

🔔 Buzzer attivo

  • positivo (+) → pin 9
  • negativo (−) → GND
Schema Arduino countdown con display LCD I2C e buzzer
Indirizzo I2C: l’esempio usa 0x27. Alcuni moduli LCD possono utilizzare un indirizzo differente.
Buzzer: questo collegamento è pensato per un piccolo buzzer attivo compatibile con il pilotaggio dal pin. Per carichi che richiedono più corrente va usato uno stadio di pilotaggio adeguato.

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 — Countdown LCD con buzzer
// ============================================
// 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

1

Tempo iniziale

I valori minutiIniziali e secondiIniziali stabiliscono la durata del conto alla rovescia. Nell’esempio il timer parte da 10 secondi.

2

Aggiornamento ogni secondo

Arduino confronta il valore corrente di millis() con l’istante dell’ultimo aggiornamento. Quando è trascorso un secondo, decrementa il timer.

3

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.

4

Fine countdown

Quando minuti e secondi raggiungono 00:00, il timer viene dichiarato concluso e sul display compare il messaggio di allarme.

5

Buzzer

Il buzzer viene acceso e spento periodicamente tramite millis(), senza bloccare Arduino con lunghe chiamate a delay().

Concetto chiave: usare millis() permette di gestire più attività contemporaneamente. Mentre Arduino controlla il tempo può continuare a leggere pulsanti, sensori o altri dispositivi.

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.

Varianti e miglioramenti

🔘 Impostazione del tempoAggiungi due pulsanti per aumentare minuti e secondi prima della partenza.
▶️ Start / StopAggiungi un pulsante per mettere in pausa e riprendere il countdown.
🔁 ResetPermetti di riportare rapidamente il timer al valore iniziale.
⏰ Ore:minuti:secondiEstendi il formato per realizzare countdown di lunga durata.