- ESP32 galios matuokliui reikalingos medžiagos
- „Arduino“ ir ESP32 efektyvumo matuoklis - grandinės schema
- „Arduino“ ir ESP32 pagrįsto efektyvumo matuoklio PCB dizainas
- „Arduino“ ir ESP32 pagrįstas efektyvumo matuoklis - kodas
- „Arduino“ ir ESP32 efektyvumo matuoklio testavimas
- Kiti patobulinimai
Mes visi žinome apie pagrindinius voltmetrus, ampermetrus ir vatmetrus - tris pagrindinius dalykus, kurių reikia norint išmatuoti bet kokių elektroninių projektų ar grandinių vertes. Įtampos ir srovės matavimas naudojant multimetrą gali būti geras būdas pradėti, tačiau viena didžiausių problemų, su kuria susiduriu bandydama grandinę, yra energijos efektyvumo matavimas. Taigi, šiandien mes išspręsime šią problemą sukurdami „Arduino“ ir ESP32 pagrįstą efektyvumo matuoklį, kuris gali išmatuoti įėjimo įtampą, įėjimo srovę, išėjimo įtampą ir išėjimo srovę. Taigi, tuo pačiu metu jis gali matuoti įvesties ir išėjimo galią, o naudodami šias reikšmes galime lengvai išmatuoti efektyvumą. Anksčiau mes taip pat padarėme kažką labai panašaus savo „Arduino Based Wattmeter“ projekte, bet čia mes išmatuosime tiek įėjimo, tiek išėjimo galią apskaičiuoti galios efektyvumą.
Užuot pirkę keturis metrus darbui, šią problemą galėsime išspręsti įtraukdami visų keturių metrų galimybes į vieną. Sukūrę savo skaitmeninį skaitiklį ne tik sumažinsite išlaidas, bet ir suteiksite galimybę judėti naujovėms ir patobulinimams. Kadangi kurdami šį projektą naudojame ESP32, galime lengvai įjungti šį skaitiklį IoT ir registruoti duomenis internete, o tai yra būsimo projekto tema. Išsiaiškinę visus pagrindus, eikime tiesiai į tai.
Pastaba: Šis galios matuoklis skirtas nuolatinės srovės grandinėms. Jei norite išmatuoti kintamosios srovės stiprumą pagal apskaičiuotą kintamosios srovės energijos efektyvumą, galite patikrinti daiktų interneto pagrindais pagrįstą elektros energijos skaitiklį ir išankstinio apmokėjimo energijos skaitiklio projektus.
ESP32 galios matuokliui reikalingos medžiagos
Žemiau pateiktame paveikslėlyje parodytos medžiagos, naudojamos grandinei sukurti. Kadangi tai pagaminta iš labai bendrų komponentų, turėtumėte sugebėti surasti visą išvardytą medžiagą savo vietos pomėgių parduotuvėje.
Aš taip pat išvardijau komponentus žemiau kartu su reikalingu kiekiu. Jei patys kuriate grandinę, labai rekomenduojama gauti visas medžiagas iš toliau pateikto sąrašo.
- ESP32 plokštė - 1
- 128X64 OLED - 1
- ACS712-20 IC - 2
- „DC Barrel Jack“ - 1
- 100uF kondensatorius - 2
- 104 pF - 2
- 102 pF - 2
- 10K, 1% - 4
- 68K, 1% - 2
- 6,8 tūkst., 1% - 2
„Arduino“ ir ESP32 efektyvumo matuoklis - grandinės schema
„ Arduino“ ir „ESP32“ efektyvumo matuoklio schema parodyta žemiau. Sukurti šią grandinę yra labai paprasta ir naudojami bendrieji komponentai.
Grandinės veikimas yra labai paprastas. Šiame projekte matuosime įtampą ir srovę, tačiau unikaliu būdu. Mes matuojame įtampą ir srovę tiek įėjimui, tiek išėjimui, taigi galime pamatyti grandinės efektyvumą. Tai labai praverčia įgyvendinant kai kuriuos projektus. Pavyzdys gali būti nuolatinės srovės keitiklis, kai efektyvumo matavimas tampa privalomas. Šios grandinės veikimo būdas aprašytas žemiau.
ACS712 srovės jutiklio IC:
Kaip matote aukščiau pateiktame paveikslėlyje, srovės matavimui naudojame ACS712 srovės jutiklio IC. Tai labai įdomus IC, nes srovės matavimui naudojamas „ Hall“ efektas. Yra trys šio IC variantai, kuriuos galima rasti rinkoje f (arba 5A, 20A ir 30A). Mes naudojame 20A variantą ir jis pažymėtas kaip ACS712-20.
ACS712 duomenų lape rekomenduojama, kad sklandžiai veiktų 4,5–5,5 įtampos diapazonas. Kadangi mes matuosime srovę naudodami ESP32, ji toleruoja tik 3,3 V, todėl aš naudoju įtampos skirstytuvą su dviem 10K rezistoriais, kad sumažėčiau ACS712 IC išėjimo įtampą. Kai srovė teka ne per IC, ji išleidžia 2,5 V, o kai tam tikras srovės kiekis teka per IC, jis arba sumažina įtampą, arba padidina įtampą, priklausomai nuo srovės srauto krypties. Mes naudojome du iš šių IC įvesties ir išvesties srovei matuoti. Peržiūrėkite ankstesnius mūsų projektus (toliau), kuriuose mes naudojome šį ACS712 jutiklį.
- IoT pagrįstas elektros energijos skaitiklis naudojant „Arduino“ ir ESP8266 „Wi-Fi“ modulį
- Skaitmeninė ampermetro grandinė naudojant PIC mikrovaldiklį ir ACS712
Kur mes išsamiai aptarėme šių jutiklių darbą. Galite sužinoti juos, jei norite sužinoti daugiau apie šiuos jutiklius.
Įtampos daliklis:
Norėdami išmatuoti įėjimo ir išėjimo įtampą, mes turime du įtampos skirstytuvus grandinės įėjimo ir išėjimo pusėse. Didžiausia įtampa, kurią grandinė gali išmatuoti, yra 35 V, tačiau ją galima lengvai pakeisti pakeitus įtampos daliklio rezistoriaus vertes.
Įtampos reguliatorius:
ESP32, OLED ir ACS712 IC maitinimui naudojamas bendras LM7805 įtampos reguliatorius. Kadangi mes jį maitiname gana švaria galia, atsiejimo kondensatoriai nenaudojami, tačiau IC stabilizavimui naudojome 100uF kondensatorius tiek įėjime, tiek išvestyje.
ESP32 IC ir OLED ekranas:
Mes naudojome ESP32 kaip pagrindinį procesorių, kuris yra atsakingas už visus rodmenis, skaičiavimus, įvestis ir išvestis. Taip pat, norėdami žinoti vertes, naudojome 128X64 OLED ekraną.
„Arduino“ ir ESP32 pagrįsto efektyvumo matuoklio PCB dizainas
Mūsų „Arduino“ ir ESP32 pagrįsto efektyvumo matuoklio plokštė sukurta ant vienpusės plokštės. Aš naudoju „Eagle“ kurdamas savo PCB, bet galite naudoti bet kurią pasirinktą projektavimo programinę įrangą. 2D mano plokštės dizaino vaizdas parodytas žemiau.
Tinkamam įžeminimo sujungimui tarp visų komponentų naudojamas pakankamas žemės pėdsakas. Be to, mes įsitikinome, kad naudojome tinkamus 5 V ir 3,3 V pėdsakus, kad sumažintume triukšmą ir pagerintume efektyvumą.
- Atsisiųskite PCB Design ir GERBER failus „Arduino“ ir ESP32 pagrįsto efektyvumo matuoklį
Rankų darbo PCB:
Kad būtų patogiau ir išbandyti, pasidariau savo rankomis pagamintą PCB versiją ir ji parodyta žemiau. Pirmojoje versijoje padariau keletą klaidų, kurias ištaisiau naudodama kai kuriuos trumpiklius. Bet galutinėje versijoje aš juos taisiau, galite tiesiog atsisiųsti failus ir juos naudoti.
„Arduino“ ir ESP32 pagrįstas efektyvumo matuoklis - kodas
Dabar, kai gerai suprantame aparatinės įrangos pusę, galime atidaryti „Arduino IDE“ ir pradėti koduoti. Kodo paskirtis yra nuskaityti analoginę įtampą iš ESP32 plokštės 35 ir 33 kontaktų. Be to, mes skaitėme įtampą nuo 32 ir 34 kontaktų, kuri yra dabartinė vertė. Tai padarę galime padauginti, kad gautume įvesties ir išėjimo galią, ir pritaikę efektyvumo formulę, galime gauti efektyvumą.
Galiausiai mes jį parodome LCD ekrane. Pabaigoje pateikiama visa programa, kaip padaryti tą patį, kuri gali būti naudojama pirmiau aptartai aparatinei įrangai. Be to, kodas yra padalintas į mažus fragmentus ir paaiškinamas.
Kadangi mes naudojame 128X64 OLED ekraną, mums reikia „ Adafruit_GFX“ bibliotekos ir „ Adafruit_SSD1306“ bibliotekos, kad galėtume bendrauti su ekranu. Juos abu galite atsisiųsti iš numatytojo „Arduino“ plokštės tvarkyklės terminalo; jei kyla problemų dėl plokštės tvarkyklės dalies, taip pat galite atsisiųsti ir įtraukti bibliotekas iš susietos „GitHub“ saugyklos, kuri pateikiama žemiau.
- Atsisiųskite „Adafruit_GFX“ biblioteką
- Atsisiųskite „Adafruit_SSD1306“ biblioteką
Kaip visada, mes pradedame savo kodą įtraukdami visas reikalingas bibliotekas. Tada mes apibrėžiame visus reikalingus kaiščius ir kintamuosius, kurie visi yra parodyti žemiau.
# įtraukti
Į screen_width & screen_height vartojamos sąvokos apibrėžti ekrano dydį. Tada mes apibrėžėme visus reikalingus kaiščius, per kuriuos matuosime įtampą ir srovę. Toliau mes apibrėžėme rezistoriaus vertes, kurios naudojamos aparatinėje įrangoje, kaip matote iš schemos. Jei neturite šių verčių arba norite pakeisti skaitiklio diapazoną, galite pakeisti tas vertes, kodas veiks puikiai.
Kadangi srovei matuoti naudojame ACS712, mums reikia mVperAmp vertės, kad galėtume apskaičiuoti srovę iš įtampos. Kadangi naudoju 20A ACS712 modulį, mV / A vertė yra 100, kaip nurodyta duomenų lape. Kadangi mes naudojame ESP32 ir įtampos daliklį, mes turėsime pusę vertės, kuri yra 50, ir todėl mes įtraukėme mV / AMP vertę.
ACSoffset yra poslinkis, reikalingas apskaičiuojant srovę iš įtampos. Kadangi ACS712 IC maitinami iš 5 V, kompensuojama įtampa yra 2,5 V. Bet kadangi mes naudojame įtampos daliklį, jis nusileidžia iki 1,25 V. Galbūt jau žinote siaubingą ESP32 ADC, todėl turėjau naudoti 1136 reikšmę. Jei kyla kalibravimo problemų, galite pakoreguoti reikšmes ir kompensuoti ADC.
Galiausiai užbaigiame šį skyrių sukurdami „ Adafruit_SSD1306“ klasės rodymo objektą ir perduodami ekrano pločio, aukščio, „I 2 C“ konfigūraciją, o paskutinis -1 parametras naudojamas nustatant atstatymo funkciją. Jei jūsų ekrane nėra išorinio atstatymo kaiščio (kuris tikrai tinka mano ekranui), paskutiniam argumentui turite naudoti -1.
negaliojanti sąranka () {Serial.begin (115200); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresas 0x3D, skirtas 128x64 Serial.println (F ("SSD1306 paskirstymas nepavyko")); dėl (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); vėlavimas (100); }
Tada mes turime savo sąrankos () skyrių. Šiame skyriuje mes įgaliname serijinį derinimą, mes patikriname, ar yra I 2 C ekranas, ar ne, naudodamas rodymo objekto pradžios metodą. Be to, mes nustatėme I 2 C adresą. Tada mes išvalysime ekraną naudodami „ clearDisplay ()“ metodą. Be to, mes pasukame ekraną naudodami „ setRotation“ metodą, nes aš sugadinau savo PCB dizainą. Toliau nustatėme 100 ms vėlavimą, kad funkcijos įsigaliotų. Tai padarę, dabar galime pereiti prie ciklo funkcijos. Bet prieš pradedant kilpos funkcijos, turime aptarti kitus du funkcijas, kurios yra return_voltage_value () , ir return_current_value () .
dviguba grąžinimo įtampos vertė (int pin_no) {dviguba tmp = 0; dviguba ADC įtampa = 0; dvigubas įėjimasVoltage = 0; dvigubas vidurkis = 0; už (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } vid. = tmp / 150; ADC įtampa = ((vid. * 3,3) / (4095)) + 0,138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // įtampos apskaičiavimo formulė, ty GND grįžtamojo įėjimo įtampa; }
Funkcija return_voltage_value () naudojama matuoti įtampą, patenkančią į ADC, ir ji naudoja „pin_no“ kaip argumentą. Šioje funkcijoje mes pradedame deklaruodami keletą kintamųjų, kurie yra tmp, ADCVoltage, inputVoltage ir avg. Tmp kintamasis naudojamas laikinai ADC vertei, kurią gauname iš „ analogRead ()“ funkcijos, išsaugoti, tada mes ją 150 kartų vidutiniškai apskaičiuojame „for“ cikle ir vertę laikome kintamajame, vadinamame avg. Tada apskaičiuojame ADCįtampą pagal pateiktą formulę, galiausiai apskaičiuojame įėjimo įtampą ir grąžiname reikšmes. +0,138 vertė, kurią matote, yra kalibravimo vertė, kurią naudojau įtampos lygiui kalibruoti, žaiskite su šia reikšme, jei pastebite klaidų.
dviguba grįžimo srovės vertė (int pin_no) {dviguba tmp = 0; dvigubas vidurkis = 0; dviguba ADC įtampa = 0; dvigubas amperas = 0; už (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } vid. = tmp / 150; ADC įtampa = ((vid. / 4095,0) * 3300); // Gauna tave mV stiprintuvai = ((ADCVoltage - ACSoffset) / mVperAmp); grąžinti amperus; }
Tada turime funkciją return_current_value () . Ši funkcija taip pat nurodo pin_no kaip argumentą. Šioje funkcijoje taip pat turime keturis kintamuosius, t. tmp, vid., ADC įtampa ir stiprintuvai
Tada mes perskaitėme kaištį su analogRead () funkcija ir vidutiniškai jį 150 kartų, paskui mes naudojame formulę apskaičiuoti ADCvoltage, tuo apskaičiuodami srovę ir grąžindami vertę. Su tuo galime pereiti prie kilpos sekcijos.
void loop () {float input_voltage = abs (return_voltage_value (INPUT_VOLTAGE_SENSE_PIN)); plūduriuojanti įvesties_ srovė = abs (grįžimo_ srovės_ vertė (INPUT_CURRENT_SENSE_PIN)); plūdės išėjimo įtampa = abs (grąžinimo įtampos vertė (OUTPUT_VOLTAGE_SENSE_PIN)); float output_current = abs ((return_current_value (OUTPUT_CURRENT_SENSE_PIN))); įvesties srovė = įvesties srovė - 0,025; Serial.print ("Įvesties įtampa:"); Serial.print (įvesties_įtampa); Serial.print ("- Įvesties srovė:"); Serial.print (įvesties_ srovė); Serial.print ("- Išėjimo įtampa:"); Serial.print (išėjimo įtampa); Serial.print ("- Išėjimo srovė:"); Serial.println (išvesties_ srovė); vėlavimas (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (įėjimo įtampa); display.setCursor (70, 0); ekranas.spauda („V“); }
Mes pradedame ciklo sekciją deklaruodami ir apibrėždami visus keturis kintamuosius kintamuosius. Mes iškviečiame atitinkamas funkcijas, perduodant pin_no kaip argumentą, nes ACS712 modulis gali pateikti neigiamas dabartines vertes. Mes naudojame matematikos bibliotekos abs () funkciją, kad neigiama reikšmė būtų teigiama. Tada nuosekliai išspausdiname visas derinimo reikšmes. Tada mes išvalysime ekraną, nustatysime žymeklį ir išspausdinsime vertes. Tai darome visiems simboliams, rodomiems ekrane. Kuris žymi ciklo funkcijos ir programos pabaigą.
„Arduino“ ir ESP32 efektyvumo matuoklio testavimas
Kaip matote mano bandymo sąranką aukščiau esančiame paveikslėlyje. Aš turiu savo 30 V transformatorių kaip įvestį, o matuoklis yra prijungtas prie testo plokštės. Kroviniui naudoju „LM2596“ pagrindo keitiklio plokštę ir lygiagrečiai naudoju tris 10 omų rezistorius.
Kaip matote aukščiau esančiame paveikslėlyje, aš prisijungiau prie kelių skaitiklių, kad galėčiau patikrinti įvesties ir išėjimo įtampą. Transformatorius gamina beveik 32 V įtampą, o „buck“ keitiklio galia yra 3,95 V.
Čia pateiktas vaizdas rodo išėjimo srovę, matuojamą mano efektyvumo matuokliu ir multimetru. Kaip matote, multimetras rodo.97 amperus, o jei šiek tiek priartinate, tai rodo 1.0A, jis šiek tiek išjungtas dėl nelinijiškumo, esančio ACS712 modulyje, tačiau tai tarnauja mūsų tikslams. Norėdami gauti išsamų paaiškinimą ir bandymą, galite peržiūrėti vaizdo įrašą mūsų vaizdo įrašų skyriuje.
Kiti patobulinimai
Šioje demonstracijoje grandinė pagaminta ant rankų darbo PCB, tačiau grandinę galima lengvai pastatyti geros kokybės PCB. Mano eksperimente PCB dydis yra tikrai didelis dėl komponentų dydžio, tačiau gamybos aplinkoje jį galima sumažinti naudojant pigius SMD komponentus. Grandinėje taip pat nėra jokios įmontuotos apsaugos funkcijos, todėl įtraukus apsaugos grandinę bus pagerintas bendras grandinės saugos aspektas. Be to, rašydamas kodą pastebėjau, kad ESP32 ADC nėra toks puikus. Įtraukus išorinį ADC, pvz., ADS1115 modulį, padidės bendras stabilumas ir tikslumas.
Tikiuosi, kad šis straipsnis jums patiko ir iš jo sužinojote kažką naujo. Jei turite kokių nors abejonių, galite paklausti žemiau pateiktų komentarų arba pasinaudoti mūsų forumais išsamiai diskusijai.