Come misurare una tensione elettrica in corrente continua con Arduino Uno (voltometro)
Introduzione
Un partitore di tensione è un circuito elettrico composto da due o più resistenze collegate in serie.
La tensione di uscita del partitore di tensione è determinata dalla relazione tra i valori dei resistori.
Analizziamo un esempio con solo due resistori, per chiarire la precedente affermazione.
La tensione di uscita, Vout, è data dalla seguente relazione:
Ad esempio, se i due resistori hanno lo stesso valore, allora la tensione di uscita è la metà della tensione di ingresso.
Quando si lavora con dei microcontrollori, è importante tenere presente che questi dispositivi sono progettati per funzionare a bassa tensione (solitamente 3,3V o 5V), pertanto una tensione di 12V è troppo alta per essere letta direttamente dal microcontrollore.
Per risolvere questo problema, si utilizza proprio un partitore di tensione.
Il partitore di tensione è utilizzato per abbassare la tensione di 12V a un valore e compatibile con il microcontrollore (ad esempio 3.3V o 5V), altrimenti si rischierebbero dei danni irreparabile al dispositivo.
Inoltre, il partitore di tensione è un’opzione economica e relativamente semplice per abbassare la tensione di ingresso, rispetto ad altri circuiti di riduzione di tensione più complessi e costosi.
Un partitore di tensione costituito dalla coppia di resistori 1 kΩ e 2 kΩ riduce la tensione di ingresso di un terzo, così come la coppia di resistori 10 kΩ e 20 kΩ.
La differenza principale tra le due coppie di resistori è la potenza dissipata.
Il partitore di tensione costituito dalla coppia di resistori 1 kΩ e 2 kΩ ha una resistenza totale di 3 kΩ (1 kΩ + 2 kΩ) e fornisce una tensione di uscita pari a un terzo della tensione di ingresso.
Questa configurazione assorbe una corrente di 4 mA quando è applicata una tensione di ingresso di 12V.
Il partitore di tensione formato dalla coppia di resistori 10 kΩ e 20 kΩ ha una resistenza totale di 30 kΩ (10 kΩ + 20 kΩ) anche in questo caso fornisce una tensione di uscita pari a un terzo della tensione di ingresso, ma in questo caso la corrente richiesta è inferiore, 0,4 mA, e quindi viene dissipata meno potenza rispetto alla coppia di resistori da 1 kΩ e 2 kΩ.
In sintesi, entrambi i partitori di tensione funzionano bene per abbassare la tensione di ingresso, ma la coppia di resistori da 10 kΩ e 20 kΩ è più efficiente in termini di potenza dissipata e corrente richiesta, rendendola una scelta migliore quando è importante limitare il consumo di energia.
Per calcolare la potenza dissipata nei resistori di un partitore di tensione, è necessario utilizzare la legge di Joule, che stabilisce che la potenza (P) dissipata da un resistore (R) attraversata da una corrente (I) è data dall’equazione:
Considerando una tensione di ingresso di 5V, il partitore di tensione costituito dalla coppia di resistori da 1 kΩ e 2 kΩ verrà attraversata da una corrente di 1,6 mA (5V / 3 kΩ).
Applicando l’equazione di Joule ai due resistori, la potenza dissipata dal resistore da 1 kΩ sarà:
La potenza dissipata dal resistore da 2 kΩ sarà invece:
La potenza totale dissipata dal partitore di tensione sarà quindi la somma delle due potenze:
l microcontrollore di Arduino Uno integra diversi convertitori analogico-digitale (ADC) a 10 bit.
L’ADC converte una tensione di ingresso compresa tra 0 e 5 V in un valore digitale compreso tra 0 e 1023, ovvero:
Il valore di 5 V rappresenta la tensione di riferimento dell’ADC.
Ciò significa che la tensione di ingresso massima che può essere letta dall’ADC è di 5 V e la risoluzione di conversione è di circa 4,88 mV (5 V / 1023) .
Applicazione
In questo progetto realizzeremo un voltometro, che può misurare una tensione massima di 12V in corrente continua.
Come descritto in precedenza per garantire una tensione massima di 5V in ingresso ad Arduino Uno e per misurare una tensione massima di 12V dobbiamo utilizzare un partitore di tensione.
Senza ripetere i calcoli esposti nel paragrafo precedente il partitore resistivo deve avere i seguenti valori:
R1 = 10kΩ e R2 = 6,2kΩ
Codice
#include <Adafruit_SSD1306.h> // libreria Adafruit per il display SSD1306 int width = 128; // dimensioni del display OLED che stiamo usando int height = 32; // Adafruit_SSD1306 oled(width, height, &Wire, -1); int ADCpin = A0; // definiamo il pin d'ingresso per la lettura della tensione float maxVolt = 12.0; // La massima tensione che possiamo leggere float voltage; int battery; void setup() { oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); oled.clearDisplay(); oled.setTextColor(WHITE); oled.setTextSize(2); oled.display(); } void loop() { // calcolo della tensione voltage = analogRead(ADCpin)*maxVolt/1023.0; oled.clearDisplay(); oled.setCursor(0,0); oled.print(voltage); oled.print("V"); oled.fillRect(0, 20, 45, 12, WHITE); battery = 32*voltage/maxVolt; battery = constrain(battery, 0, 41); oled.fillRect(2+battery, 22, 41-battery, 8, BLACK); // empty battery section oled.fillRect(45, 23, 3, 6, WHITE); oled.display(); delay(2000); // delay 2s ogni lettura }
#include <Adafruit_SSD1306.h>
Questa riga di codice include la libreria “Adafruit_SSD1306.h”, che è una libreria per il display OLED SSD1306 prodotto da Adafruit. La libreria fornisce una serie di funzioni che semplificano l’utilizzo del display OLED, come ad esempio la scrittura di testo, la visualizzazione di immagini e la gestione della luminosità del display.
int width = 128; int height = 32;
Queste due righe di codice definiscono le dimensioni del display OLED. In particolare, “width” indica la larghezza del display in pixel, mentre “height” indica l’altezza del display in pixel.
Nel codice sorgente, queste variabili sono utilizzate per configurare il display OLED.
Adafruit_SSD1306 oled(width, height, &Wire, -1);
Questa riga di codice crea un oggetto “oled” della classe “Adafruit_SSD1306”, che rappresenta il display OLED collegato ad Arduino.
Il costruttore della classe “Adafruit_SSD1306” richiede quattro parametri: “width” e “height” che indicano le dimensioni del display, “&Wire” che indica l’interfaccia I2C utilizzata per comunicare con il display e “-1” che indica il pin di reset del display (se necessario).
Quindi, il codice crea un oggetto “oled” con le dimensioni specificate (128×32 pixel), utilizzando l’interfaccia I2C “Wire” e non specificando un pin di reset per il display.
oled.begin(SSD1306_SWITCH CAPVCC, 0x3C);
“begin()” è una funzione della classe “Adafruit_SSD1306” che inizializza il display OLED e lo configura con i parametri specificati.
Il primo parametro della funzione “begin()” indica il tipo di alimentazione del display (“SSD1306_SWITCH_CAPVCC” specifica la tensione di alimentazione.
voltage = analogRead(ADCpin)*maxVolt/1023.0;
Questa riga di codice legge il valore analogico del pin A0 (ADC) e lo converte in una tensione in base al valore massimo di tensione (maxVolt) che si può misurare e alla risoluzione in bit dell’ADC (1023). Il risultato viene quindi salvato nella variabile “voltage”.
Conclusioni
In caso di dubbi o domande, non esitate a scrivermi nel form qui di seguito.
Buon lavoro!
Forse mi sono perso qualche cosa, ma cosa rappresenta il numero 41 nel calcolo della variabile ‘battery’? Grazie.
Ciao e grazie per il commento. Nella scrittura del codice c’è un refuso invece che 41, la costante è 32, è un fattore moltiplicativo per determinare il reale valore della tensione misurata, che per i motivi spiegati nell’articolo è stata ridotta con un partitore resistivo. Ho provveduto a correggere il codice e grazie per la segnalazione. Spero di essere stato chiaro, in caso contrario scrivimi i tuoi dubbi.