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.
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.
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.
Lo schema dei collegamenti è il seguente:
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.
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.