Controllo stato batteria con Arduino e 3 LED
Misuriamo una batteria con l’ingresso analogico A0 e indichiamo il livello di tensione con tre LED: verde per carica, giallo per livello intermedio e rosso per batteria scarica.
Cosa imparerai
- come leggere una tensione analogica con Arduino;
- come funziona la conversione ADC a 10 bit;
- come trasformare volt in valori 0–1023;
- come definire soglie di batteria carica, media e scarica;
- come pilotare tre LED in base alla lettura;
- perché non bisogna superare la tensione ammessa dall’ingresso analogico.
Come funziona il progetto
In questo esempio utilizziamo due batterie AA in serie, per una tensione nominale di circa 3 V. Arduino misura la tensione sul pin A0 e accende uno dei tre LED per indicare lo stato: verde quando la batteria è carica, giallo quando è a un livello intermedio e rosso quando è scarica.
Materiale necessario
🧰 Kit Arduino consigliato
Molti progetti del sito utilizzano LED, resistenze, breadboard e cavetti. 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 del circuito
Schema di collegamento per il controllo della batteria con Arduino e tre LED.
Simulazione Tinkercad
▶️ Apri la simulazione TinkercadCome funziona l’ingresso analogico
Arduino Uno utilizza un convertitore analogico-digitale a 10 bit, quindi analogRead() restituisce un valore compreso tra 0 e 1023:
| Tensione | Valore ADC |
|---|---|
| 0 V | 0 |
| 5 V | 1023 |
Da qui possiamo ricavare il valore digitale corrispondente a una tensione:
Soglie di carica usate nel progetto
Per due batterie AA in serie possiamo usare questi intervalli indicativi:
| Tensione | Stato | Valore ADC indicativo |
|---|---|---|
| oltre 2,8 V fino a circa 3 V | Carica | > 573 |
| 2,2–2,8 V | Media | 450–572 |
| sotto 2,2 V | Scarica | < 450 |
Applicando la formula otteniamo circa 614 per 3 V, 573 per 2,8 V e 450 per 2,2 V.
Collegamenti dei LED
| LED | Pin Arduino |
|---|---|
| Rosso | D8 |
| Giallo | D9 |
| Verde | D10 |
Codice Arduino commentato
// ==========================================================
// CONTROLLO STATO BATTERIA CON ARDUINO
// Lettura su A0 + LED rosso, giallo e verde
// ==========================================================
// Ingresso analogico della batteria
const int batteriaPin = A0;
// LED di stato
const int ledRosso = 8;
const int ledGiallo = 9;
const int ledVerde = 10;
// Soglie usate nel progetto:
// 573 ≈ 2,8 V
// 450 ≈ 2,2 V
const int sogliaCarica = 573;
const int sogliaScarica = 450;
// Valore letto dal convertitore analogico-digitale
int valoreBatteria = 0;
void setup() {
// Configura i tre LED come uscite
pinMode(ledRosso, OUTPUT);
pinMode(ledGiallo, OUTPUT);
pinMode(ledVerde, OUTPUT);
// Stato iniziale: tutti spenti
digitalWrite(ledRosso, LOW);
digitalWrite(ledGiallo, LOW);
digitalWrite(ledVerde, LOW);
// Monitor Seriale utile per calibrazione e debug
Serial.begin(9600);
}
void loop() {
// Legge A0: il risultato va da 0 a 1023
valoreBatteria = analogRead(batteriaPin);
// Mostra il valore grezzo sul Monitor Seriale
Serial.print("ADC batteria: ");
Serial.println(valoreBatteria);
// --------------------------------------------------------
// BATTERIA CARICA
// Sopra 573, corrispondente a circa 2,8 V
// in questo esempio.
// --------------------------------------------------------
if (valoreBatteria > sogliaCarica) {
digitalWrite(ledRosso, LOW);
digitalWrite(ledGiallo, LOW);
digitalWrite(ledVerde, HIGH);
}
// --------------------------------------------------------
// BATTERIA A LIVELLO INTERMEDIO
// Da 450 a 573 inclusi.
// --------------------------------------------------------
else if (valoreBatteria >= sogliaScarica) {
digitalWrite(ledRosso, LOW);
digitalWrite(ledGiallo, HIGH);
digitalWrite(ledVerde, LOW);
}
// --------------------------------------------------------
// BATTERIA SCARICA
// Sotto 450, circa 2,2 V in questo esempio.
// --------------------------------------------------------
else {
digitalWrite(ledRosso, HIGH);
digitalWrite(ledGiallo, LOW);
digitalWrite(ledVerde, LOW);
}
// Aggiornamento circa due volte al secondo
delay(500);
}
Perché uso else if invece di tre if?
Per gestire i tre stati usiamo if / else if / else: le condizioni sono mutuamente esclusive e in ogni momento resta acceso un solo LED.
Convertire direttamente il valore ADC in volt
Per capire meglio cosa sta succedendo puoi trasformare la lettura in tensione:
int valore = analogRead(A0);
float tensione = valore * (5.0 / 1023.0);
Serial.print("Tensione: ");
Serial.print(tensione, 2);
Serial.println(" V");
Questa formula assume una tensione di riferimento pari a 5,0 V. In una misura reale, la precisione dipende anche dal riferimento analogico e dalla tensione effettiva di alimentazione.
La resistenza da 10 kΩ
La resistenza da 10 kΩ mantiene stabile l’ingresso analogico quando la batteria viene scollegata, evitando che A0 resti flottante e produca letture casuali.
Il suo ruolo pratico è fornire un percorso verso massa quando la sorgente viene rimossa, così l’ingresso A0 non resta flottante.
Attenzione alla tensione massima su A0
Con Arduino Uno, in questa configurazione, la tensione applicata ad A0 non deve superare il riferimento analogico usato dal circuito.
Misurare batterie sopra 5 V
Per esempio, se devi misurare una batteria da 9 V o 12 V, non basta cambiare le soglie nel codice: devi prima ridurre la tensione tramite un partitore resistivo e poi ricostruire matematicamente il valore reale.
Risultato del progetto
Esempio del circuito per il controllo dello stato della batteria.
Scarica lo sketch
⬇️ Scarica lo sketch ArduinoDebug rapido
- verifica che la batteria sia collegata ad A0 con massa comune;
- controlla i LED sui pin D8, D9 e D10;
- verifica la polarità dei LED e le relative resistenze;
- usa il Monitor Seriale per osservare il valore ADC reale;
- se il LED cambia continuamente vicino alla soglia, aggiungi isteresi o media delle letture;
- se leggi 0 con batteria collegata, controlla cablaggio e GND;
- non superare la tensione ammessa dall’ingresso analogico.
Variante con isteresi
Se la tensione oscilla vicino a una soglia, il colore può cambiare rapidamente avanti e indietro. Una piccola isteresi evita questo effetto.
// Esempio:
// passa al verde sopra 580,
// ma torna al giallo solo sotto 565.
const int sogliaVerdeOn = 580;
const int sogliaVerdeOff = 565;
Varianti del progetto
- mostrare la tensione su LCD o OLED;
- aggiungere un buzzer quando la batteria è scarica;
- visualizzare una percentuale indicativa;
- mediare più letture per ridurre il rumore;
- aggiungere isteresi tra le soglie;
- usare un partitore per batterie con tensione maggiore;
- registrare l’andamento della tensione nel tempo.
Cosa devi ricordare
- La batteria viene letta sul pin A0.
- Arduino restituisce un valore ADC da 0 a 1023.
- Con riferimento a 5 V, 2,8 V corrispondono a circa 573 e 2,2 V a circa 450.
- LED rosso D8, giallo D9, verde D10.
- Le soglie dipendono dal tipo di batteria e vanno adattate.
- Non bisogna applicare direttamente ad A0 tensioni superiori al limite ammesso.
Domande frequenti
Perché 2,8 V corrispondono a circa 573?
Perché il progetto usa una conversione a 10 bit: circa (1023 / 5) × 2,8, che dà circa 573.
Posso usare una batteria da 9 V?
Non direttamente su A0. Devi prima ridurre la tensione con un partitore resistivo o un circuito di misura adatto e poi modificare i calcoli nel software.
Perché il LED cambia colore continuamente vicino alla soglia?
La tensione può oscillare leggermente. Una media delle letture o una piccola isteresi rende il comportamento più stabile.
Posso trasformare il valore in percentuale?
Sì, ma una percentuale attendibile richiede una curva coerente con la chimica e il tipo di batteria. Una semplice mappatura lineare è solo indicativa.

