- Mga Materyal na Kinakailangan para sa ESP32 Power Meter
- Arduino at ESP32 Batay sa Kahusayan Meter - Circuit Diagram
- Disenyo ng PCB para sa Arduino at ESP32 Batay sa Kahusayan Meter
- Arduino at ESP32 Batay sa Kahusayan Meter - Code
- Pagsubok sa Arduino at ESP32 Batay sa Kahusayan Meter
- Karagdagang Mga Pagpapahusay
Lahat tayo ay may kamalayan sa isang pangunahing voltmeter, ammeter, at wattmeters, ang tatlong pangunahing mga bagay na kailangan mo upang masukat ang mga halaga sa anumang mga elektronikong proyekto o circuit. Ang pagsukat ng boltahe at kasalukuyang sa tulong ng isang multimeter ay maaaring maging isang mahusay na paraan upang magsimula, ngunit ang isa sa mga pinakamalaking problema na kinakaharap ko habang sinusubukan ang isang circuit ay, pagsukat ng kahusayan ng kuryente. Kaya, ngayon ay malulutas natin ang problemang iyon sa pamamagitan ng pagbuo ng isang Arduino at ESP32 na batay sa metro ng kahusayan na maaaring sukatin ang input boltahe, kasalukuyang pag-input, output boltahe, at kasalukuyang output. Samakatuwid, masusukat nito ang lakas ng pag-input at output na lakas nang sabay, at sa mga halagang ito, madali nating masusukat ang kahusayan. Dati, gumawa din kami ng isang bagay na halos kapareho sa aming proyekto ng Arduino Batay sa Wattmeter, ngunit dito susukatin namin ang parehong lakas ng pag-input at lakas ng paglabas sa kalkulahin ang kahusayan ng kuryente.
Sa halip na bumili ng apat na metro para sa trabaho, malulutas namin ang problemang ito sa pamamagitan ng pagsasama ng mga kakayahan ng lahat ng apat na metro sa isa. Ang pagbuo ng iyong digital meter ay hindi lamang binabawasan ang gastos ngunit binibigyan ka rin ng isang wiggle room para sa mga pag-upgrade at pagpapabuti. Habang gumagamit kami ng isang ESP32 upang maitayo ang proyektong ito, madali naming napapagana ang meter na ito ng IoT at nag-log ng data sa web, na siyang paksa para sa hinaharap na proyekto. Sa lahat ng mga pangunahing kaalaman na na-clear, sabihin mismo dito.
Tandaan: Ang power meter na ito ay dinisenyo para sa DC circuit. Kung naghahanap ka upang masukat ang kasalukuyang AC upang makalkula ang kahusayan ng kuryente ng AC maaari mong suriin ang IoT batay sa Elektrisidad na Meterong Enerhiya at Mga Proyekto ng Prepaid Energy Meter.
Mga Materyal na Kinakailangan para sa ESP32 Power Meter
Ipinapakita ng imahe sa ibaba ang mga materyales na ginamit upang mabuo ang circuit. Dahil ginawa ito ng mga napaka-pangkaraniwang bahagi, dapat mong mahanap ang lahat ng nakalistang materyal sa iyong lokal na tindahan ng libangan.
Inilista ko rin ang mga sangkap sa ibaba kasama ang kinakailangang dami. Kung ikaw mismo ang nagtatayo ng circuit, lubos na inirerekumenda na kunin ang lahat ng mga materyal mula sa listahan sa ibaba.
- Lupon ng ESP32 - 1
- 128X64 OLED - 1
- ACS712-20 IC - 2
- DC Barrel Jack - 1
- 100uF Capacitor - 2
- 104pF - 2
- 102pF - 2
- 10K, 1% - 4
- 68K, 1% - 2
- 6.8K, 1% - 2
Arduino at ESP32 Batay sa Kahusayan Meter - Circuit Diagram
Ang eskematiko para sa Arduino at ESP32 Batay sa Kahusayan sa Metro ay ipinapakita sa ibaba. Ang paglikha ng circuit na ito ay napaka-simple at gumagamit ng mga generic na bahagi.
Ang pagpapatakbo ng circuit ay napaka-simple. Susukat namin ang boltahe at kasalukuyang sa proyektong ito ngunit sa isang natatanging paraan. Sinusukat namin ang boltahe at kasalukuyang para sa parehong input at output, kaya't maaari naming makita ang kahusayan ng circuit. Napaka-madaling gamiting ito para sa ilang mga proyekto. Ang isang halimbawa ay maaaring isang DC to DC converter kung saan ang pagsukat ng kahusayan ay nagiging sapilitan. Ang paraan ng paggana ng circuit na ito ay inilarawan sa ibaba.
Ang ACS712 Kasalukuyang Sensor IC:
Tulad ng nakikita mo sa larawan sa itaas, gumagamit kami ng isang ACS712 Kasalukuyang Sensor IC upang masukat ang kasalukuyang. Ito ay isang napaka-kagiliw-giliw na IC dahil ginagamit nito ang Hall-effect upang masukat ang kasalukuyang, mayroong tatlong mga pagkakaiba-iba ng IC na ito na matatagpuan sa merkado f (o 5A, 20A, at 30A). Ginagamit namin ang iba't ibang 20A nito at may label ito bilang ACS712-20.
Inirekomenda ng ACS712 datasheet isang saklaw ng boltahe na 4.5 - 5.5 upang maayos na gumana. At habang susukatin namin ang kasalukuyang gamit ang isang ESP32, tatanggap lang ito ng 3.3V, kaya't gumamit ako ng isang divider ng boltahe na may dalawang resistors na 10K upang maibaba ang boltahe ng output ng ACS712 IC. Kapag walang kasalukuyang dumadaloy sa pamamagitan ng IC, output ito ng 2.5V, at kapag ang ilang halaga ng kasalukuyang dumadaloy sa pamamagitan ng IC, alinman ay pinabababa ang boltahe o pinapataas nito ang boltahe depende sa kasalukuyang direksyon ng daloy. Gumamit kami ng dalawa sa mga IC na ito upang masukat ang kasalukuyang pag-input at output. Suriin ang aming mga nakaraang proyekto (sa ibaba) kung saan ginamit namin ang ACS712 Sensor na ito.
- Ang metro ng Energy Energy na IoT Batay sa IoT gamit ang Arduino at ESP8266 Wi-Fi module
- Digital Ammeter Circuit gamit ang PIC Microcontroller at ACS712
Kung saan tinalakay namin nang detalyado ang pagtatrabaho ng mga sensor na ito. Maaari mong suriin ang mga iyon kung nais mong malaman ang tungkol sa mga sensor na ito.
Ang Divider ng Boltahe:
Upang sukatin ang input at output boltahe, mayroon kaming dalawang mga divider ng boltahe sa input at ang output na bahagi ng circuit. Ang maximum na boltahe na maaaring masukat ng circuit ay 35V, ngunit madali itong mabago sa pamamagitan ng pagbabago ng mga halaga ng risistor para sa voltner divider.
Ang Voltage Regulator:
Ang isang pangkaraniwang LM7805 boltahe regulator ay ginagamit upang paandarin ang mga ESP32, OLED, at ACS712 ICs. Habang pinapalakas namin ito ng may malinis na lakas, walang ginagamit na mga decoupling capacitor, ngunit gumamit kami ng 100uF capacitors sa parehong input at output upang patatagin ang IC.
Ang ESP32 IC at ang OLED Display:
Gumamit kami ng isang ESP32 bilang pangunahing processor, na responsable para sa lahat ng mga pagbasa, kalkulasyon, input, at output. Gayundin, gumamit kami ng isang 128X64 OLED display upang malaman ang mga halaga.
Disenyo ng PCB para sa Arduino at ESP32 Batay sa Kahusayan Meter
Ang PCB para sa aming Arduino at ESP32 Batay sa Kahusayan Meter ay dinisenyo sa isang solong panig na board. Ginamit ko ang Eagle upang idisenyo ang aking PCB ngunit maaari mong gamitin ang anumang software ng disenyo na iyong pinili. Ang imahe ng 2D ng aking disenyo ng board ay ipinapakita sa ibaba.
Ginagamit ang sapat na trace ng lupa upang makagawa ng wastong mga koneksyon sa lupa sa lahat ng mga bahagi. Gayundin, tinitiyak naming gumamit ng wastong 5V at 3.3V na mga bakas upang mabawasan ang ingay at mapabuti ang kahusayan.
- Mag-download ng Disenyo ng PCB at GERBER na mga file na Arduino at metro ng Kahusayan na Batay sa ESP32
Handmade PCB:
Para sa kaginhawaan at pagsubok, ginawa ko ang aking bersyon na gawa sa kamay ng PCB at ipinakita ito sa ibaba. Sa unang bersyon, gumawa ako ng ilang mga pagkakamali, na naitama ko gamit ang ilang mga wire ng lumulukso. Ngunit sa huling bersyon, naayos ko ang mga iyon, maaari mo lamang i-download ang mga file at gamitin ang mga ito.
Arduino at ESP32 Batay sa Kahusayan Meter - Code
Ngayon, na mayroon kaming mahusay na pag-unawa sa panig ng hardware ng mga bagay, maaari naming buksan ang Arduino IDE at simulan ang aming pag-coding. Ang layunin ng code ay basahin ang boltahe ng analog mula sa pin 35 at 33 ng board ng ESP32. Gayundin, binasa namin ang boltahe mula sa 32, at 34 pin na kung saan ay ang kasalukuyang halaga. Kapag nagawa natin ito, maaari nating i-multiply ang mga iyon upang makakuha ng lakas ng pag-input at output na lakas, at ilagay ito sa formula ng kahusayan, makukuha natin ang kahusayan.
Panghuli, ipinapakita namin ito sa LCD screen. Ang kumpletong programa upang gawin ang pareho ay ibinibigay sa dulo, na maaaring magamit tulad ng para sa hardware na tinalakay sa itaas. Dagdag dito, ang code ay nahahati sa maliit na mga snippet at ipinaliwanag.
Habang gumagamit kami ng isang 128X64 OLED display, kailangan namin ng Adafruit_GFX library at Adafruit_SSD1306 library upang makipag-usap sa display. Maaari mong i-download ang pareho sa kanila mula sa default board manager manager ng Arduino; kung nagkakaroon ka ng anumang mga isyu sa bahagi ng board manager, maaari mo ring i-download at isama ang mga aklatan mula sa nauugnay na GitHub repository, na ibinibigay sa ibaba.
- Mag-download ng Adafruit_GFX library
- Mag-download ng Adafruit_SSD1306 library
Tulad ng nakasanayan, sinisimulan namin ang aming code sa pamamagitan ng pagsasama ng lahat ng mga kinakailangang aklatan. Pagkatapos ay tinukoy namin ang lahat ng kinakailangang mga pin at variable na ang lahat ay ipinapakita sa ibaba.
# isama
Ang SCREEN_WIDTH & SCREEN_HEIGHT kahulugan ay ginagamit upang tukuyin ang laki ng screen. Susunod na natukoy namin ang lahat ng kinakailangang mga pin, kung saan sususukatin namin ang boltahe at kasalukuyang. Susunod, tinukoy namin ang mga halaga ng risistor na ginagamit sa hardware na nakikita mo mula sa eskematiko. Kung wala kang mga halagang ito o kung nais mong baguhin ang saklaw ng metro, maaari mong baguhin ang mga halagang iyon, gagana lang ang code.
Habang gumagamit kami ng isang ACS712 upang masukat ang kasalukuyang, kailangan namin ang halagang mVperAmp upang makalkula ang kasalukuyang mula sa boltahe. Habang gumagamit ako ng isang 20A ACS712 module, ang mV / A na halaga ay 100 na ibinigay sa datasheet. Ngunit dahil gumagamit kami ng isang ESP32 at isang divider ng boltahe, magkakaroon kami ng kalahati ng halaga na 50, at iyon ang dahilan kung bakit inilagay namin ang mV / AMP na halaga.
Ang ACSoffset ay ang offset na kinakailangan para sa pagkalkula ng kasalukuyang mula sa boltahe. Tulad ng ACS712 IC's ay pinalakas mula sa 5V, ang offset voltage ay 2.5V. Ngunit habang gumagamit kami ng isang divider ng boltahe, bumaba ito sa 1.25V. Maaaring alam mo na ang crappy ADC ng ESP32, kaya't kailangan kong gumamit ng halagang 1136. Kung nagkakaroon ka ng mga isyu sa pagkakalibrate, maaari mong sabunutan ang mga halaga at mabayaran ang ADC.
Sa wakas, natatapos namin ang seksyon na ito sa pamamagitan ng paggawa ng isang display object ng klase ng Adafruit_SSD1306 at pagpasa sa lapad ng screen, taas, pagsasaayos ng 2 C, at ang huling -1 na parameter ay ginagamit upang tukuyin ang pag-andar ng pag-reset. Kung ang iyong display ay walang panlabas na pag-reset ng pin (na tiyak na para sa aking display), pagkatapos ay kailangan mong gumamit ng -1 para sa huling pagtatalo.
void setup () {Serial.begin (115200); kung (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Address 0x3D para sa 128x64 Serial.println (F ("Nabigo ang paglalaan ng SSD1306")); para sa (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); pagkaantala (100); }
Susunod, mayroon kaming seksyon ng aming pag- set () . Sa seksyong ito, pinapagana namin ang serial para sa pag-debug, sinusuri namin kung ang isang I 2 C display ay magagamit o hindi sa tulong ng panimulang pamamaraan ng display object. Gayundin, itinakda namin ang I 2 C address. Susunod, nililinaw namin ang display gamit ang malinaw naDisplay () na pamamaraan. Gayundin, paikutin namin ang display sa pamamaraan ng setRotation , ito ay dahil ginulo ko ang aking disenyo ng PCB. Susunod, naglalagay kami ng isang pagkaantala ng 100 ms para magkabisa ang mga pagpapaandar. Kapag tapos na iyon, maaari na tayong magpatuloy sa pag-andar ng loop. Ngunit bago magpatuloy sa pag-andar ng loop, kailangan nating talakayin ang dalawang iba pang mga pagpapaandar na return_voltage_value () , at return_current_value () .
dobleng return_voltage_value (int pin_no) {doble tmp = 0; dobleng ADCVoltage = 0; doble inputVoltage = 0; doble avg = 0; para sa (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } avg = tmp / 150; ADCVoltage = ((avg * 3.3) / (4095)) + 0.138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // formula para sa pagkalkula ng boltahe sa ie GND return inputVoltage; }
Ang function na return_voltage_value () ay ginagamit upang sukatin ang boltahe na papasok sa ADC, at kinukuha ang pin_no bilang isang pagtatalo. Sa pagpapaandar na ito, nagsisimula kami sa pamamagitan ng pagdedeklara ng ilang mga variable, na kung saan ay tmp, ADCVoltage, inputVoltage, at avg. Ginagamit ang variable ng tmp upang maiimbak ang pansamantalang halaga ng ADC na makukuha natin mula sa pagpapaandar ng analogRead (), pagkatapos ay i-average namin ito ng 150 beses sa isang para sa loop, at iniimbak namin ang halaga sa isang variable na tinatawag na avg. Pagkatapos ay kinakalkula namin ang ADCVoltage mula sa ibinigay na formula, sa wakas, kinakalkula namin ang input boltahe at ibabalik ang mga halaga. Ang nakikita mong halagang +0.138 ay ang halaga ng pagkakalibrate na ginamit ko upang i-calibrate ang antas ng boltahe, maglaro kasama ang halagang ito kung nakakakuha ka ng anumang mga error.
dobleng return_current_value (int pin_no) {doble tmp = 0; doble avg = 0; dobleng ADCVoltage = 0; doble na Amps = 0; para sa (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } avg = tmp / 150; ADCVoltage = ((avg / 4095.0) * 3300); // Nakakakuha ka ng mV Amps = ((ADCVoltage - ACSoffset) / mVperAmp); ibalik ang mga Amps; }
Susunod, mayroon kaming function na return_current_value () . Ang pagpapaandar na ito ay tumatagal din ng pin_no bilang argument. Sa pagpapaandar na ito mayroon din kaming apat na variable viz. tmp, avg, ADCVoltage, at Amps
Susunod, binasa namin ang pin na may pag- andar ng analogRead () at average ito ng 150 beses, susunod na ginagamit namin ang formula upang makalkula ang ADCvoltage, na kinakalkula namin ang kasalukuyang at ibabalik namin ang halaga. Sa pamamagitan nito, maaari tayong lumipat sa seksyon ng loop.
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 ("Boltahe ng Input:"); Serial.print (input_voltage); Serial.print ("- Kasalukuyang Input:"); Serial.print (input_current); Serial.print ("- Boltahe ng Output:"); Serial.print (output_voltage); Serial.print ("- Kasalukuyang Output:"); Serial.println (output_current); pagkaantala (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); ipakitai-print ("V"); }
Sinisimula namin ang seksyon ng loop sa pamamagitan ng pagdedeklara at pagtukoy ng ilang mga variable ng float, sa lahat ng apat na variable. Tinatawagan namin ang kani-kanilang mga pag-andar, na ipinapasa ang pin_no bilang isang argument, dahil ang module ng ACS712 ay maaaring ibalik ang mga kasalukuyang halaga sa negatibo. Ginagamit namin ang pagpapaandar ng abs () ng library ng matematika upang gawing positibo ang negatibong halaga. Susunod, serial na naka-print namin ang lahat ng mga halaga para sa pag-debug. Susunod, nililinaw namin ang display, itinakda ang cursor, at nai-print ang mga halaga. Ginagawa namin ito para sa lahat ng mga character na ipinakita sa display. Alin ang nagmamarka ng pagtatapos ng pag-andar ng loop at ng programa.
Pagsubok sa Arduino at ESP32 Batay sa Kahusayan Meter
Tulad ng nakikita mo ang aking pag-set up ng pagsubok sa imahe sa itaas. Mayroon akong aking 30V transpormer bilang input, at mayroon akong aking meter na naka-hook para sa test board. Gumagamit ako ng isang LM2596 based buck converter board at para sa pag-load at gumagamit ako ng tatlong 10 Ohms resistors, sa parallel.
Tulad ng nakikita mo sa imahe sa itaas, nakakonekta ako sa multi-meter upang suriin ang input at output boltahe. Ang transpormer ay gumagawa ng halos 32V at ang output ng buck converter ay 3.95V.
Ipinapakita ng imahe dito ang kasalukuyang output na sinusukat ng aking metro ng kahusayan at ng multimeter. Tulad ng nakikita mo, nagpapakita ang multimeter ng.97 Amps, at kung mag-zoom ka nang kaunti, nagpapakita ito ng 1.0A, bahagyang off ito dahil sa hindi linearity na naroroon sa module ng ACS712 ngunit nagsisilbi ito sa aming layunin. Para sa isang detalyadong paliwanag at pagsubok, maaari mong suriin ang video sa aming seksyon ng video.
Karagdagang Mga Pagpapahusay
Para sa pagpapakitang ito, ang circuit ay ginawa sa isang handmade PCB ngunit ang circuit ay maaaring madaling maitayo sa isang mahusay na kalidad ng PCB. Sa aking eksperimento, ang laki ng PCB ay talagang malaki dahil sa laki ng bahagi, ngunit sa isang kapaligiran sa produksyon, maaari itong mabawasan sa pamamagitan ng paggamit ng murang mga bahagi ng SMD. Ang circuit ay wala ring anumang tampok na proteksyon na built-in, kaya't ang pagsasama ng isang circuit ng proteksyon ay magpapabuti sa pangkalahatang aspeto ng kaligtasan ng circuit. Gayundin, habang sinusulat ang code, napansin ko ang ADC ng ESP32 ay hindi ganon kahusay. Ang pagsasama ng isang panlabas na ADC tulad ng module ng ADS1115 ay magpapataas sa pangkalahatang katatagan at kawastuhan.
Inaasahan kong nagustuhan mo ang artikulong ito at may natutunan na bago dito. Kung mayroon kang anumang pag-aalinlangan, maaari kang magtanong sa mga komento sa ibaba o maaaring magamit ang aming mga forum para sa detalyadong talakayan.