Inhoudsopgave:

ARDUINO ENERGIEMETER - Ajarnpa
ARDUINO ENERGIEMETER - Ajarnpa

Video: ARDUINO ENERGIEMETER - Ajarnpa

Video: ARDUINO ENERGIEMETER - Ajarnpa
Video: Simple Arduino Energy Meter | Volt -Amp meter 20 Amp 2024, November
Anonim
Image
Image
ARDUINO ENERGIEMETER
ARDUINO ENERGIEMETER
ARDUINO ENERGIEMETER
ARDUINO ENERGIEMETER

[Video afspelen]

Ik behoor tot een dorp in Odisha, India, waar frequente stroomuitval heel gewoon is. Het belemmert het leven van iedereen. Tijdens mijn kinderjaren was het een echte uitdaging om na zonsondergang verder te studeren. Vanwege dit probleem heb ik op experimentele basis een zonnestelsel voor mijn huis ontworpen. Ik gebruikte een zonnepaneel van 10 Watt, 6V voor het verlichten van enkele felle LED's. Na veel ontberingen te hebben doorstaan, was het project succesvol. Toen besloot ik om de spanning, stroom, vermogen en energie in het systeem te controleren. Dit bracht het idee van het ontwerpen van een ENERGIEMETER. Ik gebruikte ARDUINO als het hart van dit project omdat het heel gemakkelijk is om code in de IDE te schrijven en er enorme aantallen open source-bibliotheken beschikbaar zijn op internet die kunnen worden gebruikt volgens de eis. Ik heb geëxperimenteerd met het project voor een zeer klein (10 Watt) zonnestelsel, maar dit kan eenvoudig worden aangepast om te gebruiken voor een systeem met een hogere rating.

U kunt al mijn projecten vinden op:

Feature: Energiemonitoring door 1. LCD-display 2. via internet (Xively upload) 3. Datalogging op een SD-kaart

U kunt mijn nieuwe instructable ARDUINO MPPT SOLAR CHARGE CONTROLLER zien (versie-3.0)

Je kunt ook mijn andere instructables zien op

ARDUINO SOLAR CHARGE CONTROLLER (Versie 2.0)

ARDUINO SOLAR LAADREGELAAR (Versie-1)

Stap 1: Benodigde onderdelen:

Benodigde onderdelen
Benodigde onderdelen

1. ARDUINO UNO (Amazone)2. ARDUINO ETHERNET SHIELD (Amazone)

3. 16x2 KARAKTER LCD (Amazon)

4. ACS 712 STROOMSENSOR (Amazon)4. WEERSTANDEN (10k, 330ohm) (Amazon)5. 10K POTENTIOMETER (Amazon)6. JUMPERDRADEN (Amazon)7. ETHERNET-KABEL (Amazon)8. BROODPLANK (Amazone)

Stap 2: Kracht en energie

Vermogen: Vermogen is het product van spanning (volt) en stroom (Amp) P=VxI Eenheid van vermogen is Watt of KWEnergie: Energie is het product van vermogen (watt) en tijd (uur) E= Pxt Eenheid van energie is Watt Hour of Kilowatt Uur (kWh) Uit de bovenstaande formule is het duidelijk dat we drie parameters nodig hebben om energie te meten: 1. Spanning 2. Stroom 3. Tijd

Stap 3: Spanningsmeting

Spanningsmeting
Spanningsmeting
Spanningsmeting
Spanningsmeting
Spanningsmeting
Spanningsmeting

Spanning wordt gemeten met behulp van een spanningsdelercircuit. Omdat de ingangsspanning van de ARDUINO analoge pin beperkt is tot 5V, heb ik de spanningsdeler zo ontworpen dat de uitgangsspanning ervan minder dan 5V moet zijn. Mijn batterij die wordt gebruikt voor het opslaan van de vermogen van het zonnepaneel is 6v, 5.5Ah. Dus ik moet deze 6.5v verlagen naar een spanning lager dan 5V. Ik gebruikte R1=10k en R2=10K. De waarde van R1 en R2 kan lager zijn, maar het probleem is dat wanneer de weerstand laag is, er een hogere stroom doorheen stroomt, waardoor een grote hoeveelheid vermogen (P = I ^ 2R) wordt gedissipeerd in de vorm van warmte. Er kan dus een andere weerstandswaarde worden gekozen, maar er moet voor worden gezorgd dat het vermogensverlies over de weerstand tot een minimum wordt beperkt. Vout=R2/(R1+R2)*Vbat Vbat=6.5 wanneer volledig opgeladen R1=10k en R2=10k Vout=10/(10+10)*6.5=3.25v wat lager is dan 5v en geschikt voor ARDUINO analoge pinNOTE I hebben aangetoond dat een 9 Volt-batterij in een blootliggend bordcircuit alleen is bedoeld om de draden aan te sluiten. Maar de daadwerkelijke batterij die ik heb gebruikt, is een loodzuurbatterij van 6 Volt, 5,5 Ah. a Vout=3.25v en lagere waarde voor andere lagere batterijspanning. AEDUINO ADC zet analoog signaal om in corresponderende digitale benadering. Wanneer de batterijspanning 6.5v is, kreeg ik 3.25v van de spanningsdeler en sample1 = 696 in seriële monitor, waarbij sample1 de ADC-waarde is die overeenkomt met 3.25v. Voor een beter begrip heb ik de realtime simulatie van 123D.circuit voor spanningsmeting bijgevoegd Kalibratie: 3,25v gelijk aan 696 1 is gelijk aan 3,25/696=4.669mv Vout = (4.669*sample1)/1000 volt Actuele batterijspanning = (2*Vout) voltARDUINO CODE: // 150 monsters nemen van de spanningsdeler met een interval van 2sec en vervolgens het gemiddelde nemen van de voorbeeldgegevens die zijn verzameld voor (int i=0;i<150;i++) {sample1=sample1+analogRead(A2); // lees de spanning van de vertraging van het scheidingscircuit (2); } monster1=monster1/150; spanning=4.669*2*monster1/1000;

Stap 4: Stroommeting

Huidige meting
Huidige meting
Huidige meting
Huidige meting

Voor stroommeting heb ik een Hall Effect-stroomsensor ACS 712 (20 A) gebruikt. Er zijn verschillende stroombereik ACS712-sensoren op de markt, dus kies volgens uw behoefte. In het breadboard-diagram heb ik LED als een belasting weergegeven, maar de werkelijke belasting is anders. WERKINGSPRINCIPE: Het Hall-effect is de productie van een spanningsverschil (de Hall-spanning) over een elektrische geleider, dwars op een elektrische stroom in de geleider en een magnetisch veld loodrecht op de stroom. Om meer te weten over Hall Effect sensor, klik hier Het datablad van de ACS 712 sensor is hier te vinden Uit datablad 1. ACS 712 meet positieve en negatieve 20 Amps, overeenkomend met de analoge uitgang 100mV/A 2. Er is geen teststroom door de uitgangsspanning VCC / 2 =5v/2=2.5VC Kalibratie: Analoge uitlezing produceert een waarde van 0-1023, wat overeenkomt met 0v tot 5v Dus analoge uitlezing 1 = (5/1024) V =4,89mv Waarde = (4,89*Analoge leeswaarde)/ 1000 V Maar volgens de gegevensbladen is de offset 2,5 V (wanneer de huidige nul is, krijgt u 2,5 V van de uitgang van de sensor) Werkelijke waarde = (waarde-2,5) V Stroom in amp = werkelijke waarde * 10ARDUINO CODE: // 150 monsters nemen van sensoren met een interval van 2sec en vervolgens het gemiddelde nemen van de steekproefgegevens die zijn verzameld voor (int i=0;i<150;i++) { sample2+=analogRead(A3); // lees de stroom van sensorvertraging (2); } monster2=monster2/150; val =(5.0*sample2)/1024.0; werkelijke waarde = waarde-2,5; // offset-spanning is 2,5 v ampère = werkelijke waarde * 10;

Stap 5: Tijdmeting

Voor tijdmeting is geen externe hardware nodig, aangezien ARDUINO zelf een ingebouwde timer heeft. De functie millis() retourneert het aantal milliseconden sinds het Arduino-bord het huidige programma begon uit te voeren. ARDUINO CODE: long milisec = millis(); // bereken tijd in milliseconden long time=milisec/1000; // converteer milliseconden naar seconden

Stap 6: Hoe ARDUINO vermogen en energie berekent?

totamps=totamps+amps; // bereken totale ampères avgamps=totamps/time; // gemiddelde ampère amphr=(avgamps*time)/3600; // Ampère-uur watt =voltage*ampère; // vermogen = spanning * huidige energie = (watt * tijd) / 3600; Watt-sec wordt weer omgerekend naar Watt-Hr door 1hr (3600sec) // energy=(watt*time)/(1000*3600) te delen; voor het uitlezen in kWh

Stap 7: Visuele output

Visuele uitvoer
Visuele uitvoer

Alle resultaten kunnen worden gevisualiseerd in de seriële monitor of met behulp van een LCD. Ik heb een LCD-scherm van 16x2 tekens gebruikt om alle resultaten weer te geven die in de vorige stappen zijn verkregen. Zie het bovenstaande breadboard-circuit voor schema's. Verbind het LCD-scherm met ARDUINO zoals hieronder aangegeven: LCD -> Arduino 1. VSS -> Arduino GND 2. VDD - > Arduino +5v 3. VO -> Arduino GND-pin + Weerstand of Potentiometer 4. RS -> Arduino-pin 8 5. RW -> Arduino-pin 7 6. E -> Arduino-pin 6 7. D0 -> Arduino - Niet aangesloten 8 D1 -> Arduino - niet aangesloten 9. D2 -> Arduino - niet aangesloten 10. D3 -> Arduino - niet aangesloten 11. D4 -> Arduino pin 5 12. D5 -> Arduino pin 4 13. D6 -> Arduino pin 3 14. D7 -> Arduino pin 2 15. A -> Arduino Pin 13 + weerstand (achtergrondverlichting voeding) 16. K -> Arduino GND (achtergrondverlichting aarde)ARDUINO CODE: Voor seriële monitor:

Serial.print("VOLTAGE: "); Seriële.afdruk (spanning); Serial.println("Volt"); Serial.print("HUIDIGE:"); Serial.print(versterkers); Serial.println("Amps"); Serial.print("POWER:"); Seriële.afdruk (watt); Serial.println("Watt"); Serial.print("ENERGIE VERBRUIKT:"); Serial.print(energie); Serial.println("Wattuur"); Serieel.println(""); // print de volgende sets parameters na een lege regelvertraging (2000); Voor LCD: Voor LCD-weergave moet u eerst de "LiquidCrystal" -bibliotheek in de code importeren. Klik hier voor meer informatie over de LequidCrystal-bibliotheek. Klik hier voor zelfstudie over LCD-schermen. De volgende code is een indeling om alle berekeningen voor vermogen en energie op het LCD-scherm weer te geven. int achtergrondverlichting = 9; void setup() { pinMode(backLight, OUTPUT); // stel pin 9 in als output analogWrite (backLight, 150); // regelt de intensiteit van de achtergrondverlichting 0-254 lcd.begin (16, 2); // kolommen rijen. grootte van display lcd.clear(); // wis het scherm} void loop () { lcd.setCursor (16, 1); // plaats de cursor buiten de weergavetelling lcd.print(" "); // print leeg tekenvertraging (600); ////////////////////////////////////////// printkracht en energie naar een LCD/ /////////////////////////////////////////////// lcd.setCursor (1, 0); // zet de cursor op 1e col en 1e rij lcd.print(watt); lcd.print("W "); lcd.print(spanning); lcd.print("V"); lcd.setCursor(1, 1); // zet de cursor op 1e col en 2e rij lcd.print(energy); lcd.print("WH "); lcd.print(versterkers); lcd.print("A"); }

Stap 8: Gegevens uploaden naar Xively.com

Gegevens uploaden naar Xively.com
Gegevens uploaden naar Xively.com
Gegevens uploaden naar Xively.com
Gegevens uploaden naar Xively.com
Gegevens uploaden naar Xively.com
Gegevens uploaden naar Xively.com

Raadpleeg de bovenstaande schermafbeeldingen voor een beter begrip. Voor het uploaden van gegevens naar xively.com moet de volgende bibliotheek eerst worden gedownload HttpClient: klik hierXively: klik hierSPI: Importeren van arduino IDE (schets -> Bibliotheek importeren…..) Ethernet: Importeren van arduino IDE ((schets -> Bibliotheek importeren…..) Open een account bij https://xively.com (voorheen pachube.com en cosm.com) Meld u aan voor een gratis ontwikkelaarsaccount op

Kies een gebruikersnaam, wachtwoord, stel uw adres en tijdzone in etc. U ontvangt een bevestigingsmail;

klik vervolgens op de activeringslink om uw account te activeren. Na het succesvol openen van het account wordt u omgeleid naar de pagina Ontwikkelingsapparaten

  • Klik op het vak +Apparaat toevoegen
  • Geef een naam aan uw apparaat en een beschrijving (bijv. GEENERGIEMONITORING)·
  • Kies privé of openbare gegevens (ik kies privé)·
  • Klik op Apparaat toevoegen

Na het toevoegen van het apparaat wordt u omgeleid naar een nieuwe pagina waar veel belangrijke informatie staat

  • Product-ID, productgeheim, serienummer, activeringscode·
  • Feed-ID, FeedURL, API-eindpunt (Feed-ID wordt gebruikt in ARDUINO-code)
  • Kanalen toevoegen (Kies ENERGIE en VERMOGEN, maar u kunt kiezen volgens uw keuze)Geef eenheid en symbool voor de parameter·
  • Voeg uw locatie toe ·
  • API-sleutels (gebruikt in ARDUINO-code, vermijd dit nummer te delen) ·
  • Triggers (ping een webpagina wanneer een gebeurtenis plaatsvond, zoals wanneer het energieverbruik een bepaalde limiet overschrijdt)

Stap 9: Xively en ARDUINO-code

Hier heb ik de volledige code (bètaversie) voor de energiemeter bijgevoegd, exclusief SD-kaartgegevensregistratie die in de volgende stap afzonderlijk wordt bijgevoegd. /** Energiebewakingsgegevens uploaden naar xively **/ #include #include #include #include #define API_KEY "xxxxxxxx" // Voer uw Xively API-sleutel in #define FEED_ID xxxxxxxxx // Voer uw Xively feed-ID in // MAC-adres voor uw Ethernet-schildbyte mac = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // Analoge pin die we bewaken (0 en 1 worden gebruikt door het Ethernet-schild) int sensorPin = 2; unsigned long lastConnectionTime = 0; // laatste keer dat we verbinding maakten met Cosm const unsigned long connectionInterval = 15000; // vertraging tussen verbinding met Cosm in milliseconden // Initialiseer de Cosm-bibliotheek // Definieer de tekenreeks voor onze datastroom-ID char sensorId = "POWER"; char sensorId2 = "ENERGIE"; XivelyDatastream datastreams = {XivelyDatastream(sensorId, strlen(sensorId), DATASTREAM_FLOAT), XivelyDatastream(sensorId2, strlen(sensorId2), DATASTREAM_FLOAT), DATASTREAM_FLOAT), }; // Wikkel de datastroom in een feed XivelyFeed-feed (FEED_ID, datastreams, 2 /* aantal datastreams */); EthernetClient-client; XivelyClient xivelyclient(klant); void setup() { Serial.begin(9600); Serial.println("Netwerk initialiseren"); while (Ethernet.begin(mac) !=1) { Serial.println("Fout bij ophalen van IP-adres via DHCP, opnieuw proberen…"); vertraging (15000); } Serial.println("Netwerk geïnitialiseerd"); Serieel.println(); } void loop() { if (millis() - lastConnectionTime > connectionInterval) { sendData(); // stuur gegevens naar xively getData(); // lees de datastroom terug van xively lastConnectionTime = millis(); // update verbindingstijd zodat we wachten voordat we opnieuw verbinding maken}} void sendData() {int sensor1 = watt; int sensor2 = energie; datastromen[0].setFloat(sensor1); // vermogenswaarde datastromen [1].setFloat (sensor2); // energiewaarde Serial.print ("Leesvermogen "); Serial.println(datastreams[0].getFloat()); Serial.print("Lees energie "); Serial.println(datastreams[1].getFloat()); Serial.println("Uploaden naar Xively"); int ret = xivelyclient.put(feed, API_KEY); Serial.print("PUT retourcode: "); Serial.println(ret); Serieel.println(); } // haal de waarde van de datastroom van xively op, druk de waarde af die we hebben ontvangen void getData() { Serial.println("Gegevens lezen van Xively"); int ret = xivelyclient.get(feed, API_KEY); Serial.print("GET retourcode: "); Serial.println(ret); if (ret > 0) { Serial.print("Datastream is: "); Serial.println(feed[0]); Serial.print ("Power-waarde is: "); Serial.println(feed[0].getFloat()); Serial.print("Datastream is: "); Serial.println(feed[1]); Serial.print("Energiewaarde is: "); Serial.println(feed[1].getFloat()); } Serieel.println();

Stap 10: Datalogging op een SD-kaart

Voor het opslaan van gegevens op een SD-kaart moet je de SD-bibliotheek importeren Voor tutorial klik hier Om meer te weten over de SD-bibliotheek klik hier De code voor het opslaan van gegevens op een SD-kaart wordt apart geschreven omdat ik niet voldoende geheugen in mijn ARDUINO UNO heb na code schrijven voor LCD-scherm en gegevens uploaden xively.com. Maar ik probeer de bètaversiecode te verbeteren, zodat een enkele code alle functies kan bevatten (LCD-display, Xively-gegevens uploaden en gegevens opslaan op een SD-kaart). De code voor datalogging is hieronder bijgevoegd. Als iemand een betere code door mijn code aan te passen, deel deze dan met mij. Dit is mijn eerste technische instructable. Als iemand er een fout in vindt, aarzel dan niet om opmerkingen te maken.. zodat ik mezelf kan verbeteren. Als u verbeterpunten in dit project vindt, kunt u opmerkingen maken of stuur me een bericht, dus het project zal krachtiger zijn. Ik denk dat het zowel voor anderen als voor mij nuttig zal zijn.

123D Circuits-wedstrijd
123D Circuits-wedstrijd
123D Circuits-wedstrijd
123D Circuits-wedstrijd

Derde prijs in de 123D Circuits-wedstrijd

Aanbevolen: