Monitoriamo l’energia con INA219 e Arduino UNO

progetti Arduino

Nel mondo dell'elettronica DIY e dei progetti maker, la capacità di monitorare efficacemente la potenza e l'energia di un dispositivo è fondamentale. Questo articolo esplora un semplice progetto di un sistema di monitoraggio energia con INA219 e Arduino UNO, che unisce la versatilità di Arduino con la precisione del sensore di corrente e tensione INA219, il tutto unito alla chiarezza visiva di un display OLED, l'SSD1306, per creare un misuratore di potenza ed energia facile da usare, ricco di funzionalità e possibilità di impieghi.

Panoramica del Progetto

Il cuore di questo progetto è la scheda MCU Arduino UNO, una scheda microcontrollore basata sull'ATmega328P. Arduino offre una piattaforma accessibile e flessibile per hobbisti e professionisti per sviluppare progetti elettronici complessi con minimo sforzo.

Arduino

Figura 1: La scheda Arduino UNO

Il componente chiave per la misurazione della potenza e dell'energia è l'INA219, un sensore di corrente e tensione con interfaccia I2C. L'INA219 è capace di misurare la tensione sul lato alto fino a +26VDC e la corrente che attraversa il carico, offrendo letture precise con una risoluzione fino a 1mA.

Arduino

Figura 2: La Breakout board INA219

Per l'output visivo, il progetto si avvale del display OLED SSD1306, un piccolo ma potente display che può mostrare chiaramente i dati raccolti dall'INA219. Con la sua risoluzione di 128x64 pixel, l'SSD1306 è perfetto per visualizzare testo e grafica, rendendolo l'interfaccia utente ideale per questo misuratore.

Arduino

Figura 3: Il display OLED SSD1306

Lo schema dei collegamenti è il seguente:

Arduino

Figura 4: Lo schema dei collegamenti

Implementazione del Codice su Arduino UNO

Il codice Arduino è strutturato per inizializzare sia l'INA219 che il display SSD1306 all'avvio. Utilizzando le librerie Adafruit dedicate per questi componenti, il setup diventa un processo semplice e diretto. Dopo l'inizializzazione, il loop principale del programma entra in azione, leggendo i valori di corrente, tensione e potenza dall'INA219 a intervalli regolari e visualizzandoli sul display OLED.

Arduino

Figura 5: La scheda in funzione

Una caratteristica distintiva di questo progetto è la capacità di calcolare e visualizzare l'energia consumata nel tempo, una metrica preziosa per valutare l'efficienza di qualsiasi dispositivo elettronico. In questo caso, viene utilizzato come carico un LED rosso, alimentato direttamente con i 3.3V di Arduino e transitando attraverso la Breakout board INA219, ove attraverso lo shunt, la schedina può rilevare la tensione e la corrente e spedirne i relativi valori al microcontrollore, programmato opportunamente.

Ed a proposito della programmazione, ecco lo Sketch che potrete implementare sulla vostra scheda Arduino UNO:

#include <Wire.h>
#include <Adafruit_INA219.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Definizioni per le dimensioni del display
#define OLED_WIDTH 128 // Larghezza display OLED
#define OLED_HEIGHT 32 // Altezza display OLED
#define OLED_RESET_PIN -1 // Pin di reset (usare -1 se gestito da Arduino)
#define DISPLAY_ADDR 0x3C // Indirizzo I2C del display (0x3D per 128x64, 0x3C per 128x32)

// Oggetti per display e sensore
Adafruit_SSD1306 screen(OLED_WIDTH, OLED_HEIGHT, &Wire, OLED_RESET_PIN);
Adafruit_INA219 sensorINA219;

// Variabili per la gestione del tempo e delle misurazioni
unsigned long tempoPrecedente = 0;
const unsigned long intervallo = 100; // Intervallo di aggiornamento in millisecondi
// Variabili per le letture del sensore
float tensioneShunt = 0;
float tensioneBus = 0;
float corrente_mA = 0;
float tensioneCarico = 0;
float potenza_mW = 0;
float energia_mWh = 0;

void setup() {
Serial.begin(115200);
// Attendere l'apertura della porta seriale
while (!Serial) {
delay(1);
}

Serial.println("Avvio...");
// Inizializzazione del display OLED
screen.begin(SSD1306_SWITCHCAPVCC, DISPLAY_ADDR);
screen.clearDisplay();

// Inizializzazione del sensore INA219
if (!sensorINA219.begin()) {
Serial.println("Sensore INA219 non trovato");
while (1) {
delay(10);
}
}
Serial.println("Pronto per le misurazioni con INA219");
}

void loop() {
unsigned long tempoAttuale = millis();
if (tempoAttuale - tempoPrecedente >= intervallo) {
tempoPrecedente = tempoAttuale;
leggiSensorINA219();
visualizzaDati();
}
}

void leggiSensorINA219() {
tensioneShunt = sensorINA219.getShuntVoltage_mV();
tensioneBus = sensorINA219.getBusVoltage_V();
corrente_mA = sensorINA219.getCurrent_mA();
potenza_mW = sensorINA219.getPower_mW();
tensioneCarico = tensioneBus + (tensioneShunt / 1000);
energia_mWh += tensioneCarico * corrente_mA / 3600;

// Stampa dei valori su seriale
Serial.print("Tensione Bus: "); Serial.print(tensioneBus); Serial.println(" V");
Serial.print("Tensione Shunt: "); Serial.print(tensioneShunt); Serial.println(" mV");
Serial.print("Tensione Carico: "); Serial.print(tensioneCarico); Serial.println(" V");
Serial.print("Corrente: "); Serial.print(corrente_mA); Serial.println(" mA");
Serial.print("Potenza: "); Serial.print(potenza_mW); Serial.println(" mW");
Serial.println();
}

void visualizzaDati() {
screen.clearDisplay();
screen.setTextColor(SSD1306_WHITE);
screen.setTextSize(1);
screen.setCursor(0, 0);
screen.print("V: "); screen.print(tensioneCarico);
screen.setCursor(64, 0);
screen.print("mA: "); screen.print(corrente_mA);

screen.setCursor(0, 8);
screen.print("Potenza: "); screen.print(potenza_mW); screen.println(" mW");
screen.setCursor(0, 16);
screen.print("Energia: "); screen.print(energia_mWh); screen.println(" mWh");

screen.display();
}

Descrizione del codice

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2377 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend