- Benodigde materialen voor ESP32-vermogensmeter
- Op Arduino en ESP32 gebaseerde efficiëntiemeter - schakelschema
- PCB-ontwerp voor Arduino en ESP32-gebaseerde efficiëntiemeter
- Op Arduino en ESP32 gebaseerde efficiëntiemeter - code
- Testen van de op Arduino en ESP32 gebaseerde efficiëntiemeter
- Verdere verbeteringen
We zijn allemaal op de hoogte van een standaard voltmeter, ampèremeter en wattmeters, de drie basisdingen die u nodig hebt om waarden te meten op elektronische projecten of circuits. Het meten van spanning en stroom met behulp van een multimeter kan een goede manier zijn om te beginnen, maar een van de grootste problemen waarmee ik te maken krijg tijdens het testen van een circuit is het meten van de energie-efficiëntie. Dus vandaag zullen we dat probleem oplossen door een op Arduino en ESP32 gebaseerde efficiëntiemeter te bouwen die ingangsspanning, ingangsstroom, uitgangsspanning en uitgangsstroom kan meten. Daarom kan het tegelijkertijd het ingangsvermogen en het uitgangsvermogen meten, en met deze waarden kunnen we de efficiëntie gemakkelijk meten. Eerder hebben we ook iets soortgelijks gedaan in ons Arduino Based Wattmeter-project, maar hier zullen we zowel het ingangsvermogen als het uitgangsvermogen meten bereken de energie-efficiëntie.
In plaats van voor de klus vier meter aan te schaffen, kunnen we dit probleem oplossen door de mogelijkheden van alle vier de meters in één te integreren. Het bouwen van uw digitale meter verlaagt niet alleen de kosten, maar geeft u ook bewegingsruimte voor upgrades en verbeteringen. Omdat we een ESP32 gebruiken om dit project te bouwen, kunnen we deze meter eenvoudig IoT inschakelen en gegevens loggen via het web, wat het onderwerp is voor het toekomstige project. Nu alle basisprincipes zijn opgelost, laten we er meteen op ingaan.
Opmerking: deze vermogensmeter is ontworpen voor DC-circuits. Als u AC-stroom wilt meten om de AC-energie-efficiëntie te berekenen, kunt u de op het IoT gebaseerde elektriciteitsenergiemeter- en prepaid-energiemeterprojecten bekijken.
Benodigde materialen voor ESP32-vermogensmeter
De onderstaande afbeelding toont de materialen die zijn gebruikt om het circuit te bouwen. Omdat dit is gemaakt met zeer algemene componenten, zou u al het vermelde materiaal in uw plaatselijke hobbywinkel moeten kunnen vinden.
Ik heb ook de onderstaande componenten vermeld, samen met het vereiste aantal. Als je het circuit zelf bouwt, is het sterk aan te raden om alle materialen uit de onderstaande lijst te halen.
- ESP32-kaart - 1
- 128X64 OLED - 1
- ACS712-20 IC - 2
- DC-vataansluiting - 1
- 100uF condensator - 2
- 104pF - 2
- 102pF - 2
- 10K, 1% - 4
- 68K, 1% - 2
- 6,8K, 1% - 2
Op Arduino en ESP32 gebaseerde efficiëntiemeter - schakelschema
Het schema voor de op Arduino en ESP32 gebaseerde efficiëntiemeter wordt hieronder weergegeven. Het maken van dit circuit is heel eenvoudig en maakt gebruik van generieke componenten.
De werking van het circuit is heel eenvoudig. We gaan in dit project de spanning en stroom meten, maar op een unieke manier. We meten spanning en stroom voor zowel de invoer als de uitvoer, dus we kunnen de efficiëntie van het circuit zien. Dit is erg handig voor sommige projecten. Een voorbeeld zou een DC naar DC-omzetter kunnen zijn waarbij efficiëntiemeting verplicht wordt. De manier waarop dit circuit werkt, wordt hieronder beschreven.
De ACS712 stroomsensor IC:
Zoals u in de bovenstaande afbeelding kunt zien, gebruiken we een ACS712 stroomsensor-IC om stroom te meten. Dit is een zeer interessante IC omdat het het Hall-effect gebruikt om stroom te meten, er zijn drie varianten van deze IC die te vinden zijn in de markt f (of 5A, 20A en 30A). We gebruiken de 20A-variant hiervan en deze is gelabeld als ACS712-20.
Het gegevensblad van de ACS712 beveelt een spanningsbereik van 4,5 - 5,5 aan voor een soepele werking. En aangezien we de stroom gaan meten met een ESP32, is deze slechts 3,3V tolerant, daarom heb ik een spanningsdeler met twee 10K weerstanden gebruikt om de uitgangsspanning van de ACS712 IC te verlagen. Als er geen stroom door de IC loopt, geeft deze 2,5 V af, en als er een bepaalde hoeveelheid stroom door de IC vloeit, verlaagt het de spanning of verhoogt het de spanning, afhankelijk van de stroomrichting. We hebben twee van deze IC's gebruikt om de ingangs- en uitgangsstroom te meten. Bekijk onze eerdere projecten (hieronder) waarin we deze ACS712-sensor hebben gebruikt.
- IoT-gebaseerde elektriciteitsenergiemeter met behulp van Arduino en ESP8266 wifi-module
- Digitale Ampèremeter Circuit met behulp van PIC Microcontroller en ACS712
Waar we de werking van deze sensoren uitvoerig hebben besproken. U kunt die bekijken als u meer wilt weten over deze sensoren.
De spanningsdeler:
Om de ingangs- en uitgangsspanning te meten, hebben we twee spanningsdelers aan de ingangs- en uitgangszijde van het circuit. De maximale spanning die de schakeling kan meten is 35V, maar deze kan eenvoudig worden gewijzigd door de weerstandswaarden voor de spanningsdeler te wijzigen.
De spanningsregelaar:
Een generieke LM7805-spanningsregelaar wordt gebruikt om de ESP32-, OLED- en ACS712-IC's van stroom te voorzien. Omdat we het opstarten met redelijk schone stroom, worden er geen ontkoppelingscondensatoren gebruikt, maar we hebben 100uF-condensatoren gebruikt aan zowel de ingang als de uitgang om de IC te stabiliseren.
De ESP32 IC en het OLED-scherm:
We hebben een ESP32 gebruikt als de hoofdprocessor, die verantwoordelijk is voor alle metingen, berekeningen, inputs en outputs. We hebben ook een 128x64 OLED-scherm gebruikt om de waarden te kennen.
PCB-ontwerp voor Arduino en ESP32-gebaseerde efficiëntiemeter
De printplaat voor onze op Arduino en ESP32 gebaseerde efficiëntiemeter is ontworpen op een enkelzijdig bord. Ik heb Eagle gebruikt om mijn PCB te ontwerpen, maar je kunt elke ontwerpsoftware van je keuze gebruiken. De 2D-afbeelding van mijn bordontwerp wordt hieronder weergegeven.
Er wordt voldoende aardingsspoor gebruikt om goede aardverbindingen te maken tussen alle componenten. We hebben er ook voor gezorgd dat we de juiste 5V- en 3,3V-sporen gebruiken om ruis te verminderen en de efficiëntie te verbeteren.
- Download PCB Design en GERBER-bestanden Arduino en ESP32 gebaseerde efficiëntiemeter
Handgemaakte printplaat:
Voor het gemak en het testen heb ik mijn handgemaakte versie van de PCB gemaakt en deze wordt hieronder weergegeven. In de eerste versie heb ik een aantal fouten gemaakt, die ik heb verholpen met behulp van enkele jumperdraden. Maar in de definitieve versie heb ik die opgelost, je kunt de bestanden gewoon downloaden en gebruiken.
Op Arduino en ESP32 gebaseerde efficiëntiemeter - code
Nu we een goed begrip hebben van de hardware-kant van de dingen, kunnen we de Arduino IDE openen en beginnen met coderen. Het doel van de code is om de analoge spanning van pin 35 en 33 van de ESP32-kaart te lezen. We lezen ook de spanning van 32 en 34 pin, wat de huidige waarde is. Zodra we dit hebben gedaan, kunnen we die vermenigvuldigen om ingangs- en uitgangsvermogen te krijgen, en door het aan de efficiëntieformule toe te voegen, kunnen we de efficiëntie krijgen.
Ten slotte geven we het weer op het LCD-scherm. Het volledige programma om hetzelfde te doen wordt aan het einde gegeven, dat als zodanig kan worden gebruikt voor de hierboven besproken hardware. Verder wordt de code opgesplitst in kleine fragmenten en uitgelegd.
Omdat we een 128x64 OLED-scherm gebruiken, hebben we de Adafruit_GFX-bibliotheek en de Adafruit_SSD1306-bibliotheek nodig om met het scherm te communiceren. Je kunt ze allebei downloaden van de standaard board manager-terminal van Arduino; als je problemen hebt met het board manager-gedeelte, kun je ook de bibliotheken downloaden en opnemen van de bijbehorende GitHub-repository, die hieronder wordt gegeven.
- Download Adafruit_GFX-bibliotheek
- Download Adafruit_SSD1306 bibliotheek
Zoals altijd beginnen we onze code met alle vereiste bibliotheken. Vervolgens definiëren we alle benodigde pinnen en variabelen die hieronder worden weergegeven.
# omvatten
De SCREEN_WIDTH & SCREEN_HEIGHT definities worden gebruikt om de schermgrootte te definiëren. Vervolgens hebben we alle benodigde pinnen gedefinieerd, waarmee we de spanning en stroom gaan meten. Vervolgens hebben we de weerstandswaarden gedefinieerd die in de hardware worden gebruikt, zoals u kunt zien in het schema. Als u deze waarden niet heeft of als u het bereik van de meter wilt wijzigen, kunt u die waarden wijzigen, de code werkt prima.
Omdat we een ACS712 gebruiken om de stroom te meten, hebben we de mVperAmp- waarde nodig om de stroom uit de spanning te berekenen. Omdat ik een 20A ACS712-module gebruik, is de mV / A-waarde 100 zoals aangegeven in het gegevensblad. Maar omdat we een ESP32 en een spanningsdeler gebruiken, hebben we de helft van de waarde die 50 is, en daarom hebben we de mV / AMP-waarde ingevoerd.
ACSoffset is de offset die nodig is om de stroom uit de spanning te berekenen. Omdat de ACS712 IC's worden gevoed vanaf 5V, is de offsetspanning 2,5V. Maar aangezien we een spanningsdeler gebruiken, daalt deze tot 1,25 V. Misschien ken je de waardeloze ADC van de ESP32 al, dus ik moest een waarde van 1136 gebruiken. Als je kalibratieproblemen hebt, kun je de waarden aanpassen en de ADC compenseren.
Ten slotte maken we deze sectie af door een weergaveobject te maken van de Adafruit_SSD1306- klasse en de schermbreedte, hoogte, I 2 C-configuratie door te geven, en de laatste -1 parameter wordt gebruikt om de reset-functionaliteit te definiëren. Als je beeldscherm geen externe reset-pin heeft (wat zeker voor mijn beeldscherm is), dan moet je -1 gebruiken voor het laatste argument.
ongeldige setup () {Serial.begin (115200); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adres 0x3D voor 128x64 Serial.println (F ("SSD1306-toewijzing mislukt")); voor (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); vertraging (100); }
Vervolgens hebben we onze setup () -sectie. In deze sectie schakelen we serieel in voor foutopsporing, we controleren of er een I 2 C-weergave beschikbaar is of niet met behulp van de beginmethode van het weergaveobject. We stellen ook het I 2 C-adres in. Vervolgens maken we het scherm leeg met de clearDisplay () - methode. Ook roteren we het scherm met de setRotation- methode, omdat ik mijn PCB-ontwerp heb verknoeid. Vervolgens hebben we een vertraging van 100 ms ingesteld om de functies van kracht te laten worden. Zodra dat is gebeurd, kunnen we doorgaan naar de lusfunctie. Maar voordat wordt overgegaan tot de loop-functie, moeten we twee andere functies die zijn besproken return_voltage_value () , en return_current_value () .
dubbele return_voltage_value (int pin_no) {double tmp = 0; dubbele ADCVoltage = 0; dubbele inputVoltage = 0; dubbele gemiddelde = 0; voor (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } avg = tmp / 150; ADCVoltage = ((gem * 3.3) / (4095)) + 0.138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // formule voor het berekenen van spanning in ie GND retour inputVoltage; }
De functie return_voltage_value () wordt gebruikt om de spanning te meten die de ADC binnenkomt, en neemt de pin_no als argument. In deze functie beginnen we met het declareren van enkele variabelen, namelijk tmp, ADCVoltage, inputVoltage en avg. De tmp-variabele wordt gebruikt om de tijdelijke ADC-waarde op te slaan die we krijgen van de analogRead () -functie, vervolgens berekenen we het 150 keer uit in een for-lus en slaan we de waarde op in een variabele met de naam avg. We berekenen vervolgens ADCVoltage uit de gegeven formule, ten slotte berekenen we de ingangsspanning en retourneren we de waarden. De waarde van +0,138 die u ziet, is de kalibratiewaarde die ik heb gebruikt om het spanningsniveau te kalibreren, speel met deze waarde als u fouten krijgt.
dubbele return_current_value (int pin_no) {double tmp = 0; dubbele gemiddelde = 0; dubbele ADCVoltage = 0; dubbele versterkers = 0; voor (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } avg = tmp / 150; ADCVoltage = ((gem / 4095.0) * 3300); // Krijgt u mV Amps = ((ADCVoltage - ACSoffset) / mVperAmp); terugkeer versterkers; }
Vervolgens hebben we de functie return_current_value () . Deze functie heeft ook pin_no als argument. In deze functie hebben we ook vier variabelen, namelijk. tmp, avg, ADCVoltage en Amps
Vervolgens lezen we de pin met analogRead () functie en gemiddeld 150 keer, vervolgens gebruiken we de formule om de ADC-spanning te berekenen, daarmee berekenen we de stroom en geven we de waarde terug. Hiermee kunnen we naar het lusgedeelte gaan.
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 ("Ingangsspanning:"); Serial.print (input_voltage); Serial.print ("- Invoerstroom:"); Serial.print (input_current); Serial.print ("- Uitgangsspanning:"); Serial.print (output_voltage); Serial.print ("- Uitgangsstroom:"); Serial.println (output_current); vertraging (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); Scherm.print ("V"); }
We starten de lussectie door enkele floatvariabelen te declareren en te definiëren, in alle vier variabelen. We noemen de respectievelijke functies, waarbij pin_no als argument wordt doorgegeven, omdat de ACS712-module de huidige waarden negatief kan retourneren. We gebruiken de functie abs () van de wiskundebibliotheek om de negatieve waarde positief te maken. Vervolgens drukken we alle waarden voor foutopsporing serieel af. Vervolgens wissen we het scherm, stellen we de cursor in en drukken we de waarden af. Dit doen we voor alle karakters die in het display worden getoond. Dat markeert het einde van de lusfunctie en het programma.
Testen van de op Arduino en ESP32 gebaseerde efficiëntiemeter
Zoals je kunt zien in mijn testopstelling in de bovenstaande afbeelding. Ik heb mijn 30V-transformator als ingang en ik heb mijn meter aangesloten voor het testbord. Ik gebruik een op LM2596 gebaseerde buck-converterkaart en voor de belasting en ik gebruik drie 10 Ohm-weerstanden, parallel.
Zoals je in de bovenstaande afbeelding kunt zien, heb ik meerdere meters aangesloten om de ingangs- en uitgangsspanning te controleren. De transformator levert bijna 32V en de output van de buck-converter is 3,95V.
De afbeelding hier toont de uitgangsstroom gemeten door mijn efficiëntiemeter en de multimeter. Zoals je kunt zien, toont de multimeter 0,97 Ampère, en als je een klein beetje inzoomt, wordt 1,0 A weergegeven, het is enigszins afwijkend vanwege de niet-lineariteit die aanwezig is in de ACS712-module, maar dit dient ons doel. Voor een uitgebreide uitleg en testen kun je de video bekijken in onze video sectie.
Verdere verbeteringen
Voor deze demonstratie is de schakeling gemaakt op een handgemaakte printplaat, maar de schakeling kan eenvoudig in een goede kwaliteit printplaat worden ingebouwd. In mijn experiment is de grootte van de PCB erg groot vanwege de grootte van de componenten, maar in een productieomgeving kan deze worden verkleind door goedkope SMD-componenten te gebruiken. Het circuit heeft ook geen ingebouwde beveiligingsfunctie, dus het toevoegen van een beveiligingscircuit zal het algehele veiligheidsaspect van het circuit verbeteren. Tijdens het schrijven van de code merkte ik ook dat de ADC van de ESP32 niet zo geweldig is. Het toevoegen van een externe ADC zoals de ADS1115-module verhoogt de algehele stabiliteit en nauwkeurigheid.
Ik hoop dat je dit artikel leuk vond en er iets nieuws van hebt geleerd. Als u twijfelt, kunt u dit in de onderstaande opmerkingen stellen of onze forums gebruiken voor een gedetailleerde discussie.