- Nødvendige materialer til ESP32 Power Meter
- Arduino og ESP32-baseret effektivitetsmåler - kredsløbsdiagram
- Printkortdesign til Arduino og ESP32-baseret effektivitetsmåler
- Arduino og ESP32-baseret effektivitetsmåler - kode
- Test af Arduino- og ESP32-baseret effektivitetsmåler
- Yderligere forbedringer
Vi er alle opmærksomme på et grundlæggende voltmeter, amperemeter og wattmeter, de tre grundlæggende ting, du har brug for for at måle værdier på ethvert elektronisk projekt eller kredsløb. Måling af spænding og strøm ved hjælp af et multimeter kan være en god måde at starte på, men et af de største problemer, jeg står over for, når jeg tester et kredsløb, er at måle strømeffektivitet. Så i dag løser vi dette problem ved at opbygge en Arduino- og ESP32-baseret effektivitetsmåler, der kan måle indgangsspænding, indgangsstrøm, udgangsspænding og udgangsstrøm. Derfor kan den måle indgangseffekt og udgangseffekt på samme tid, og med disse værdier kan vi nemt måle effektiviteten. Tidligere har vi også gjort noget meget lignende i vores Arduino-baserede Wattmeter-projekt, men her måler vi både indgangseffekt og udgangseffekt til beregne effektivitet.
I stedet for at købe fire meter til jobbet, vil vi være i stand til at løse dette problem ved at inkorporere alle fire meters kapaciteter i en. Opbygning af din digitale måler reducerer ikke kun omkostninger, men giver dig også et vridningsrum til opgraderinger og forbedringer. Da vi bruger en ESP32 til at opbygge dette projekt, kan vi let gøre denne meter IoT-aktiveret og logge data over internettet, hvilket er emnet for det fremtidige projekt. Med alt det grundlæggende ryddet ud, lad os komme lige ind i det.
Bemærk: Denne effektmåler er designet til jævnstrømskredsløb. Hvis du ønsker at måle vekselstrøm til beregnet vekselstrømseffektivitet, kan du tjekke de IoT-baserede elenergimålere og forudbetalte energimålerprojekter.
Nødvendige materialer til ESP32 Power Meter
Billedet nedenfor viser de materialer, der blev brugt til at bygge kredsløbet. Da dette er lavet med meget generiske komponenter, skal du være i stand til at finde alt det anførte materiale i din lokale hobbybutik.
Jeg har også angivet nedenstående komponenter sammen med den krævede mængde. Hvis du selv bygger kredsløbet, anbefales det stærkt at hente alt materialet fra nedenstående liste.
- ESP32-kort - 1
- 128X64 OLED - 1
- ACS712-20 IC - 2
- DC Barrel Jack - 1
- 100uF kondensator - 2
- 104pF - 2
- 102pF - 2
- 10K, 1% - 4
- 68K, 1% - 2
- 6,8K, 1% - 2
Arduino og ESP32-baseret effektivitetsmåler - kredsløbsdiagram
Skematisk for Arduino- og ESP32-baseret effektivitetsmåler er vist nedenfor. Oprettelse af dette kredsløb er meget simpelt og bruger generiske komponenter.
Driften af kredsløbet er meget enkel. Vi måler spændingen og strømmen i dette projekt, men på en unik måde. Vi måler spænding og strøm for både input og output, og derfor kan vi se kredsløbets effektivitet. Dette kommer meget praktisk til nogle projekter. Et eksempel kan være en DC til DC-konverter, hvor effektivitetsmåling bliver obligatorisk. Den måde, disse kredsløb fungerer på, er beskrevet nedenfor.
ACS712 nuværende sensor IC:
Som du kan se på ovenstående billede bruger vi en ACS712 IC-strømsensor til at måle strøm. Dette er en meget interessant IC, da den bruger Hall-effekten til at måle strøm, der er tre varianter af denne IC, der kan findes på markedet f (eller 5A, 20A og 30A). Vi bruger 20A-varianten af dette, og det er mærket som ACS712-20.
ACS712-databladet anbefaler et spændingsområde på 4,5 - 5,5 til at fungere problemfrit. Og da vi skal måle strømmen med en ESP32, er den kun 3,3 V tolerant, hvorfor jeg har brugt en spændingsdeler med to 10K modstande for at bringe udgangsspændingen på ACS712 IC ned. Når der ikke strømmer nogen strøm gennem IC'en, afgiver den 2,5V, og når en vis mængde strøm strømmer gennem IC'en, sænker den enten spændingen eller øger spændingen afhængigt af strømningsretningen. Vi har brugt to af disse IC'er til at måle input og output strøm. Tjek vores tidligere projekter (nedenfor), hvor vi brugte denne ACS712-sensor.
- IoT-baseret elenergimåler ved hjælp af Arduino og ESP8266 Wi-Fi-modul
- Digital amperemeter kredsløb ved hjælp af PIC Microcontroller og ACS712
Hvor vi diskuterede funktionen af disse sensorer i detaljer. Du kan tjekke dem ud, hvis du vil vide mere om disse sensorer.
Spændingsdeleren:
For at måle indgangs- og udgangsspændingen har vi to spændingsdelere på indgangs- og udgangssiden af kredsløbet. Den maksimale spænding, som kredsløbet kan måle, er 35V, men det kan let ændres ved at ændre modstandsværdierne for spændingsdeleren.
Spændingsregulatoren:
En generisk LM7805 spændingsregulator bruges til at drive ESP32, OLED og ACS712 IC'erne. Da vi tænder for det med temmelig ren strøm, anvendes der ikke afkoblingskondensatorer, men vi har brugt 100uF kondensatorer ved både input og output til at stabilisere IC.
ESP32 IC og OLED-skærmen:
Vi har brugt en ESP32 som hovedprocessor, som er ansvarlig for alle aflæsninger, beregninger, input og output. Vi har også brugt en 128X64 OLED-skærm til at kende værdierne.
Printkortdesign til Arduino og ESP32-baseret effektivitetsmåler
Printkortet til vores Arduino- og ESP32-baserede effektivitetsmåler er designet på et ensidet kort. Jeg har brugt Eagle til at designe min PCB, men du kan bruge enhver designsoftware efter eget valg. 2D-billedet af mit kortdesign er vist nedenfor.
Tilstrækkelig jordspor bruges til at skabe korrekte jordforbindelser mellem alle komponenterne. Vi sørgede også for at bruge korrekte 5V- og 3.3V-spor for at reducere støj og forbedre effektiviteten.
- Download PCB Design og GERBER filer Arduino og ESP32-baseret effektivitetsmåler
Håndlavet printkort:
For nemheds skyld og testning lavede jeg min håndlavede version af printkortet, og det er vist nedenfor. I den første version lavede jeg nogle fejl, som jeg fik rettet ved hjælp af nogle jumperledninger. Men i den endelige version fik jeg dem løst, du kan bare downloade filerne og bruge dem.
Arduino og ESP32-baseret effektivitetsmåler - kode
Nu hvor vi har en god forståelse af hardware-siden af tingene, kan vi åbne Arduino IDE og starte vores kodning. Formålet med koden er at læse den analoge spænding fra pin 35 og 33 på ESP32-kortet. Vi læser også spændingen fra 32 og 34 pin, som er den aktuelle værdi. Når vi har gjort dette, kan vi multiplicere dem for at få indgangseffekt og udgangseffekt, og ved at sætte det på effektivitetsformlen kan vi få effektiviteten.
Endelig viser vi det på LCD-skærmen. Det komplette program til at gøre det samme er givet i slutningen, som kan bruges som sådan til den hardware, der er diskuteret ovenfor. Yderligere er koden opdelt i små uddrag og forklaret.
Da vi bruger en 128X64 OLED-skærm, har vi brug for Adafruit_GFX-biblioteket og Adafruit_SSD1306-biblioteket for at kommunikere med skærmen. Du kan downloade dem begge fra Arduinos standardkortadministrationsterminal; hvis du har problemer med bestyrelsesadministratordelen, kan du også downloade og inkludere bibliotekerne fra det tilknyttede GitHub-arkiv, som er angivet nedenfor.
- Download Adafruit_GFX bibliotek
- Download Adafruit_SSD1306 bibliotek
Som altid begynder vi vores kode med at inkludere alle de krævede biblioteker. Derefter definerer vi alle de nødvendige ben og variabler, som alle er vist nedenfor.
#omfatte
De SCREEN_WIDTH & SCREEN_HEIGHT definitioner anvendes til at definere skærmstørrelsen. Dernæst har vi defineret alle de nødvendige stifter, hvorigennem vi skal måle spænding og strøm. Dernæst har vi defineret de modstandsværdier, der bruges i hardwaren, som du kan se fra skematisk. Hvis du ikke har disse værdier, eller hvis du vil ændre målerens rækkevidde, kan du ændre disse værdier, koden fungerer fint.
Da vi bruger en ACS712 til at måle strømmen, har vi brug for mVperAmp- værdien for at beregne strømmen fra spænding. Da jeg bruger et 20A ACS712-modul, er mV / A-værdien 100 som angivet i databladet. Men fordi vi bruger en ESP32 og en spændingsdeler, har vi halvdelen af den værdi, der er 50, og det er derfor, vi har sat mV / AMP-værdien i.
ACSoffset er den offset, der er nødvendig til beregning af strømmen fra spændingen. Da ACS712 IC'erne får strøm fra 5V, er forskydningsspændingen 2,5V. Men da vi bruger en spændingsdeler, går den ned til 1,25V. Du kender muligvis allerede den skøre ADC i ESP32, så jeg var nødt til at bruge en værdi på 1136. Hvis du har kalibreringsproblemer, kan du tilpasse værdierne og kompensere for ADC.
Endelig afslutter vi dette afsnit med at oprette et displayobjekt i Adafruit_SSD1306- klassen og passere skærmbredde, højde, I 2 C-konfiguration, og den sidste -1-parameter bruges til at definere nulstillingsfunktionen. Hvis din skærm ikke har en ekstern reset-pin (som bestemt er til min skærm), skal du bruge -1 til det sidste argument.
ugyldig opsætning () {Serial.begin (115200); hvis (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresse 0x3D for 128x64 Serial.println (F ("SSD1306 allokering mislykkedes")); til (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); forsinkelse (100); }
Dernæst har vi vores opsætning () sektion. I dette afsnit aktiverer vi seriel til fejlfinding, vi kontrollerer, om en I 2 C-skærm er tilgængelig eller ikke ved hjælp af startmetoden til displayobjektet. Vi indstiller også I 2 C-adressen. Dernæst rydder vi skærmen med metoden clearDisplay () . Vi roterer også skærmen med setRotation- metoden, det er fordi jeg har ødelagt mit printkortdesign. Dernæst sætter vi en forsinkelse på 100 ms for at funktionerne træder i kraft. Når det er gjort, kan vi nu gå videre til loop-funktionen. Men før man går videre til løkken funktion, er vi nødt til at diskutere to andre funktioner, der er return_voltage_value () , og return_current_value () .
dobbelt return_voltage_value (int pin_no) {dobbelt tmp = 0; dobbelt ADCVoltage = 0; dobbelt inputVoltage = 0; dobbelt gennemsnit = 0; for (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } gennemsnit = tmp / 150; ADCVoltage = ((gennemsnit * 3.3) / (4095)) + 0.138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // formel til beregning af spænding i dvs. GND return inputVoltage; }
Funktionen return_voltage_value () bruges til at måle spændingen, der kommer ind i ADC, og den tager pin_no som et argument. I denne funktion starter vi med at erklære nogle variabler, som er tmp, ADCVoltage, inputVoltage og avg. Tmp-variablen bruges til at gemme den midlertidige ADC-værdi, som vi får fra analogRead () -funktionen, så beregner vi den gennemsnitligt 150 gange i en for-loop, og vi gemmer værdien til en variabel kaldet avg. Vi beregner derefter ADCVoltage fra den givne formel, endelig beregner vi indgangsspændingen og returnerer værdierne. Den +0,138-værdi, du ser, er den kalibreringsværdi, jeg brugte til at kalibrere spændingsniveauet. Spil rundt med denne værdi, hvis du får fejl.
dobbelt return_current_value (int pin_no) {dobbelt tmp = 0; dobbelt gennemsnit = 0; dobbelt ADCVoltage = 0; dobbelt forstærker = 0; for (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } gennemsnit = tmp / 150; ADCVoltage = ((gennemsnit / 4095.0) * 3300); // Får dig mV Amps = ((ADCVoltage - ACSoffset) / mVperAmp); returforstærkere; }
Dernæst har vi funktionen return_current_value () . Denne funktion tager også pin_no som argument. I denne funktion har vi også fire variabler, nemlig. tmp, avg, ADCVoltage og Amps
Dernæst læser vi stiften med analogRead () -funktionen og gennemsnittet den 150 gange, derefter bruger vi formlen til at beregne ADCvoltage, med det beregner vi strømmen og returnerer værdien. Med det kan vi gå videre til loop-sektionen.
ugyldig sløjfe () {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 ("Input Voltage:"); Serial.print (input_voltage); Serial.print ("- Indgangsstrøm:"); Serial.print (input_current); Serial.print ("- Udgangsspænding:"); Serial.print (output_voltage); Serial.print ("- Udgangsstrøm:"); Serial.println (output_current); forsinkelse (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); Skærm.print ("V"); }
Vi starter loop-sektionen med at erklære og definere nogle floatvariabler i alle fire variabler. Vi kalder de respektive funktioner og sender pin_no som et argument, da ACS712-modulet kan returnere aktuelle værdier i negativ. Vi bruger abs () -funktionen i matematikbiblioteket til at gøre den negative værdi som positiv. Dernæst serieludskriver vi alle værdierne til fejlfinding. Dernæst rydder vi displayet, indstiller markøren og udskriver værdierne. Vi gør dette for alle de tegn, der vises på displayet. Hvilket markerer afslutningen på loop-funktionen og programmet.
Test af Arduino- og ESP32-baseret effektivitetsmåler
Som du kan se min testopsætning i ovenstående billede. Jeg har min 30V transformer som input, og jeg har min meter tilsluttet testkortet. Jeg bruger et LM2596-baseret buck-konverterkort og til belastningen, og jeg bruger tre 10 ohm modstande parallelt.
Som du kan se i ovenstående billede, har jeg tilsluttet multimetre for at kontrollere input og output spænding. Transformeren producerer næsten 32V, og outputen fra buck-konverteren er 3,95V.
Billedet her viser outputstrømmen målt af min effektivitetsmåler og multimeteret. Som du kan se, viser multimeteret.97 ampere, og hvis du zoomer en smule ind, viser det 1.0A, det er lidt slukket på grund af ikke-linearitet, der findes i ACS712-modulet, men dette tjener vores formål. For en detaljeret forklaring og test kan du tjekke videoen i vores videoafsnit.
Yderligere forbedringer
Til denne demonstration er kredsløbet lavet på et håndlavet printkort, men kredsløbet kan let bygges i et printkort af god kvalitet. I mit eksperiment er printkortstørrelsen virkelig stor på grund af komponentstørrelsen, men i et produktionsmiljø kan den reduceres ved hjælp af billige SMD-komponenter. Kredsløbet har heller ikke nogen indbygget beskyttelsesfunktion, så inkludering af et beskyttelseskredsløb vil forbedre det samlede sikkerhedsaspekt af kredsløbet. Mens jeg skrev koden, bemærkede jeg også, at ADC'en til ESP32 ikke er så stor. Inkludering af en ekstern ADC som ADS1115-modulet øger den samlede stabilitet og nøjagtighed.
Jeg håber, du kunne lide denne artikel og lærte noget nyt ud af den. Hvis du er i tvivl, kan du spørge i kommentarerne nedenfor eller bruge vores fora til detaljeret diskussion.