- Materiali necessari per il misuratore di potenza ESP32
- Misuratore di efficienza basato su Arduino ed ESP32 - Schema del circuito
- Progettazione PCB per misuratore di efficienza basato su Arduino e ESP32
- Misuratore di efficienza basato su Arduino ed ESP32 - Codice
- Testare il misuratore di efficienza basato su Arduino ed ESP32
- Ulteriori miglioramenti
Conosciamo tutti un voltmetro, un amperometro e un wattmetri di base, le tre cose fondamentali di cui hai bisogno per misurare i valori su qualsiasi progetto o circuito elettronico. Misurare la tensione e la corrente con l'aiuto di un multimetro può essere un buon modo per iniziare, ma uno dei maggiori problemi che devo affrontare durante il test di un circuito è misurare l'efficienza energetica. Quindi, oggi risolveremo questo problema costruendo un misuratore di efficienza basato su Arduino ed ESP32 in grado di misurare la tensione di ingresso, la corrente di ingresso, la tensione di uscita e la corrente di uscita. Quindi, può misurare la potenza in ingresso e la potenza in uscita allo stesso tempo e, con questi valori, possiamo misurare facilmente l'efficienza. In precedenza, abbiamo anche fatto qualcosa di molto simile nel nostro progetto Wattmetro basato su Arduino, ma qui misureremo sia la potenza in ingresso che quella in uscita per calcolare l'efficienza energetica.
Invece di acquistare quattro contatori per il lavoro, saremo in grado di risolvere questo problema incorporando le capacità di tutti e quattro i contatori in uno solo. Costruire il tuo contatore digitale non solo riduce i costi, ma ti offre anche un margine di manovra per aggiornamenti e miglioramenti. Dato che stiamo usando un ESP32 per costruire questo progetto, possiamo facilmente rendere questo misuratore abilitato all'IoT e registrare i dati sul web, che è l'argomento per il progetto futuro. Dopo aver chiarito tutte le basi, entriamo subito.
Nota: questo misuratore di potenza è progettato per circuiti CC. Se stai cercando di misurare la corrente CA in base all'efficienza energetica CA calcolata, puoi controllare i progetti di contatori di energia elettrica basati su IoT e contatori di energia prepagati.
Materiali necessari per il misuratore di potenza ESP32
L'immagine sotto mostra i materiali utilizzati per costruire il circuito. Poiché è realizzato con componenti molto generici, dovresti essere in grado di trovare tutto il materiale elencato nel tuo negozio di hobby locale.
Ho anche elencato i componenti di seguito insieme alla quantità richiesta. Se stai costruendo il circuito da solo, ti consigliamo vivamente di ottenere tutti i materiali dall'elenco seguente.
- Scheda ESP32 - 1
- OLED 128X64 - 1
- ACS712-20 IC - 2
- Jack Barilotto DC - 1
- Condensatore 100uF - 2
- 104pF - 2
- 102pF - 2
- 10K, 1% - 4
- 68.000, 1% - 2
- 6,8 K, 1% - 2
Misuratore di efficienza basato su Arduino ed ESP32 - Schema del circuito
Di seguito è mostrato lo schema per il misuratore di efficienza basato su Arduino ed ESP32. La creazione di questo circuito è molto semplice e utilizza componenti generici.
Il funzionamento del circuito è molto semplice. Misureremo la tensione e la corrente in questo progetto ma in un modo unico. Stiamo misurando tensione e corrente sia per l'ingresso che per l'uscita, quindi possiamo vedere l'efficienza del circuito. Questo è molto utile per alcuni progetti. Un esempio potrebbe essere un convertitore da CC a CC in cui la misurazione dell'efficienza diventa obbligatoria. Il modo in cui funzionano questi circuiti è descritto di seguito.
IC sensore di corrente ACS712:
Come puoi vedere nell'immagine sopra, stiamo usando un sensore di corrente IC ACS712 per misurare la corrente. Questo è un circuito integrato molto interessante in quanto utilizza l' effetto Hall per misurare la corrente, ci sono tre varianti di questo circuito integrato che possono essere trovate sul mercato f (o 5A, 20A e 30A). Stiamo usando la variante 20A di questo ed è etichettato come ACS712-20.
La scheda tecnica dell'ACS712 consiglia un intervallo di tensione compreso tra 4,5 e 5,5 per funzionare senza problemi. E poiché misureremo la corrente con un ESP32, è tollerante solo a 3,3 V, motivo per cui ho utilizzato un partitore di tensione con due resistori da 10K per abbassare la tensione di uscita dell'ACS712 IC. Quando nessuna corrente scorre attraverso l'IC, emette 2,5 V e quando una certa quantità di corrente scorre attraverso l'IC, abbassa la tensione o aumenta la tensione a seconda della direzione del flusso di corrente. Abbiamo utilizzato due di questi circuiti integrati per misurare la corrente di ingresso e di uscita. Dai un'occhiata ai nostri progetti precedenti (sotto) in cui abbiamo utilizzato questo sensore ACS712.
- Contatore di energia elettrica basato su IoT che utilizza Arduino e modulo Wi-Fi ESP8266
- Circuito amperometro digitale con microcontrollore PIC e ACS712
Dove abbiamo discusso in dettaglio il funzionamento di questi sensori. Puoi controllare quelli se vuoi saperne di più su questi sensori.
Il divisore di tensione:
Per misurare la tensione di ingresso e di uscita, abbiamo due divisori di tensione sul lato di ingresso e di uscita del circuito. La tensione massima che il circuito può misurare è 35 V, ma può essere facilmente modificata cambiando i valori del resistore per il partitore di tensione.
Il regolatore di tensione:
Un regolatore di tensione LM7805 generico viene utilizzato per alimentare i circuiti integrati ESP32, OLED e ACS712. Dato che lo stiamo alimentando con una potenza abbastanza pulita, non vengono utilizzati condensatori di disaccoppiamento, ma abbiamo utilizzato condensatori da 100uF sia in ingresso che in uscita per stabilizzare l'IC.
L'IC ESP32 e il display OLED:
Abbiamo utilizzato un ESP32 come processore principale, che è responsabile di tutte le letture, i calcoli, gli input e gli output. Inoltre, abbiamo utilizzato un display OLED 128X64 per conoscere i valori.
Progettazione PCB per misuratore di efficienza basato su Arduino e ESP32
Il PCB per il nostro misuratore di efficienza basato su Arduino ed ESP32 è progettato su una scheda unilaterale. Ho usato Eagle per progettare il mio PCB, ma puoi utilizzare qualsiasi software di progettazione di tua scelta. L'immagine 2D del disegno della mia tavola è mostrata di seguito.
Viene utilizzata una traccia di terra sufficiente per effettuare i collegamenti di terra appropriati tra tutti i componenti. Inoltre, ci siamo assicurati di utilizzare tracce da 5 V e 3,3 V adeguate per ridurre il rumore e migliorare l'efficienza.
- Scarica PCB Design e file GERBER Arduino e misuratore di efficienza basato su ESP32
PCB fatto a mano:
Per comodità e test, ho realizzato la mia versione artigianale del PCB ed è mostrata di seguito. Nella prima versione ho commesso degli errori, che ho corretto utilizzando dei ponticelli. Ma nella versione finale, ho risolto quelli, puoi semplicemente scaricare i file e usarli.
Misuratore di efficienza basato su Arduino ed ESP32 - Codice
Ora che abbiamo una buona comprensione del lato hardware, possiamo aprire l'IDE di Arduino e iniziare la nostra codifica. Lo scopo del codice è leggere la tensione analogica dai pin 35 e 33 della scheda ESP32. Inoltre, leggiamo la tensione da 32 e 34 pin che è il valore corrente. Una volta fatto questo, possiamo moltiplicarli per ottenere potenza in ingresso e potenza in uscita, e inserendola nella formula dell'efficienza, possiamo ottenere l'efficienza.
Infine, lo visualizziamo sullo schermo LCD. Alla fine viene fornito il programma completo per fare lo stesso, che può essere utilizzato come tale per l'hardware discusso sopra. Inoltre, il codice è suddiviso in piccoli frammenti e spiegato.
Poiché stiamo utilizzando un display OLED 128X64, abbiamo bisogno della libreria Adafruit_GFX e della libreria Adafruit_SSD1306 per comunicare con il display. Puoi scaricarli entrambi dal terminale del gestore della scheda predefinito di Arduino; in caso di problemi con la parte del gestore del consiglio di amministrazione, è anche possibile scaricare e includere le librerie dal repository GitHub associato, fornito di seguito.
- Scarica la libreria Adafruit_GFX
- Scarica la libreria Adafruit_SSD1306
Come sempre, iniziamo il nostro codice includendo tutte le librerie richieste. Quindi definiamo tutti i pin e le variabili necessari, tutti mostrati di seguito.
#includere
Le definizioni SCREEN_WIDTH e SCREEN_HEIGHT vengono utilizzate per definire le dimensioni dello schermo. Successivamente abbiamo definito tutti i pin necessari, attraverso i quali misureremo la tensione e la corrente. Successivamente, abbiamo definito i valori dei resistori utilizzati nell'hardware come puoi vedere dallo schema. Se non hai questi valori o se vuoi cambiare la portata del misuratore, puoi cambiare quei valori, il codice funzionerà perfettamente.
Dato che stiamo usando un ACS712 per misurare la corrente, abbiamo bisogno del valore mVperAmp per calcolare la corrente dalla tensione. Dato che sto utilizzando un modulo ACS712 da 20 A, il valore mV / A è 100 come indicato nella scheda tecnica. Ma poiché stiamo usando un ESP32 e un partitore di tensione, avremo la metà del valore che è 50, ed è per questo che abbiamo inserito il valore mV / AMP.
ACSoffset è l'offset necessario per calcolare la corrente dalla tensione. Poiché i circuiti integrati dell'ACS712 sono alimentati da 5 V, la tensione di offset è 2,5 V. Ma poiché utilizziamo un partitore di tensione, scende a 1,25 V. Potresti già conoscere lo schifoso ADC dell'ESP32, quindi ho dovuto usare un valore di 1136. Se hai problemi di calibrazione, puoi modificare i valori e compensare l'ADC.
Infine, terminiamo questa sezione creando un oggetto di visualizzazione della classe Adafruit_SSD1306 e passando la larghezza dello schermo, l'altezza, la configurazione I 2 C e l'ultimo parametro -1 viene utilizzato per definire la funzionalità di ripristino. Se il tuo display non ha un pin di reset esterno (che certamente è per il mio display), devi usare -1 per l'ultimo argomento.
void setup () {Serial.begin (115200); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Indirizzo 0x3D per Serial.println 128x64 (F ("Allocazione SSD1306 non riuscita")); per (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); ritardo (100); }
Successivamente, abbiamo la nostra sezione setup () . In questa sezione, abilitiamo il seriale per il debug, controlliamo se un display I 2 C è disponibile o meno con l'aiuto del metodo iniziale dell'oggetto di visualizzazione. Inoltre, impostiamo l' indirizzo I 2 C. Successivamente, cancelliamo il display con il metodo clearDisplay () . Inoltre, ruotiamo il display con il metodo setRotation , perché ho incasinato il mio progetto PCB. Successivamente, inseriamo un ritardo di 100 ms affinché le funzioni abbiano effetto. Fatto ciò, possiamo ora passare alla funzione loop. Ma prima di procedere alla funzione di loop, abbiamo bisogno di discutere di altre due funzioni che sono return_voltage_value () , e return_current_value () .
double return_voltage_value (int pin_no) {double tmp = 0; double ADCVoltage = 0; double inputVoltage = 0; doppia media = 0; for (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } avg = tmp / 150; Tensione ADC = ((avg * 3,3) / (4095)) + 0,138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // formula per il calcolo della tensione in ie GND return inputVoltage; }
La funzione return_voltage_value () viene utilizzata per misurare la tensione in ingresso nell'ADC e prende pin_no come argomento. In questa funzione, iniziamo dichiarando alcune variabili, che sono tmp, ADCVoltage, inputVoltage e avg. La variabile tmp viene utilizzata per memorizzare il valore ADC temporaneo che otteniamo dalla funzione analogRead (), quindi calcoliamo la media 150 volte in un ciclo for e memorizziamo il valore in una variabile chiamata avg. Quindi calcoliamo ADCVoltage dalla formula data, infine, calcoliamo la tensione di ingresso e restituiamo i valori. Il valore +0,138 che vedi è il valore di calibrazione che ho usato per calibrare il livello di tensione, gioca con questo valore se ricevi errori.
double return_current_value (int pin_no) {double tmp = 0; doppia media = 0; double ADCVoltage = 0; doppio Amp = 0; for (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } avg = tmp / 150; Tensione ADC = ((avg / 4095.0) * 3300); // Ottiene mV Amp = ((ADCVoltage - ACSoffset) / mVperAmp); ritorno Amp; }
Successivamente, abbiamo la funzione return_current_value () . Questa funzione accetta anche pin_no come argomento. Anche in questa funzione abbiamo quattro variabili e cioè. tmp, avg, ADCVoltage e Amps
Successivamente, leggiamo il pin con la funzione analogRead () e ne calcoliamo la media 150 volte, quindi usiamo la formula per calcolare la tensione ADC, con quella calcoliamo la corrente e restituiamo il valore. Con ciò, possiamo passare alla sezione del ciclo.
void loop () {float input_voltage = abs (return_voltage_value (INPUT_VOLTAGE_SENSE_PIN)); float input_current = abs (return_current_value (INPUT_CURRENT_SENSE_PIN)); float output_voltage = abs (return_voltage_value (OUTPUT_VOLTAGE_SENSE_PIN)); float output_current = abs ((return_current_value (OUTPUT_CURRENT_SENSE_PIN))); input_current = input_current - 0,025; Serial.print ("Tensione di ingresso:"); Serial.print (input_voltage); Serial.print ("- Input Current:"); Serial.print (input_current); Serial.print ("- Tensione di uscita:"); Serial.print (output_voltage); Serial.print ("- Corrente di uscita:"); Serial.println (output_current); ritardo (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); Schermo.stampa ("V"); }
Iniziamo la sezione loop dichiarando e definendo alcune variabili float, in tutte e quattro le variabili. Chiamiamo le rispettive funzioni, passando pin_no come argomento, poiché il modulo ACS712 può restituire i valori correnti in negativo. Usiamo la funzione abs () della libreria matematica per rendere positivo il valore negativo. Successivamente, stampiamo in serie tutti i valori per il debug. Successivamente, cancelliamo il display, impostiamo il cursore e stampiamo i valori. Lo facciamo per tutti i caratteri visualizzati nel display. Che segna la fine della funzione loop e del programma.
Testare il misuratore di efficienza basato su Arduino ed ESP32
Come puoi vedere la mia configurazione di prova nell'immagine sopra. Ho il mio trasformatore da 30 V come ingresso e il mio contatore è collegato alla scheda di test. Sto usando una scheda convertitore buck basata su LM2596 e per il carico e sto usando tre resistenze da 10 Ohm, in parallelo.
Come puoi vedere nell'immagine sopra, mi sono collegato a multimetri per controllare la tensione di ingresso e uscita. Il trasformatore produce quasi 32 V e l'uscita del convertitore buck è 3,95 V.
L'immagine qui mostra la corrente di uscita misurata dal mio misuratore di efficienza e dal multimetro. Come puoi vedere, il multimetro mostra.97 Amp, e se ingrandisci un po ', mostra 1.0A, è leggermente fuori causa a causa della non linearità presente nel modulo ACS712 ma questo serve al nostro scopo. Per una spiegazione dettagliata e un test, puoi guardare il video nella nostra sezione video.
Ulteriori miglioramenti
Per questa dimostrazione, il circuito è realizzato su un PCB fatto a mano, ma il circuito può essere facilmente costruito in un PCB di buona qualità. Nel mio esperimento, la dimensione del PCB è davvero grande a causa delle dimensioni dei componenti, ma in un ambiente di produzione, può essere ridotta utilizzando componenti SMD economici. Il circuito inoltre non ha alcuna funzione di protezione integrata, quindi includere un circuito di protezione migliorerà l'aspetto generale della sicurezza del circuito. Inoltre, mentre scrivevo il codice, ho notato che l'ADC dell'ESP32 non è eccezionale. L'inclusione di un ADC esterno come il modulo ADS1115 aumenterà la stabilità e la precisione complessive.
Spero che questo articolo ti sia piaciuto e che abbia imparato qualcosa di nuovo da esso. Se hai qualche dubbio, puoi chiedere nei commenti qui sotto o puoi usare i nostri forum per una discussione dettagliata.