🔋 Arduino • Batteria • 3 LED

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.

DifficoltàPrincipiante
IngressoA0
Indicazione3 LED
In poche parole: Arduino converte la tensione presente su A0 in un valore da 0 a 1023. Lo sketch confronta questa lettura con due soglie e accende il LED corrispondente allo stato della batteria.

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

🔌 Arduino Uno
🔋 2 batterie AA in serie
💡 1 LED verde
🟡 1 LED giallo
🔴 1 LED rosso
〰️ Resistenze per i LED
〰️ Resistenza da 10 kΩ
🧩 Breadboard e jumper

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

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 Arduino

Link di affiliazione Amazon: in qualità di Affiliato Amazon ricevo un guadagno dagli acquisti idonei, senza alcun costo aggiuntivo per te.

Schema del circuito

Schema Arduino controllo stato batteria con tre LED

Schema di collegamento per il controllo della batteria con Arduino e tre LED.

Simulazione Tinkercad

▶️ Apri la simulazione Tinkercad

Come funziona l’ingresso analogico

Arduino Uno utilizza un convertitore analogico-digitale a 10 bit, quindi analogRead() restituisce un valore compreso tra 0 e 1023:

TensioneValore ADC
0 V0
5 V1023

Da qui possiamo ricavare il valore digitale corrispondente a una tensione:

Formula utile: valore ADC ≈ (1023 / 5) × tensione.

Soglie di carica usate nel progetto

Per due batterie AA in serie possiamo usare questi intervalli indicativi:

TensioneStatoValore ADC indicativo
oltre 2,8 V fino a circa 3 VCarica> 573
2,2–2,8 VMedia450–572
sotto 2,2 VScarica< 450

Applicando la formula otteniamo circa 614 per 3 V, 573 per 2,8 V e 450 per 2,2 V.

Nota importante: queste soglie appartengono all’esempio con due pile AA in serie. Non sono valori universali per ogni batteria o chimica. Prima di riutilizzarli, definisci tensione nominale, tensione massima e soglia minima appropriate alla batteria che stai misurando.

Collegamenti dei LED

LEDPin Arduino
RossoD8
GialloD9
VerdeD10

Codice Arduino commentato

Controllo stato batteria – 3 LED
// ==========================================================
// 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.

Vantaggio: il codice diventa più leggibile e impedisce che più rami vengano valutati inutilmente nello stesso ciclo.

Convertire direttamente il valore ADC in volt

Per capire meglio cosa sta succedendo puoi trasformare la lettura in tensione:

Conversione ADC → volt
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

Molto importante: questo collegamento diretto è adatto soltanto a tensioni che restano entro il limite ammesso dall’ingresso analogico. Non collegare direttamente ad A0 una batteria con tensione superiore. Per misurare tensioni più alte serve un partitore resistivo correttamente dimensionato o un circuito di misura adatto.

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.

Esempio concettuale: il partitore deve garantire che, alla massima tensione prevista della batteria, il pin A0 resti sempre sotto il limite dell’ADC.

Risultato del progetto

Arduino controllo batteria carica scarica con LED

Esempio del circuito per il controllo dello stato della batteria.

Scarica lo sketch

⬇️ Scarica lo sketch Arduino

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

Idea di isteresi
// 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.