- Materiale necesare pentru contorul de putere ESP32
- Contor de eficiență bazat pe Arduino și ESP32 - Diagrama circuitului
- Proiectare PCB pentru contorul de eficiență bazat pe Arduino și ESP32
- Contor de eficiență bazat pe Arduino și ESP32 - Cod
- Testarea contorului de eficiență bazat pe Arduino și ESP32
- Îmbunătățiri suplimentare
Suntem cu toții conștienți de un voltmetru de bază, ampermetru și wattmetre, cele trei lucruri de bază de care aveți nevoie pentru a măsura valorile pe orice proiecte sau circuite electronice. Măsurarea tensiunii și curentului cu ajutorul unui multimetru poate fi o modalitate bună de a începe, dar una dintre cele mai mari probleme cu care mă confrunt în timpul testării unui circuit este măsurarea eficienței energetice. Deci, astăzi vom rezolva această problemă construind un contor de eficiență bazat pe Arduino și ESP32 care poate măsura tensiunea de intrare, curentul de intrare, tensiunea de ieșire și curentul de ieșire. Prin urmare, poate măsura puterea de intrare și puterea de ieșire în același timp și, cu aceste valori, putem măsura cu ușurință eficiența. Anterior, am făcut și ceva foarte asemănător în proiectul nostru Wattmeter bazat pe Arduino, dar aici vom măsura atât puterea de intrare, cât și puterea de ieșire la calculați eficiența energetică.
În loc să cumpărăm patru metri pentru slujbă, vom putea rezolva această problemă încorporând capacitățile tuturor celor patru metri într-unul. Construirea contorului dvs. digital nu numai că reduce costurile, dar vă oferă și o cameră de mișcare pentru upgrade-uri și îmbunătățiri. Întrucât folosim un ESP32 pentru a construi acest proiect, putem face cu ușurință acest contor activat IoT și putem înregistra date pe web, care este subiectul pentru viitorul proiect. Cu toate elementele de bază eliminate, să intrăm direct în el.
Notă: Acest contor de putere este proiectat pentru circuite de curent continuu. Dacă doriți să măsurați curentul alternativ până la eficiența calculată a energiei CA, puteți verifica proiectele contorului de energie electrică bazate pe IoT și proiecte de contor de energie preplătite.
Materiale necesare pentru contorul de putere ESP32
Imaginea de mai jos prezintă materialele utilizate pentru construirea circuitului. Deoarece acest lucru este realizat cu componente foarte generice, ar trebui să puteți găsi toate materialele listate în magazinul dvs. local de hobby-uri.
De asemenea, am enumerat componentele de mai jos, împreună cu cantitatea necesară. Dacă construiți singur circuitul, este foarte recomandat să obțineți toate materialele din lista de mai jos.
- Placa ESP32 - 1
- 128X64 OLED - 1
- ACS712-20 IC - 2
- DC Barrel Jack - 1
- Condensator 100uF - 2
- 104pF - 2
- 102pF - 2
- 10K, 1% - 4
- 68K, 1% - 2
- 6,8K, 1% - 2
Contor de eficiență bazat pe Arduino și ESP32 - Diagrama circuitului
Schema pentru contorul de eficiență bazat pe Arduino și ESP32 este prezentat mai jos. Crearea acestui circuit este foarte simplă și folosește componente generice.
Funcționarea circuitului este foarte simplă. Vom măsura tensiunea și curentul în acest proiect, dar într-un mod unic. Măsurăm tensiunea și curentul atât pentru intrare cât și pentru ieșire, prin urmare putem vedea eficiența circuitului. Acest lucru este foarte util pentru unele proiecte. Un exemplu ar putea fi un convertor DC-DC în care măsurarea eficienței devine obligatorie. Modul în care funcționează aceste circuite este descris mai jos.
Circuitul IC al senzorului de curent ACS712:
După cum puteți vedea în imaginea de mai sus, folosim un senzor de curent ACS712 IC pentru a măsura curentul. Acesta este un CI foarte interesant, deoarece folosește efectul Hall pentru a măsura curentul, există trei variante ale acestui IC care pot fi găsite pe piața f (sau 5A, 20A și 30A). Folosim varianta 20A a acesteia și este etichetată ca ACS712-20.
Fișa tehnică ACS712 recomandă o gamă de tensiune de 4,5 - 5,5 pentru a funcționa fără probleme. Și, deoarece vom măsura curentul cu un ESP32, este tolerant doar 3,3V, motiv pentru care am folosit un divizor de tensiune cu două rezistențe de 10K pentru a reduce tensiunea de ieșire a ACS712 IC. Când nu circulă curent prin IC, acesta scoate 2,5V, iar când o anumită cantitate de curent curge prin IC, fie scade tensiunea, fie crește tensiunea în funcție de direcția curentului de curgere. Am folosit două dintre aceste circuite integrate pentru a măsura curentul de intrare și ieșire. Consultați proiectele noastre anterioare (mai jos) în care am folosit acest senzor ACS712.
- Contor de energie electrică bazat pe IoT utilizând modulul Arduino și ESP8266 Wi-Fi
- Circuit digital de ampermetru utilizând microcontroler PIC și ACS712
Unde am discutat în detaliu funcționarea acestor senzori. Le puteți verifica dacă doriți să aflați mai multe despre acești senzori.
Divizorul de tensiune:
Pentru a măsura tensiunea de intrare și ieșire, avem două divizoare de tensiune pe partea de intrare și de ieșire a circuitului. Tensiunea maximă pe care o poate măsura circuitul este de 35V, dar poate fi ușor modificată prin schimbarea valorilor rezistorului pentru divizorul de tensiune.
Regulatorul de tensiune:
Un regulator de tensiune LM7805 generic este utilizat pentru alimentarea circuitelor IC ESP32, OLED și ACS712. Pe măsură ce îl alimentăm cu o putere destul de curată, nu sunt folosiți condensatori de decuplare, dar am folosit condensatori 100uF atât la intrare, cât și la ieșire pentru a stabiliza IC-ul.
ESP32 IC și afișajul OLED:
Am folosit un ESP32 ca procesor principal, care este responsabil pentru toate citirile, calculele, intrările și ieșirile. De asemenea, am folosit un afișaj OLED 128X64 pentru a cunoaște valorile.
Proiectare PCB pentru contorul de eficiență bazat pe Arduino și ESP32
PCB-ul pentru contorul nostru de eficiență bazat pe Arduino și ESP32 este proiectat pe o placă unilaterală. Am folosit Eagle pentru a-mi proiecta PCB-ul, dar puteți utiliza orice software de proiectare la alegere. Imaginea 2D a designului plăcii mele este prezentată mai jos.
Se utilizează o urmă de masă suficientă pentru a realiza conexiuni de masă adecvate între toate componentele. De asemenea, ne-am asigurat să folosim urmele adecvate de 5V și 3,3V pentru a reduce zgomotul și pentru a îmbunătăți eficiența.
- Descărcați PCB Design și fișiere GERBER Arduino și contor de eficiență ESP32
PCB realizat manual:
Pentru confort și testare, am realizat versiunea mea manuală a PCB-ului și este prezentată mai jos. În prima versiune, am făcut câteva greșeli, pe care le-am corectat folosind niște fire jumper. Dar în versiunea finală, le-am reparat, puteți descărca fișierele și le puteți folosi.
Contor de eficiență bazat pe Arduino și ESP32 - Cod
Acum, că avem o bună înțelegere a laturii hardware a lucrurilor, putem deschide Arduino IDE și putem începe codarea. Scopul codului este de a citi tensiunea analogică de la pinii 35 și 33 ai plăcii ESP32. De asemenea, citim tensiunea de la 32 și 34 pin, care este valoarea curentă. Odată ce facem acest lucru, le putem înmulți pentru a obține puterea de intrare și puterea de ieșire și punând-o pe formula de eficiență, putem obține eficiența.
În cele din urmă, îl afișăm pe ecranul LCD. Programul complet pentru a face același lucru este dat la final, care poate fi folosit ca atare pentru hardware-ul discutat mai sus. Mai mult, codul este împărțit în fragmente mici și explicat.
Deoarece utilizăm un ecran OLED 128X64, avem nevoie de biblioteca Adafruit_GFX și biblioteca Adafruit_SSD1306 pentru a comunica cu ecranul. Le puteți descărca pe ambele de pe terminalul implicit al managerului de bord al Arduino; dacă aveți probleme cu partea managerului de bord, puteți descărca și include bibliotecile din depozitul GitHub asociat, care este prezentat mai jos.
- Descărcați biblioteca Adafruit_GFX
- Descărcați biblioteca Adafruit_SSD1306
Ca întotdeauna, începem codul nostru prin includerea tuturor bibliotecilor necesare. Apoi definim toți pinii și variabilele necesare, toate fiind prezentate mai jos.
#include
Cele SCREEN_WIDTH & SCREEN_HEIGHT definiții sunt folosite pentru a defini dimensiunea ecranului. În continuare am definit toți pinii necesari, prin care vom măsura tensiunea și curentul. Apoi, am definit valorile rezistenței care sunt utilizate în hardware, după cum puteți vedea din schemă. Dacă nu aveți aceste valori sau dacă doriți să modificați domeniul contorului, puteți modifica acele valori, codul va funcționa foarte bine.
Deoarece folosim un ACS712 pentru a măsura curentul, avem nevoie de valoarea mVperAmp pentru a calcula curentul din tensiune. Întrucât folosesc un modul ACS712 de 20A, valoarea mV / A este 100 așa cum este dată în foaia tehnică. Dar, deoarece folosim un ESP32 și un divizor de tensiune, vom avea jumătate din valoare, care este 50, și de aceea am introdus valoarea mV / AMP.
ACSoffset este offset-ul necesar pentru calcularea curentului din tensiune. Deoarece IC-urile ACS712 sunt alimentate de la 5V, tensiunea de offset este de 2,5V. Dar, deoarece folosim un divizor de tensiune, acesta coboară la 1,25V. S-ar putea să știți deja ADC-ul nenorocit al ESP32, așa că a trebuit să folosesc o valoare de 1136. Dacă aveți probleme de calibrare, puteți modifica valorile și puteți compensa ADC.
În cele din urmă, terminăm această secțiune făcând un obiect de afișare din clasa Adafruit_SSD1306 și trecând lățimea ecranului, înălțimea, configurația I 2 C, iar ultimul parametru -1 este utilizat pentru a defini funcționalitatea de resetare. Dacă afișajul dvs. nu are un pin de resetare extern (care este cu siguranță pentru afișajul meu), atunci trebuie să utilizați -1 pentru ultimul argument.
void setup () {Serial.begin (115200); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresă 0x3D pentru 128x64 Serial.println (F ("Alocarea SSD1306 a eșuat")); pentru (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); întârziere (100); }
Apoi, avem secțiunea noastră setup () . În această secțiune, activăm serialul pentru depanare, verificăm dacă un afișaj I 2 C este disponibil sau nu cu ajutorul metodei de început a obiectului de afișare. De asemenea, setăm adresa I 2 C. Apoi, ștergem afișajul cu metoda clearDisplay () . De asemenea, rotim afișajul cu metoda setRotation , deoarece mi-am încurcat designul PCB. Apoi, am pus o întârziere de 100 ms pentru ca funcțiile să intre în vigoare. Odată ce ați făcut acest lucru, putem trece acum la funcția de buclă. Dar, înainte de a trece la funcția de buclă, avem nevoie pentru a discuta despre alte două funcții care sunt return_voltage_value () , și return_current_value () .
double return_voltage_value (int pin_no) {double tmp = 0; tensiune ADC dublă = 0; dublu inputVoltage = 0; medie dublă = 0; for (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } medie = tmp / 150; ADCVoltage = ((avg * 3.3) / (4095)) + 0.138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // formula pentru calcularea tensiunii, adică GND return inputVoltage; }
Funcția return_voltage_value () este utilizată pentru a măsura tensiunea care intră în ADC și ia pin_no ca argument. În această funcție, începem prin declararea unor variabile, care sunt tmp, ADCVoltage, inputVoltage și avg. Variabila tmp este utilizată pentru a stoca valoarea temporară ADC pe care o obținem din funcția analogRead (), apoi o calculăm de 150 de ori într-o buclă for și stocăm valoarea într-o variabilă numită avg. Apoi calculăm tensiunea ADC din formula dată, în cele din urmă, calculăm tensiunea de intrare și returnăm valorile. Valoarea +0.138 pe care o vedeți este valoarea de calibrare pe care am folosit-o pentru calibrarea nivelului de tensiune, jucați-vă cu această valoare dacă primiți erori.
double return_current_value (int pin_no) {double tmp = 0; medie dublă = 0; tensiune ADC dublă = 0; Amperi dubli = 0; for (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } medie = tmp / 150; ADCVoltage = ((avg / 4095.0) * 3300); // Îți primește mV Amps = ((ADCVoltage - ACSoffset) / mVperAmp); retur Amperi; }
Apoi, avem funcția return_current_value () . Această funcție ia și pin_no ca argument. În această funcție avem, de asemenea, patru variabile și anume. tmp, avg, ADCVoltage și Amps
Apoi, citim pinul cu funcția analogRead () și îl calculăm de 150 de ori, apoi folosim formula pentru a calcula tensiunea ADC, cu care calculăm curentul și returnăm valoarea. Cu aceasta, putem trece la secțiunea buclă.
bucla nulă () {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 ("Tensiunea de intrare:"); Serial.print (input_voltage); Serial.print ("- Curent de intrare:"); Serial.print (input_current); Serial.print ("- Tensiune de ieșire:"); Serial.print (output_voltage); Serial.print ("- Curent de ieșire:"); Serial.println (output_current); întârziere (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); afişa.print ("V"); }
Începem secțiunea buclă declarând și definind unele variabile flotante, în toate cele patru variabile. Numim funcțiile respective, trecând pin_no ca argument, deoarece modulul ACS712 poate returna valorile curente în negativ. Folosim funcția abs () a bibliotecii matematice pentru a face valoarea negativă ca pozitivă. Apoi, imprimăm în serie toate valorile pentru depanare. Apoi, ștergem afișajul, setăm cursorul și imprimăm valorile. Facem acest lucru pentru toate caracterele afișate pe ecran. Care marchează sfârșitul funcției buclei și a programului.
Testarea contorului de eficiență bazat pe Arduino și ESP32
După cum puteți vedea configurarea testului meu în imaginea de mai sus. Am transformatorul de 30V ca intrare și contorul este conectat la placa de testare. Folosesc o placă de conversie bazată pe LM2596 și pentru încărcare și folosesc trei rezistențe de 10 Ohmi, în paralel.
După cum puteți vedea în imaginea de mai sus, m-am conectat la multi-metri pentru a verifica tensiunea de intrare și ieșire. Transformatorul produce aproape 32V, iar ieșirea convertorului Buck este de 3,95V.
Imaginea de aici arată curentul de ieșire măsurat de contorul meu de eficiență și de multimetru. După cum puteți vedea, multimetrul arată.97 Amperi și, dacă măriți puțin, acesta arată 1.0A, este ușor oprit din cauza non-liniarității prezente în modulul ACS712, dar acest lucru ne servește scopului nostru. Pentru o explicație detaliată și testare, puteți viziona videoclipul în secțiunea noastră video.
Îmbunătățiri suplimentare
Pentru această demonstrație, circuitul este realizat pe un PCB fabricat manual, dar circuitul poate fi ușor construit într-un PCB de bună calitate. În experimentul meu, dimensiunea PCB-ului este foarte mare datorită dimensiunii componentelor, dar într-un mediu de producție, poate fi redusă folosind componente SMD ieftine. De asemenea, circuitul nu are nicio caracteristică de protecție încorporată, astfel încât includerea unui circuit de protecție va îmbunătăți aspectul general de siguranță al circuitului. De asemenea, în timp ce scria codul, am observat că ADC-ul ESP32 nu este atât de grozav. Includerea unui ADC extern precum modulul ADS1115 va crește stabilitatea și precizia generală.
Sper că ți-a plăcut acest articol și ai învățat ceva nou din el. Dacă aveți vreo îndoială, puteți întreba în comentariile de mai jos sau puteți folosi forumurile noastre pentru discuții detaliate.