- Potrebni materiali za merilnik moči ESP32
- Merilnik učinkovitosti na osnovi Arduina in ESP32 - vezalni diagram
- Oblika PCB za merilnik učinkovitosti na osnovi Arduino in ESP32
- Merilnik učinkovitosti na osnovi Arduino in ESP32 - koda
- Testiranje merilnika učinkovitosti na osnovi Arduina in ESP32
- Nadaljnje izboljšave
Vsi poznamo osnovni voltmeter, ampermeter in vatmetre, tri osnovne stvari, ki jih potrebujete za merjenje vrednosti na vseh elektronskih projektih ali vezjih. Merjenje napetosti in toka s pomočjo multimetra je lahko dober začetek, toda ena največjih težav, s katero se srečujem med testiranjem vezja, je merjenje izkoristka moči. Torej, danes bomo to težavo rešili z izdelavo merilnika učinkovitosti na osnovi Arduina in ESP32, ki lahko meri vhodno napetost, vhodni tok, izhodno napetost in izhodni tok. Tako lahko istočasno meri vhodno in izhodno moč in s temi vrednostmi lahko enostavno izmerimo učinkovitost. Prej smo tudi v našem projektu merilnika moči, ki temelji na Arduino, naredili nekaj zelo podobnega, toda tukaj bomo izmerili vhodno in izhodno moč izračunajte izkoristek moči.
Namesto da bi za to delo kupili štiri metre, bomo to težavo lahko rešili z vključitvijo zmogljivosti vseh štirih metrov v enega. Izdelava vašega digitalnega števca ne samo zniža stroške, temveč vam nudi tudi prostor za nadgradnje in izboljšave. Ker za izdelavo tega projekta uporabljamo ESP32, lahko ta števnik enostavno omogočimo in zapisujemo podatke prek spleta, kar je tema prihodnjega projekta. Z vsemi osnovami, ki so bile razčiščene, pojdimo naravnost v to.
Opomba: Ta merilnik moči je zasnovan za enosmerne tokokroge. Če želite izmeriti izmenični tok na izračunani izkoristek izmenične napetosti, si lahko ogledate projekte merilnikov električne energije in predplačniških merilnikov energije, ki temeljijo na IoT.
Potrebni materiali za merilnik moči ESP32
Spodnja slika prikazuje materiale, uporabljene za izdelavo vezja. Ker je ta narejen iz zelo splošnih komponent, bi morali vse našteto gradivo najti v lokalni trgovini s hobi izdelki.
Spodaj sem navedel tudi komponente skupaj z zahtevano količino. Če vezje gradite sami, je zelo priporočljivo, da vse materiale dobite na spodnjem seznamu.
- Plošča ESP32 - 1
- 128X64 OLED - 1
- ACS712-20 IC - 2
- DC Barrel Jack - 1
- Kondenzator 100uF - 2
- 104pF - 2
- 102pF - 2
- 10K, 1% - 4
- 68K, 1% - 2
- 6,8K, 1% - 2
Merilnik učinkovitosti na osnovi Arduina in ESP32 - vezalni diagram
Shema merilnika učinkovitosti na osnovi Arduino in ESP32 je prikazana spodaj. Ustvarjanje tega vezja je zelo preprosto in uporablja generične komponente.
Delovanje vezja je zelo preprosto. V tem projektu bomo merili napetost in tok, vendar na edinstven način. Merimo napetost in tok tako za vhod kot za izhod, zato lahko vidimo učinkovitost tokokroga. To je zelo priročno za nekatere projekte. Primer je lahko pretvornik v enosmerni v enosmerni tok, kjer postane merjenje učinkovitosti obvezno. Način delovanja tega vezja je opisan spodaj.
IC trenutnega senzorja ACS712:
Kot lahko vidite na zgornji sliki, za merjenje toka uporabljamo IC IC senzorja toka ACS712. To je zelo zanimiva IC, saj uporablja Hallov učinek za merjenje toka. Obstajajo tri različice te IC, ki jih najdemo na trgu f (ali 5A, 20A in 30A). Uporabljamo različico 20A in je označena kot ACS712-20.
Podatkovni list ACS712 priporoča napetostno območje 4,5 - 5,5 za nemoteno delovanje. In ker bomo merili tok z ESP32, je toleranten le za 3,3 V, zato sem za znižanje izhodne napetosti IC ACS712 uporabil delilnik napetosti z dvema uporovoma 10K. Ko skozi IC ne teče tok, oddaja 2,5V in ko skozi IC teče neka količina toka, bodisi zniža napetost ali poveča napetost, odvisno od trenutne smeri toka. Dve od teh IC smo uporabili za merjenje vhodnega in izhodnega toka. Oglejte si naše prejšnje projekte (spodaj), v katerih smo uporabili ta senzor ACS712.
- Merilnik električne energije na osnovi IoT z uporabo modula Arduino in ESP8266 Wi-Fi
- Vezje digitalnega ampermetra z uporabo mikrokrmilnika PIC in ACS712
Tam smo podrobno razpravljali o delovanju teh senzorjev. Te si lahko ogledate, če želite izvedeti več o teh senzorjih.
Razdelilnik napetosti:
Za merjenje vhodne in izhodne napetosti imamo na vhodni in izhodni strani vezja dva delilnika napetosti. Največja napetost, ki jo lahko izmeri vezje, je 35 V, vendar jo je mogoče enostavno spremeniti s spreminjanjem vrednosti upora za delilnik napetosti.
Regulator napetosti:
Splošni regulator napetosti LM7805 se uporablja za napajanje IC ESP32, OLED in ACS712. Ker ga napajamo s precej čisto močjo, ne uporabljamo ločilnih kondenzatorjev, vendar smo uporabili kondenzatorje 100uF na vhodu in izhodu za stabilizacijo IC.
IC ESP32 in zaslon OLED:
Kot glavni procesor smo uporabili ESP32, ki je odgovoren za vse odčitke, izračune, vhode in izhode. Za poznavanje vrednosti smo uporabili tudi OLED zaslon 128X64.
Oblika PCB za merilnik učinkovitosti na osnovi Arduino in ESP32
PCB za naš merilnik učinkovitosti, ki temelji na Arduinu in ESP32, je zasnovan na enostranski plošči. Eagle sem uporabil za oblikovanje PCB-ja, vendar lahko uporabite katero koli programsko opremo za oblikovanje po svoji izbiri. 2D-slika moje zasnove plošče je prikazana spodaj.
Za pravilno povezavo tal med vsemi komponentami se uporablja dovolj zemeljske sledi. Prav tako smo poskrbeli, da smo uporabili ustrezne sledi 5 V in 3,3 V za zmanjšanje hrupa in izboljšanje učinkovitosti.
- Prenesite datoteke PCB Design in GERBER Arduino in merilnik učinkovitosti na osnovi ESP32
Ročno izdelani PCB:
Za udobje in preizkušanje sem izdelal svojo ročno izdelano različico tiskanega vezja, ki je prikazana spodaj. V prvi različici sem naredil nekaj napak, ki sem jih odpravil z uporabo nekaterih žic za premostitev. Toda v končni različici sem jih popravil, datoteke lahko preprosto prenesete in uporabite.
Merilnik učinkovitosti na osnovi Arduino in ESP32 - koda
Zdaj, ko dobro razumemo strojno plat stvari, lahko odpremo Arduino IDE in začnemo s svojim kodiranjem. Namen kode je odčitavanje analogne napetosti s pinov 35 in 33 plošče ESP32. Prav tako beremo napetost z 32 in 34 pina, kar je trenutna vrednost. Ko to storimo, jih lahko pomnožimo, da dobimo vhodno in izhodno moč, in če to damo v formulo učinkovitosti, lahko dobimo učinkovitost.
Na koncu ga prikažemo na LCD zaslonu. Na koncu je podan celoten program za enako, ki ga lahko kot takega uporabimo za zgoraj obravnavano strojno opremo. Nadalje je koda razdeljena na majhne delčke in razložena.
Ker uporabljamo OLED zaslon 128X64, za komuniciranje z zaslonom potrebujemo knjižnico Adafruit_GFX in knjižnico Adafruit_SSD1306 . Oba lahko prenesete iz privzetega terminala upravitelja plošč Arduino; če imate kakršne koli težave z delom upravitelja plošče, lahko tudi prenesete in vključite knjižnice iz pripadajočega skladišča GitHub, ki je navedeno spodaj.
- Prenesite knjižnico Adafruit_GFX
- Prenesite knjižnico Adafruit_SSD1306
Kot vedno začnemo svojo kodo z vključitvijo vseh potrebnih knjižnic. Nato določimo vse potrebne zatiče in spremenljivke, ki so prikazani spodaj.
#include
V SCREEN_WIDTH & SCREEN_HEIGHT opredelitve se uporabljajo za opredelitev velikosti zaslona. Nato smo definirali vse potrebne nožice, skozi katere bomo merili napetost in tok. Nato smo opredelili vrednosti upora, ki se uporabljajo v strojni opremi, kot lahko vidite iz sheme. Če teh vrednosti nimate ali če želite spremeniti obseg števca, jih lahko spremenite, koda bo delovala v redu.
Ker za merjenje toka uporabljamo ACS712, za izračun toka iz napetosti potrebujemo vrednost mVperAmp . Ker uporabljam 20A modul ACS712, je vrednost mV / A 100, kot je navedeno v obrazcu. Ker pa uporabljamo ESP32 in delilnik napetosti, bomo imeli polovico vrednosti, ki je 50, in zato smo vnesli vrednost mV / AMP.
ACSoffset je odmik, ki je potreben za izračun toka iz napetosti. Ker se IC ACS712 napajajo iz napetosti 5V, je odmična napetost 2,5V. Ker pa uporabljamo napetostni delilnik, se ta zniža na 1,25 V. Morda že poznate neumen ADC ESP32, zato sem moral uporabiti vrednost 1136. Če imate težave s kalibracijo, lahko prilagodite vrednosti in kompenzirate ADC.
Na koncu zaključimo ta odsek tako, da naredimo prikazni objekt razreda Adafruit_SSD1306 in prenesemo širino zaslona, višino, konfiguracijo I 2 C, zadnji parameter -1 pa uporabimo za določitev funkcije ponastavitve. Če vaš zaslon nima zunanjega ponastavitvenega zatiča (kar zagotovo velja za moj zaslon), morate za zadnji argument uporabiti -1.
void setup () {Serial.begin (115200); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Naslov 0x3D za 128x64 Serial.println (F ("SSD1306 dodelitev ni uspela")); za (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); zamuda (100); }
Nato imamo razdelek setup () . V tem razdelku omogočamo zaporedje za odpravljanje napak, s pomočjo metode začetka predmeta prikaza pa preverimo, ali je na voljo zaslon I 2 C ali ne. Prav tako smo nastavili naslov I 2 C. Nato zaslon počistimo z metodo clearDisplay () . Zaslon zasučemo tudi z metodo setRotation , ker sem zmotil svoj dizajn tiskanih plošč. Nato postavimo zakasnitev 100 ms, da funkcije začnejo veljati. Ko je to končano, lahko zdaj preidemo na funkcijo zanke. Toda preden nadaljujete s funkcijo zanke, moramo razpravljati o dveh drugih funkcij, ki so return_voltage_value () , in return_current_value () .
dvojna vrnitev_napetostne_vrednosti (int pin_no) {dvojna tmp = 0; dvojni ADCVoltage = 0; dvojni inputVoltage = 0; dvojno povprečje = 0; for (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } povprečno = tmp / 150; ADCVoltage = ((povprečno * 3,3) / (4095)) + 0,138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // formula za izračun napetosti v GND povratni vhodni napetosti; }
Funkcija return_voltage_value () se uporablja za merjenje napetosti, ki prihaja v ADC, in za argument vzame pin_no. V tej funkciji začnemo z deklariranjem nekaterih spremenljivk, ki so tmp, ADCVoltage, inputVoltage in avg. Spremenljivka tmp se uporablja za shranjevanje začasne vrednosti ADC, ki jo dobimo iz funkcije analogRead (), nato jo v zanki for povprečimo 150-krat in vrednost shranimo v spremenljivko, imenovano avg. Nato iz dane formule izračunamo ADCVoltage, na koncu izračunamo vhodno napetost in vrnemo vrednosti. Vrednost +0,138, ki jo vidite, je vrednost kalibracije, ki sem jo uporabil za umerjanje nivoja napetosti, poigrajte se s to vrednostjo, če se pojavijo napake.
dvojna vrnitev_tokovne_vrednosti (int pin_no) {dvojna tmp = 0; dvojno povprečje = 0; dvojni ADCVoltage = 0; dvojni amperi = 0; for (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } povprečno = tmp / 150; ADCVoltage = ((povprečno / 4095,0) * 3300); // pridobi mV ampere = ((ADCVoltage - ACSoffset) / mVperAmp); povratni ojačevalniki; }
Nato imamo funkcijo return_current_value () . Ta funkcija za argument vzame tudi pin_no. Tudi v tej funkciji imamo štiri spremenljivke, tj. tmp, avg, ADCVoltage in Amps
Nato preberemo pin s funkcijo analogRead () in ga povprečimo 150-krat, nato uporabimo formulo za izračun ADCvoltage, s tem izračunamo tok in vrnemo vrednost. S tem se lahko premaknemo na odsek zanke.
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 ("Vhodna napetost:"); Serial.print (input_voltage); Serial.print ("- Vhodni tok:"); Serial.print (input_current); Serial.print ("- Izhodna napetost:"); Serial.print (output_voltage); Serial.print ("- izhodni tok:"); Serial.println (izhodni_tok); zamuda (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); zaslon.tisk ("V"); }
Odsek zanke začnemo z deklariranjem in definiranjem nekaterih spremenljivk z gibanjem v vseh štirih spremenljivkah. Kličemo ustrezne funkcije in kot argument posredujemo pin_no, saj lahko modul ACS712 vrne trenutne vrednosti v negativne vrednosti. Za negativno vrednost uporabimo funkcijo abs () v matematični knjižnici kot pozitivno. Nato zaporedno natisnemo vse vrednosti za odpravljanje napak. Nato počistimo zaslon, nastavimo kazalko in natisnemo vrednosti. To naredimo za vse znake, prikazane na zaslonu. Kar označuje konec funkcije zanke in programa.
Testiranje merilnika učinkovitosti na osnovi Arduina in ESP32
Kot vidite mojo testno nastavitev na zgornji sliki. Za vhod imam svoj transformator 30V, merilnik pa imam priklopljen za testno ploščo. Uporabljam ploščo pretvornika na osnovi LM2596 in za obremenitev, vzporedno pa uporabljam tri 10 ohmske upore.
Kot lahko vidite na zgornji sliki, sem se priključil na multimetre za preverjanje vhodne in izhodne napetosti. Transformator proizvede skoraj 32V, izhodna moč pretvornika pa je 3,95V.
Na tej sliki je prikazan izhodni tok, izmerjen z mojim merilnikom izkoristka in multimetrom. Kot lahko vidite, multimeter kaže 0,97 amperov in če ga nekoliko povečate, pokaže 1,0A, je nekoliko izklopljen zaradi nelinearnosti v modulu ACS712, vendar to služi našemu namenu. Za podrobno razlago in testiranje si lahko ogledate video v našem video razdelku.
Nadaljnje izboljšave
Za to predstavitev je vezje narejeno na ročno izdelani tiskani plošči, vendar je vezje enostavno vgraditi v kakovostno tiskano vezje. V mojem poskusu je velikost tiskanega vezja resnično velika zaradi velikosti komponent, vendar ga je v proizvodnem okolju mogoče zmanjšati z uporabo poceni komponent SMD. Vezje tudi nima vgrajene zaščitne funkcije, zato bo vključitev zaščitnega vezja izboljšala splošni varnostni vidik vezja. Med pisanjem kode sem opazil, da ADC ESP32 ni tako dober. Vključitev zunanjega ADC, kot je modul ADS1115, bo povečala splošno stabilnost in natančnost.
Upam, da vam je bil ta članek všeč in ste se iz njega naučili kaj novega. Če dvomite, lahko vprašate v spodnjih komentarjih ali pa uporabite naše forume za podrobno razpravo.