- Materialer som kreves for ESP32 effektmåler
- Arduino og ESP32-basert effektivitetsmåler - kretsdiagram
- PCB Design for Arduino og ESP32-basert effektivitetsmåler
- Arduino og ESP32-basert effektivitetsmåler - kode
- Testing av Arduino og ESP32-basert effektivitetsmåler
- Ytterligere forbedringer
Vi er alle klar over et grunnleggende voltmeter, amperemeter og wattmeter, de tre grunnleggende tingene du trenger for å måle verdier på elektroniske prosjekter eller kretser. Måling av spenning og strøm ved hjelp av et multimeter kan være en god måte å starte, men et av de største problemene jeg møter når jeg tester en krets er å måle effektiviteten. Så i dag vil vi løse det problemet ved å bygge en Arduino- og ESP32-basert effektivitetsmåler som kan måle inngangsspenning, inngangsstrøm, utgangsspenning og utgangsstrøm. Derfor kan den måle inngangseffekt og utgangseffekt samtidig, og med disse verdiene kan vi enkelt måle effektiviteten. Tidligere har vi også gjort noe veldig likt i vårt Arduino-baserte Wattmeter-prosjekt, men her vil vi måle både inngangseffekt og utgangseffekt til beregne effektivitet.
I stedet for å kjøpe fire meter til jobben, vil vi være i stand til å løse dette problemet ved å inkludere alle fire meters kapasiteter i en. Å bygge den digitale måleren reduserer ikke bare kostnadene, men gir deg også et wiggle-rom for oppgraderinger og forbedringer. Når vi bruker en ESP32 for å bygge dette prosjektet, kan vi enkelt gjøre denne måleren IoT aktivert og logge data over nettet, som er temaet for det fremtidige prosjektet. Med alt det grunnleggende fjernet, la oss komme rett inn i det.
Merk: Denne effektmåleren er designet for DC-kretser. Hvis du ønsker å måle vekselstrøm til beregnet vekselstrømeffektivitet, kan du sjekke ut de IoT-baserte strømmåleren og forhåndsbetalte energimålerprosjekter.
Materialer som kreves for ESP32 effektmåler
Bildet nedenfor viser materialene som ble brukt til å bygge kretsen. Ettersom dette er laget med veldig generiske komponenter, bør du kunne finne alt det oppførte materialet i din lokale hobbybutikk.
Jeg har også listet opp komponentene nedenfor sammen med ønsket mengde. Hvis du selv bygger kretsen, anbefales det sterkt å hente alt materialet fra listen nedenfor.
- ESP32 Board - 1
- 128X64 OLED - 1
- ACS712-20 IC - 2
- DC fat jack - 1
- 100uF kondensator - 2
- 104pF - 2
- 102pF - 2
- 10K, 1% - 4
- 68 000, 1% - 2
- 6,8 tusen, 1% - 2
Arduino og ESP32-basert effektivitetsmåler - kretsdiagram
Skjematisk beskrivelse for Arduino- og ESP32-basert effektivitetsmåler er vist nedenfor. Å lage denne kretsen er veldig enkel og bruker generiske komponenter.
Driften av kretsen er veldig enkel. Vi skal måle spenningen og strømmen i dette prosjektet, men på en unik måte. Vi måler spenning og strøm for både inngang og utgang, og derfor kan vi se effektiviteten til kretsen. Dette er veldig nyttig for noen prosjekter. Et eksempel kan være en DC til DC-omformer der effektivitetsmåling blir obligatorisk. Måten disse kretsene fungerer på, er beskrevet nedenfor.
ACS712 gjeldende sensor IC:
Som du kan se på bildet ovenfor, bruker vi en ACS712 Current Sensor IC for å måle strøm. Dette er en veldig interessant IC ettersom den bruker Hall-effekten for å måle strøm, det er tre varianter av denne IC som finnes i markedet f (eller 5A, 20A og 30A). Vi bruker 20A-varianten av dette, og den er merket som ACS712-20.
ACS712-databladet anbefaler et spenningsområde på 4,5 - 5,5 for å fungere jevnt. Og ettersom vi skal måle strømmen med en ESP32, er den bare 3,3V tolerant, og det er derfor jeg har brukt en spenningsdeler med to 10K motstander for å få ned utgangsspenningen til ACS712 IC. Når ingen strøm strømmer gjennom ICen, gir den ut 2,5V, og når noe strøm strømmer gjennom ICen, senker den spenningen eller øker spenningen avhengig av strømningsretningen. Vi har brukt to av disse IC-ene til å måle inngangs- og utgangsstrøm. Sjekk ut våre tidligere prosjekter (nedenfor) der vi brukte denne ACS712-sensoren.
- IoT-basert elektrisitetsenergimåler ved hjelp av Arduino og ESP8266 Wi-Fi-modul
- Digital amperemeterkrets ved bruk av PIC Microcontroller og ACS712
Hvor vi diskuterte arbeidet med disse sensorene i detalj. Du kan sjekke dem ut hvis du vil vite mer om disse sensorene.
Spenningsdeleren:
For å måle inngangs- og utgangsspenningen har vi to spenningsdelere på inngangen og utgangssiden av kretsen. Maksimum spenning som kretsen kan måle er 35V, men den kan enkelt endres ved å endre motstandsverdiene for spenningsdeleren.
Spenningsregulatoren:
En generell spenningsregulator LM7805 brukes til å drive ESP32, OLED og ACS712 IC. Ettersom vi driver den opp med ganske ren kraft, brukes ingen frakoblingskondensatorer, men vi har brukt 100uF kondensatorer på både inngang og utgang for å stabilisere IC.
ESP32 IC og OLED-skjermen:
Vi har brukt en ESP32 som hovedprosessor, som er ansvarlig for alle målinger, beregninger, innganger og utganger. Vi har også brukt en 128X64 OLED-skjerm for å kjenne til verdiene.
PCB Design for Arduino og ESP32-basert effektivitetsmåler
PCB for Arduino- og ESP32-basert effektivitetsmåler er designet på et ensidig kort. Jeg har brukt Eagle til å designe PCB-en, men du kan bruke hvilken som helst designprogramvare du ønsker. 2D-bildet av taveldesignet mitt er vist nedenfor.
Tilstrekkelig bakkespor brukes til å lage riktig jordforbindelse mellom alle komponentene. Vi sørget også for å bruke riktige 5V- og 3.3V-spor for å redusere støy og forbedre effektiviteten.
- Last ned PCB-design og GERBER-filer Arduino og ESP32-basert effektivitetsmåler
Håndlaget PCB:
For enkelhets skyld og testing laget jeg min håndlagde versjon av PCB, og den er vist nedenfor. I den første versjonen gjorde jeg noen feil, som jeg utbedret ved hjelp av noen hoppetråder. Men i den endelige versjonen fikset jeg dem, du kan bare laste ned filene og bruke dem.
Arduino og ESP32-basert effektivitetsmåler - kode
Nå som vi har en god forståelse av maskinvaresiden av ting, kan vi åpne Arduino IDE og starte kodingen. Hensikten med koden er å lese den analoge spenningen fra pin 35 og 33 på ESP32-kortet. Vi leser også spenningen fra 32 og 34 pin som er den nåværende verdien. Når vi har gjort dette, kan vi multiplisere dem for å få inngangseffekt og utgangseffekt, og ved å sette den på effektivitetsformelen kan vi få effektiviteten.
Til slutt viser vi det på LCD-skjermen. Det komplette programmet for å gjøre det samme er gitt til slutt, som kan brukes som sådan for maskinvaren som er diskutert ovenfor. Videre er koden delt inn i små utdrag og forklart.
Når vi bruker en 128X64 OLED-skjerm, trenger vi Adafruit_GFX-biblioteket og Adafruit_SSD1306-biblioteket for å kommunisere med skjermen. Du kan laste ned begge fra Arduinos standard styrelederterminal; Hvis du har problemer med styrelederdelen, kan du også laste ned og inkludere bibliotekene fra det tilknyttede GitHub-depotet, som er gitt nedenfor.
- Last ned Adafruit_GFX-biblioteket
- Last ned biblioteket Adafruit_SSD1306
Som alltid begynner vi koden vår med å inkludere alle nødvendige biblioteker. Deretter definerer vi alle nødvendige pinner og variabler som alle er vist nedenfor.
#inkludere
De SCREEN_WIDTH & SCREEN_HEIGHT definisjoner anvendes til å definere størrelsen på skjermen. Deretter har vi definert alle nødvendige pinner, som vi skal måle spenningen og strømmen gjennom. Deretter har vi definert motstandsverdiene som brukes i maskinvaren som du kan se fra skjematisk. Hvis du ikke har disse verdiene, eller hvis du vil endre rekkevidden til måleren, kan du endre disse verdiene, koden vil fungere bra.
Når vi bruker en ACS712 for å måle strømmen, trenger vi mVperAmp- verdien for å beregne strømmen fra spenningen. Da jeg bruker en 20A ACS712-modul, er mV / A-verdien 100 som gitt i databladet. Men fordi vi bruker en ESP32 og en spenningsdeler, vil vi ha halvparten av verdien som er 50, og det er derfor vi har satt inn mV / AMP-verdien.
ACSoffset er forskyvningen som er nødvendig for å beregne strømmen fra spenningen. Siden ACS712 IC får strøm fra 5V, er forskyvningsspenningen 2,5V. Men ettersom vi bruker en spenningsdeler, går den ned til 1,25V. Du kjenner kanskje allerede til den crappy ADC av ESP32, så jeg måtte bruke verdien 1136. Hvis du har kalibreringsproblemer, kan du tilpasse verdiene og kompensere for ADC.
Til slutt avslutter vi denne delen ved å lage et visningsobjekt av Adafruit_SSD1306- klassen og passere skjermbredden, høyden, I 2 C-konfigurasjonen, og den siste -1-parameteren brukes til å definere tilbakestillingsfunksjonaliteten. Hvis skjermen din ikke har en ekstern reset-pin (som absolutt er for skjermen min), må du bruke -1 for det siste argumentet.
ugyldig oppsett () {Serial.begin (115200); hvis (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adresse 0x3D for 128x64 Serial.println (F ("SSD1306-tildeling mislyktes")); for (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); forsinkelse (100); }
Deretter har vi oppsett () -delen. I denne delen aktiverer vi feilsøking seriell, vi sjekker om en I 2 C-skjerm er tilgjengelig eller ikke ved hjelp av startmetoden til visningsobjektet. Vi setter også I 2 C-adressen. Deretter tømmer vi skjermen med clearDisplay () -metoden. Dessuten roterer vi skjermen med setRotation- metoden, det er fordi jeg har ødelagt PCB-designen min. Deretter setter vi en forsinkelse på 100 ms for at funksjonene skal tre i kraft. Når det er gjort, kan vi nå gå videre til loop-funksjonen. Men før du fortsetter til løkke funksjon, må vi diskutere to andre funksjoner som er return_voltage_value () , og return_current_value () .
dobbel retur_spenningsverdi (int pin_no) {dobbel tmp = 0; dobbel ADCVoltage = 0; dobbel inngangsspenning = 0; dobbel gjennomsnitt = 0; for (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } gjennomsnitt = tmp / 150; ADCVoltage = ((avg * 3.3) / (4095)) + 0.138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // formel for beregning av spenning i dvs. GND retur inputVoltage; }
Den return_voltage_value () funksjonen brukes for å måle den spenning som kommer inn i ADC, og det tar pin_no som et argument. I denne funksjonen starter vi med å erklære noen variabler, som er tmp, ADCVoltage, inputVoltage og avg. Tmp-variabelen brukes til å lagre den midlertidige ADC-verdien som vi får fra analogRead () -funksjonen, så beregner vi den gjennomsnittlig 150 ganger i en for loop, og vi lagrer verdien til en variabel som heter avg. Vi beregner deretter ADCVoltage fra den gitte formelen, til slutt beregner vi inngangsspenningen og returnerer verdiene. +0,138-verdien du ser, er kalibreringsverdien jeg brukte til å kalibrere spenningsnivået, lek med denne verdien hvis du får feil.
dobbel retur_strøm_verdi (int pin_no) {dobbel tmp = 0; dobbel gjennomsnitt = 0; dobbel ADCVoltage = 0; doble forsterkere = 0; for (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } gjennomsnitt = tmp / 150; ADCVoltage = ((avg / 4095.0) * 3300); // Får deg mV Amps = ((ADCVoltage - ACSoffset) / mVperAmp); returforsterker; }
Deretter har vi funksjonen return_current_value () . Denne funksjonen tar også pin_no som argument. I denne funksjonen har vi også fire variabler, nemlig. tmp, avg, ADCVoltage og Amps
Deretter leser vi pinnen med analogRead () -funksjonen og gjennomsnittlig den 150 ganger, neste bruker vi formelen for å beregne ADCvoltage, med det beregner vi strømmen og vi returnerer verdien. Med det kan vi gå videre til sløyfeseksjonen.
ugyldig sløyfe () {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 ("Inngangsspenning:"); Serial.print (input_voltage); Serial.print ("- Inngangsstrøm:"); Serial.print (input_current); Serial.print ("- Utgangsspenning:"); Serial.print (output_voltage); Serial.print ("- Utgangsstrøm:"); Serial.println (utgangsstrøm); forsinkelse (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); vise.utskrift ("V"); }
Vi starter loop-seksjonen med å erklære og definere noen floatvariabler, i alle fire variablene. Vi kaller de respektive funksjonene, og sender pin_no som et argument, da ACS712-modulen kan gi gjeldende verdier negativt. Vi bruker abs () -funksjonen til mattebiblioteket for å gjøre den negative verdien som positiv. Deretter serierutskriver vi alle verdiene for feilsøking. Deretter tømmer vi skjermen, setter markøren og skriver ut verdiene. Vi gjør dette for alle tegnene som vises på skjermen. Som markerer slutten på loop-funksjonen og programmet.
Testing av Arduino og ESP32-basert effektivitetsmåler
Som du kan se testoppsettet mitt i bildet ovenfor. Jeg har min 30V transformator som inngang, og jeg har måleren koblet til testkortet. Jeg bruker et LM2596-basert bukkomformerkort og for lasten, og jeg bruker tre 10 ohm motstander, parallelt.
Som du kan se på bildet ovenfor, har jeg koblet til multimeter for å kontrollere inngangs- og utgangsspenningen. Transformatoren produserer nesten 32V og utgangen fra bukkomformeren er 3,95V.
Bildet her viser utgangsstrømmen målt av effektivitetsmåleren min og multimeteret. Som du kan se, viser multimeteret 0,97 ampere, og hvis du zoomer inn litt, viser det 1.0A, det er litt av på grunn av ikke-linearitet i ACS712-modulen, men dette tjener vårt formål. For en detaljert forklaring og testing, kan du sjekke ut videoen i vår videoseksjon.
Ytterligere forbedringer
For denne demonstrasjonen er kretsen laget på et håndlaget PCB, men kretsen kan enkelt bygges i PCB av god kvalitet. I mitt eksperiment er størrelsen på PCB veldig stor på grunn av komponentstørrelsen, men i et produksjonsmiljø kan den reduseres ved å bruke billige SMD-komponenter. Kretsen har heller ingen innebygd beskyttelsesfunksjon, så å inkludere en beskyttelseskrets vil forbedre kretsens generelle sikkerhetsaspekt. Mens jeg skrev koden, la jeg også merke til at ADC til ESP32 ikke er så bra. Inkludering av en ekstern ADC som ADS1115-modulen vil øke den generelle stabiliteten og nøyaktigheten.
Jeg håper du likte denne artikkelen og lærte noe nytt ut av den. Hvis du er i tvil, kan du spørre i kommentarene nedenfor eller bruke forumene våre for detaljert diskusjon.