Progetto #119 • Batteria + LED

Indicatore livello batteria Arduino con LED verde, giallo e rosso

Misuriamo la tensione di una batteria con Arduino e un partitore resistivo, trasformando il valore letto in un’indicazione immediata tramite tre LED colorati.

Difficoltà★★☆☆☆ Facile
Tempo25–40 minuti
ConcettiADC • Soglie • LED

Introduzione

In questo progetto trasformiamo Arduino in un semplice indicatore di stato batteria. La tensione viene misurata sul pin A0 tramite un partitore resistivo e confrontata con alcune soglie.

In base al valore rilevato, Arduino accende un solo LED: verde per tensione alta, giallo per tensione intermedia e rosso per tensione bassa.

Cosa imparerai
  • misurare una tensione con l’ingresso analogico di Arduino;
  • utilizzare un partitore resistivo;
  • convertire il valore ADC in volt;
  • gestire più soglie con if / else if / else;
  • visualizzare rapidamente uno stato tramite LED.

Materiale necessario

1× Arduino UNO
1× LED verde
1× LED giallo
1× LED rosso
3× resistenze 220 Ω
2× resistenze 10 kΩ
1× batteria da monitorare
Breadboard + jumper

🧰 Non hai ancora i componenti?

Un kit Arduino per principianti contiene molti dei componenti 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 trovi spiegazioni, schemi e numerosi progetti pratici dedicati ad Arduino.

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

🔋 Partitore di tensione

  • positivo batteria → R1 10 kΩ
  • R1 → punto di misura → A0
  • punto di misura → R2 10 kΩ → GND
  • negativo batteria → GND Arduino

🟢 LED verde

  • anodo → pin 2
  • catodo → GND tramite 220 Ω

🟡 LED giallo

  • anodo → pin 3
  • catodo → GND tramite 220 Ω

🔴 LED rosso

  • anodo → pin 4
  • catodo → GND tramite 220 Ω
Schema indicatore batteria Arduino con partitore di tensione e LED verde giallo rosso
Partitore 1:1: con due resistenze uguali da 10 kΩ, la tensione presente su A0 è circa la metà della tensione della batteria.
Attenzione: con un partitore 10 kΩ + 10 kΩ e riferimento ADC di circa 5 V, la tensione teorica massima misurabile è circa 10 V. Non collegare sorgenti che possano superare i limiti dell’ingresso analogico.

Le soglie della batteria

Nel codice useremo come esempio:

🟢 Tensione alta

oltre 7,0 V

🟡 Tensione media

da oltre 6,5 V fino a 7,0 V

🔴 Tensione bassa

6,5 V o meno

Importante: queste soglie sono soltanto un esempio. Devono essere adattate al tipo di batteria utilizzato. Una batteria Li-ion, una NiMH, una piombo-acido o una comune batteria da 9 V hanno curve di scarica e tensioni completamente diverse.

Codice Arduino

La versione migliorata esegue una media di più letture ADC, utilizza la formula generale del partitore e introduce una piccola isteresi tra le soglie, così i LED non cambiano continuamente quando la tensione oscilla vicino al limite.

Progetto #119 — Indicatore batteria a 3 LED
// ============================================
// Progetto 119 - Indicatore batteria a LED
// Misura tensione e mostra 3 livelli
// ============================================

const byte pinBatteria = A0;

const byte ledVerde  = 2;
const byte ledGiallo = 3;
const byte ledRosso  = 4;

// Partitore 10k + 10k
const float R1 = 10000.0;
const float R2 = 10000.0;

// Valore nominale del riferimento ADC
const float VREF = 5.00;

// Soglie di esempio
const float sogliaVerde = 7.0;
const float sogliaRosso = 6.5;

// Evita continui cambi di stato vicino alle soglie
const float isteresi = 0.05;

enum StatoBatteria {
  BATTERIA_ROSSA,
  BATTERIA_GIALLA,
  BATTERIA_VERDE
};

StatoBatteria stato = BATTERIA_GIALLA;

float leggiTensione() {

  unsigned long somma = 0;

  const byte campioni = 10;

  for (byte i = 0; i < campioni; i++) {
    somma += analogRead(pinBatteria);
    delay(5);
  }

  float adcMedio = somma / (float)campioni;

  float tensioneA0 =
      adcMedio * (VREF / 1023.0);

  float tensioneBatteria =
      tensioneA0 * ((R1 + R2) / R2);

  return tensioneBatteria;
}

void aggiornaStato(float tensione) {

  // Passaggio verso il verde
  if (stato != BATTERIA_VERDE &&
      tensione >= sogliaVerde + isteresi) {

    stato = BATTERIA_VERDE;
  }

  // Uscita dal verde
  if (stato == BATTERIA_VERDE &&
      tensione < sogliaVerde - isteresi) {

    stato = BATTERIA_GIALLA;
  }

  // Passaggio verso il rosso
  if (stato != BATTERIA_ROSSA &&
      tensione <= sogliaRosso - isteresi) {

    stato = BATTERIA_ROSSA;
  }

  // Uscita dal rosso
  if (stato == BATTERIA_ROSSA &&
      tensione > sogliaRosso + isteresi) {

    stato = BATTERIA_GIALLA;
  }
}

void mostraStato() {

  digitalWrite(ledVerde, LOW);
  digitalWrite(ledGiallo, LOW);
  digitalWrite(ledRosso, LOW);

  if (stato == BATTERIA_VERDE) {
    digitalWrite(ledVerde, HIGH);
  }

  else if (stato == BATTERIA_GIALLA) {
    digitalWrite(ledGiallo, HIGH);
  }

  else {
    digitalWrite(ledRosso, HIGH);
  }
}

void setup() {

  pinMode(ledVerde, OUTPUT);
  pinMode(ledGiallo, OUTPUT);
  pinMode(ledRosso, OUTPUT);

  Serial.begin(9600);
}

void loop() {

  float tensione = leggiTensione();

  aggiornaStato(tensione);
  mostraStato();

  Serial.print("Tensione batteria: ");
  Serial.print(tensione, 2);
  Serial.println(" V");

  delay(250);
}

Come funziona

1

Arduino misura la tensione

Il partitore riduce la tensione e il pin A0 acquisisce il valore tramite l’ADC.

2

Il programma ricostruisce il valore reale

La tensione letta su A0 viene corretta usando il rapporto tra R1 e R2.

3

Confronto con le soglie

Arduino stabilisce se la tensione appartiene alla zona verde, gialla o rossa.

4

Viene acceso un solo LED

Tutti i LED vengono spenti e poi viene attivato soltanto quello corrispondente allo stato attuale.

5

L’isteresi stabilizza l’indicazione

Una piccola differenza tra ingresso e uscita dalle soglie evita lampeggi o continui cambi di colore vicino ai valori limite.

Tensione e percentuale di carica non sono la stessa cosa

È importante non interpretare automaticamente il LED verde come “100%” o il rosso come “0%”. Il rapporto tra tensione e stato di carica dipende dalla chimica della batteria, dal numero di celle, dal carico applicato e dalle condizioni di misura.

Esempio: le soglie adatte a un pacco Li-ion 2S non sono appropriate per una batteria al piombo da 12 V o per una NiMH. Prima di usare l’indicatore bisogna quindi scegliere soglie coerenti con la batteria specifica.

Varianti possibili

📟 Display LCD

Mostra anche la tensione numerica oltre allo stato a LED.

🔔 Allarme batteria bassa

Attiva un buzzer quando la tensione scende sotto la soglia critica.

📊 Barra LED

Usa 5 o 10 LED per ottenere un indicatore più dettagliato.

📡 ESP32

Invia tensione e stato batteria tramite Wi-Fi o Bluetooth.