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.
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.
- 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
🧰 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 Ω
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
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 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
Arduino misura la tensione
Il partitore riduce la tensione e il pin A0 acquisisce il valore tramite l’ADC.
Il programma ricostruisce il valore reale
La tensione letta su A0 viene corretta usando il rapporto tra R1 e R2.
Confronto con le soglie
Arduino stabilisce se la tensione appartiene alla zona verde, gialla o rossa.
Viene acceso un solo LED
Tutti i LED vengono spenti e poi viene attivato soltanto quello corrispondente allo stato attuale.
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.

