Reacties op: Meet je energieverbruik met Arduino
Tegenwoordig zie je ze overal: energiemeters. Als standalone apparaat, als ‘cadeautje’ van je energieleverancier, of als onderdeel van een home automation oplossing. Maar wat als je geen zin hebt om een smak geld neer te leggen voor ‘alleen maar’ het bijhouden van je energieverbruik? Of je wilt liever niet dat het energiebedrijf zo’n gedetailleerd inzicht krijgt in jouw verbruik? Dan bouw je er toch zelf een?
Zelf reageren
Eerdere reacties
-
EngineerAtHome
Ja klopt, zo'n gasmeter had ik ook in mijn oude huis, op het laatste cijfer zat een reflecterend vlakje en die kon ik dus ook optisch uitlezen met deze sensor.
-
Bram
Wij hebben een gas meter gelijkaardig aan dit model: https://www.bellflowsystems.co.uk/var/images/product/366.440/Metrix%20G4%20Gas%20Meter_6.jpg
Werkt de sensor ook met dit systeem? Ik zie dat je zelf ook je gasmeter uitleest. Maar ik weet niet of je het reflecterend vlakje bedoelt zoals op dit systeem.
Bedankt voor je feedback. -
EngineerAtHome
Zeker Jannes, elk device dat een HTTP-request kan sturen kan op deze manier data loggen. Dus ook een Arduino Wifi, of een ESP8266 of een Adafruit Huzzah, noem maar op.
-
Jannes
Kan ik hetzelfde bereiken met een Arduino Uno WiFi? En er dan dus ook voor zorgen dat de data gelogged wordt naar een server via internet?
Alvast bedankt! -
Guido Vandenbulcke
met OPB732 sensor ben ik aan proberen
maar rode streep op meter?
IR led reflecteert op het glas van mijn test Kwh meter
in Belgie
met de echte meter zijn er 2 barrieres glas (meter zelf en de kast) ik test met aparte meter met 1 glas maar dit gaat ook nog niet !
dus reflektie werkt niet want glas of plastiek reflekteert alles
ik test reflectie op glasplaat met wit en zwart papier maar het glas is de boosdoener geen detectie van die rode streep
andere ideeen? graag
welke IR zenders en ontvangers gebruik jij?
waar te koop
of blauwe LED met welke detector?
of heb jij een ander kwh meter ?
-
gerrit
Om mijn detectie gelijk te krijgen aan de afgelezen meterstanden heb ik verschillende drempels toegekend. Nu klopt aflezing en uitlezing arduino. Het verloop van de gas en watersensor gaat soms zo langzaam dat er niet 1 drempel gehanteerd kan worden.
Groet,
Gerrit
const int lowdrempelGas = 150; // 150 & 700 drempelwaarde gassensor
const int highdrempelGas = 700;
// drempel 150 & 700
sensorGas = analogRead(4);
if (sensorGas < lowdrempelGas) {
pulseGas = true;
}
if (sensorGas > highdrempelGas && pulseGas) {
pulseGas = false;
pulseCountG++;
-
EngineerAtHome
Ha Gerrit, goed om te horen dat je er na wat puzzelwerk toch uit bent gekomen en bedankt voor het delen van je oplossing!
-
gerrit
Na wat debugging geconstateerd dat Pulsecount wel gereset word. Niet alleen pulsecount resetten maar ook de berekende waarden. Dit geeft nu wel de correcte berekende waarden naar de server. Nu wat tijd stoppen in grafieken generen.
pulseCountS = 0;
pulseCountG = 0;
pulseCountW = 0;
curWatts = 0;
totalWh = 0;
curDm3 = 0;
totalDm3 = 0;
curL = 0;
totalL = 0; -
Gerrit
De post met veel plezier gebruikt maar ik heb een probleempje met het resetten van de pulstellers. De tellers worden bij mij niet gereset naar 0. Het lijkt dat stroom wel gerest wordt maar deze pulst natuurlijk altijd. Een hint waar dit verkeerd kan gaan
client.println(" HTTP/1.1");
client.println(F("Host: *, *, *, * "));
client.println(F("Connection: close"));
client.println();
delay(1);
client.stop();
delay(1);
pulseCountS = 0;
pulseCountG = 0;
pulseCountW = 0;
} -
Ruud van Duijn
Dank je voor deze post, voor mij zeer interessante, ik zat al flink te toppen. Ik heb nu de communicatie gemaakt met een Arduino Micro ,daaraan een 433 mhz transmitter die de tikken verzend die binnen komen op de sesor. dit naar een een domoticz systeem op raspberry. De manier hoe je de meter uitleest was voor mij een eyopener. Keep on posting.
-
EngineerAtHome
Het is een beetje afhankelijk van welke sensor je gebruikt hoe ver je hem kunt verlengen. Als de optische sensor een digitale uitgang heeft zou dit wel mijn voorkeur hebben omdat dit minder gevoelig is voor storingen in de lange kabel. 4 meter zou dan prima moeten lukken
Goedkope sensoren hebben vaak een bijzonder soort digitale uitgang, vaak geeft deze alleen hoog (5 Volt) of laag (0 Volt) en stel je de drempelwaarde met een potmeter op de sensor in. Eigenlijk is dit dus nog steeds analoog maar dan met een vaste drempel die je in de software niet meer kunt wijzigen mocht je dit willen. Een 'echte' digitale uitgang verstuurt de gemeten waardes in digitale vorm, bijvoorbeeld via I2C, TWI of SPI protocol.
Het is voor de Arduino geen probleem om twee optische sensoren, een humidity sensor, een afstandsmeter en LAN-shield tegelijk aan te sluiten en uit te lezen. De LAN-module verbruikt hier het meeste stroom, maar de Arduino kan dat prima aan. Voor de overige eenvoudige sensoren heb je ook nog geen extra voeding nodig want deze verbruiken nauwelijks wat. Bovendien is de Arduino goed afgezekerd, dus gewoon proberen kan ook geen kwaad! :-) -
WJ
Mijn gas en elektriciteit meter staan redelijk ver uit elkaar (4 meter) en ik vroeg me of hoe ik deze toch met 1 Arduino kan aflezen. Verlengen met bijvoorbeeld met telefoondraad? De optische sensor biedt de mogelijkheid zowel analoog als digitaal te werken, wat is beter? Naast twee optische sensors, wil ik ook een humunity sensor en zelfs een afstandmeter (om mijn grondpeil te meten) te samen met de LAN module vraag ik mogelijk teveel om dit direct op de Arduino aan te sluiten. Wat ik eigenlijk mis in sommige handleidingen is hoe het beste aan te sluiten bv grotere of een aparte voeding, etc. Hoop dat iemand mij meer inzicht hierin kan geven. Alvast bedankt. WJ
-
EngineerAtHome
Ha Herman, dat is een uitdaging... Ik denk dat je het grootste deel van de code kunt blijven gebruiken. In het deel waar de puls wordt afgehandeld krijg je dan iets van:
if (sensorStroom < drempelStroom && pulseStroom) {
if (sensorStroomTerug) {
pulseCountS--;
}
else {
pulseCountS++;
}
}
De terugleversensor moet dan 'achter' de hoofdsensor zitten zodat deze het streepje ziet op het moment dat de hoofdsensor wordt gecheckt. Draait de schijf de andere kant op dan zal de hoofdsensor worden gecheckt voordat het streepje de terugleversensor bereikt.
Nu ik er over nadenk, het is misschien wel leuker om de waardes apart bij te houden. In plaats van pulseCountS-- doe je dan bijvoorbeeld pulseRetourS++, in je interface kun je dan zien wat je hebt verbruikt en hebt opgewekt, en het daarna pas van elkaar aftrekken. -
Herman
Ga van de week beginnen om mijn gas water licht te meten.
Zelf heb ik zonnepanelen, dus mijn ferraris meter draait ook terug. Hierdoor zal ik 2 cny70 sensoren moeten gebruiken om de richting te bepalen.
Zou je een voorzetje kunnen geven van code zodat het stroomverbruik ook minder wordt als de meter terugdraait? -
EngineerAtHome
Beste Udo, naar aanleiding van jouw vraag heb ik de diverse opties die je hebt met een digitale meter beschreven in het artikel 'Digitale kWh-meter uitlezen met Arduino'.
-
Udo Geerts
Hallo,
Is dit er ook voor een digitale meter ?
Dus iets wat je met een snoertje in de digitale meter je verbruik uit kunt lezen en zelfs je oplevering van zonnepanelen?
Het zou fantastisch zijn als dat kon. -
Oscar Lee
Hi, Nice to meet you.
My name is Oscar, at WIZnet in Korea.
We have been searching some application references in which WIZnet solution is applied, and found your project “Measure your energy consumption with Arduino“ using Ethernet Shield. In the Ethernet Shield WZnet’s W5100 chip is embedded. Your development looks very cool & smart.
Recently we opened WIZnet Museum (http://wiznetmuseum.com) site. This is a academic-purposed collection of open projects, tutorials, articles and etc from our global customers.
If you are O.K. we would like to introduce your projects in here. Hopefully, you will allow this.
Hopefully, keep contacting us for the friendship.
Thank you very much. -
Jeroen
Ik heb het al gevonden!
Hier zat verschil in:
String analogValue0 = String(analogRead(A0), DEC);
sensorStroom = analogRead(5);
ik heb ze allebei op 5 gezet en nu kloppen de waarden, alleen ff de drempelwaarde verlaagd. -
EngineerAtHome
Beste Jeroen, als ik zo even naar je code en grafiek kijk lijkt het erop dat je nu enkel de analoge waarde van je sensor naar Thingspeak wegschrijft.
Om te voorkomen dat je teveel hooi op je vork neemt kun je misschien beter in kleine stapjes werken.
1. Probeer allereerst het uitlezen van de sensor via de serial monitor voor elkaar krijgen. [ Serial.print(analogRead(5)); ] Wat je wilt is een redelijk stabiele analoge waarde met een piek als het zwarte streepje van de kwh-meter voorbijkomt.
2. Vervolgens kun je dan een goede drempelwaarde instellen zodat de Arduino het piekje in de analoge waarde herkent als een puls. [ if (sensorStroom > drempelStroom) ] Vergeet ook niet de juiste C-waarde van je meter in te vullen. Controleer via serial.print of dat de curWatts en totalWh die je terugkrijgt een beetje kloppen.
3. Komen hier logische waardes uit dan kun je beginnen met de communicatie met Thingspeak. -
Jeroen
Ik weet niet hoe het kan, ik heb wel wat geprobeerd natuurlijk maar ik krijg zowaar data binnen op Thingspeak! Nu loopt ik alleen tegen het volgende aan. Ik krijg nu een grafiek te zien: http://www.imghost.nl/download/Naamloos1%282%29.jpg
Hoe moet ik dit lezen? -
Jeroen
Ik snap er niets meer van, ik heb je code gebruikt en wil alles naar Thingspeak sturen. Voor opgesteld ben ik een leek wat betreft Arduino maar ik leer snel. Wil iemand eens naar mijn code kijken?
#include
#include
// STROOM
const int Stroom_C = 375; // meetconstante elektra, 375 rondjes per kWh
const int drempelStroom = 650; // drempelwaarde stroomsensor
int sensorStroom = 0; // waarde van de LDR
boolean pulseStroom = false; // puls gedetecteerd stroom
unsigned long pulseCountS = 0; // pulsenteller Stroom
unsigned long prevMillisS = 0; // onthoud starttijd Stroom
unsigned long pulseTimeS = 0; // tijd die 1 puls duurt Stroom
int curWatts = 0; // berekende huidige verbruik in Watt
int totalWh = 0; // totaal aantal Wh
// Local Network Settings
byte mac[] = { 0x0*, 0x2*, 0x2*, 0x7*, 0x4*, 0x1* }; // Must be unique on local network
// ThingSpeak Settings
char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "***";
const int updateThingSpeakInterval = 16 * 1000; // Time interval in milliseconds to update ThingSpeak (number of seconds * 1000 = interval)
// Variable Setup
long lastConnectionTime = 0;
boolean lastConnected = false;
int failedCounter = 0;
// Initialize Arduino Ethernet Client
EthernetClient client;
void setup()
{
// Start Serial for debugging on the Serial Monitor
Serial.begin(9600);
// Start Ethernet on Arduino
startEthernet();
}
void loop()
{
sensorStroom = analogRead(5);
if (sensorStroom > drempelStroom) {pulseStroom = true;}
if (sensorStroom < drempelStroom && pulseStroom) {
pulseStroom = false;
pulseCountS++;
pulseTimeS = (millis() - prevMillisS);
prevMillisS = millis();
curWatts = (( 3600000 / Stroom_C ) * 1000 ) / pulseTimeS;
totalWh = (pulseCountS * 1000) / Stroom_C; // LET OP Wh!
}
// elke 5 minuten de standen loggen via ethernet
if ((millis() - prevMillis) >= 300000) {
prevMillis = millis();
if (client.connect(server, 80)) {
client.print("GET /processdata.php?curwatts=");
client.print(curWatts);
client.print("&totalwh=");
client.print(totalWh);
client.print("&curdm3=");
client.print("&totall=");
client.println(" HTTP/1.1");
client.println(F("Host: Thingspeak "));
client.println(F("Connection: close"));
client.println();
delay(1);
client.stop();
pulseCountS = 0;
}
}
// Read value from Analog Input Pin 0
String analogValue0 = String(analogRead(A0), DEC);
// Print Update Response to Serial Monitor
if (client.available())
{
char c = client.read();
Serial.print(c);
}
// Disconnect from ThingSpeak
if (!client.connected() && lastConnected)
{
Serial.println("...verbinding verbroken");
Serial.println();
client.stop();
}
// Update ThingSpeak
if(!client.connected() && (millis() - lastConnectionTime > updateThingSpeakInterval))
{
updateThingSpeak("field1="+analogValue0);
}
// Check if Arduino Ethernet needs to be restarted
if (failedCounter > 3 ) {startEthernet();}
lastConnected = client.connected();
}
void updateThingSpeak(String tsData)
{
if (client.connect(thingSpeakAddress, 80))
{
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(tsData.length());
client.print("\n\n");
client.print(tsData);
lastConnectionTime = millis();
if (client.connected())
{
Serial.println("Verbinden met ThingSpeak...");
Serial.println();
failedCounter = 0;
}
else
{
failedCounter++;
Serial.println("Verbinden met ThingSpeak mislukt ("+String(failedCounter, DEC)+")");
Serial.println();
}
}
else
{
failedCounter++;
Serial.println("Verbinden met ThingSpeak mislukt ("+String(failedCounter, DEC)+")");
Serial.println();
lastConnectionTime = millis();
}
}
void startEthernet()
{
client.stop();
Serial.println("Verbinden Arduino met netwerk...");
Serial.println();
delay(1000);
// Connect to network amd obtain an IP address using DHCP
if (Ethernet.begin(mac) == 0)
{
Serial.println("DHCP mislukt, reset Arduino om weer te proberen");
Serial.println();
}
else
{
Serial.println("Arduino verbonden met netwerk d.m.v. DHCP");
Serial.println();
}
delay(1000);
/*Serial.print(sensorStroom);
Serial.print("\t");
delay(100);
*/
}
}
ik krijg nu vooral te maken met deze melding:
'prevMillis' was not declared in this scope -
EngineerAtHome
Zoals Coen al aangeeft is het richten van de sensor in het begin even lastig, dit lukt inderdaad het beste als je live meekijkt via de serial monitor op de analoge input.
Waarom analoog? Dan kun je in de software wat hysteresis inbouwen, d.w.z. dat je bijvoorbeeld aanschakelt boven 605 en afschakelt onder 595, zo voorkom je meetfouten omdat de waardes altijd een beetje schommelen.
Afplakken van het venster is niet nodig, dat heb ik ook niet gedaan, het belangrijkste is dat de led loodrecht door het glas/plastic schijnt zodat er geen reflecties optreden. -
Coen
Thomas,
Voor het beste resultaat heb ik de TCRT5000 sensor loodrecht op de draairichting van de ferraris schijf gezet. Het is dan wel even goed mikken, maar het resultaat geeft, iig bij mij, een goed resultaat met een analoge waarde tussen de ~ 500 en de 600 voor het gewone gedeelte van de schijf. En een piek van ~700 daar waar het gemarkeerde vlakje voorbij komt.
Ik heb de meter ook preventief gedeeltelijk afgeplakt, of dat veel uitmaakt weet ik eigenlijk niet, de sensor meet IR licht en dat is minder gevoelig voor daglicht.
Juist voor het goed installeren zou ik adviseren om hem op een analoge input te zetten van je arduino. En te kijken welke waardes hij genereerd.
Voor extra gemak zou je de serial monitor kunnen onderscheppen met een programma als 'processing' (bijv. http://www.dustynrobots.com/academia/teaching/seeing-sensors-how-to-visualize-and-save-arduino-sensed-data/) , en deze dan tonen in een realtime grafiek weergeven. Dat heeft mij erg geholpen, ook voor het uitlijnen van de water- en gas-sensor.
-
Thomas
Leuk project!
Ik ben van plan ook een energiemeter te maken en heb op moment een TCRT5000 sensor module (VCC, GND,D0,A0). Is het beter om de digitale uitgang te gebruiken ipv de analoge? En hoe zorg je ervoor dat de draaischijf goed uitgelezen wordt?
Ik heb even snel geprobeerd om te zien of de sensor het balkje (rood) op de draaischijf kan detecteren. Maar hij lijkt niet goed te zien. Wat is de beste manier? Dat stuk van de meter afplakken met alleen nog een verticaal spleetje waar de sensor doorheen kan schijnen? -
Coen
Jeroen, de module die je noemt ken ik niet, maar als ik google mag geloven kan dit een heel goedkope wifi oplossing zijn! Er zijn op zich veel hits in google op 'esp8266' en 'arduino', misschien moet je dat eens proberen. Ik kan je zo 123 niet helpen aan een eenvoudige installatie handleiding.
-
Jeroen
Bedankt voor je antwoord Coen! Tot zover snap ik het. Ik heb een WiFi Serial Transceiver Module (ESP8266) tot mn beschikking, kan ik daar wel iets mee dan? Een shield is inderdaad duur.
-
coen
Hoi Jeroen, Dat probleem had ik ook. Hier heb ik zelf een oude wifi router voor gebruikt die je voor een paar euro bij een kringloopwinkel kan kopen. Deze router heb ik in client/bridge mode ingesteld naar mijn modem/router. Vervolgens kan je dan met een ethernetshield online met je arduino, wat aanzienlijk goedkoper is dan een wifi shield.
-
Jeroen
Ik ben een totale noob qua Arduino maar het intrigeert me ernorm. Ik heb een hele lading UNO's en sensoren besteld en wil dit ook in de meterkast regelen. Nu heb ik in de meterkast niet de mogelijkheid om een utp te trekken. Er zijn ook wifi boards voor de arduino te koop, kan ik het ook draadloos aflezen? Sorry voor de domme vraag haha maar ik ben een leek.
-
EngineerAtHome
Dat is een lastige opgave, om de waarde om 0.00u 's nachts te resetten moet de Arduino immers de tijd weten. Dit kan wel met de Time-library, eventueel via NTP gesynchroniseerd met een tijdserver op internet, maar de vraag is of je dit wil...
Als het goed is werkt je sql-statement ook voor het huidige logging-interval van 5 minuten met reset na 5 minuten (ik heb de Arduino-code aangepast zoals gisteren besproken) alleen moet er dan wat meer gerekend worden door de server, maar die gaat een stuk beter met datum en tijd om dan de Arduino. -
Dick
Zou jij mij nog een hint kunnen geven hoe ik de totalWh voor 24 uur kan realiseren ipv huidige accumulatieve waarde, i.e reset naar nul at midnight. De arduino code is nog een grote puzzel voor me.
De jaarlijkse totalWh kan ik dan makkelijk construeren met een sql statement max totalWh as jaartotaal interval 1 year.
-
Dick
Het zat me niet lekker dat het niet lukte. Ik ging uit van een drempeleaarde op basis van signaalsterkte terwijl het prototype op de werkbank lag. Heb vanochtend dezelfde debugging gedaan terwijl de tcrt op de kwh geplakt was en ontdekte toen een substantiele verandering in signaalsterkte. Ben toen begonnen de drempelwaarde te veranderen en zie daar! Maar bevestiging dat ik goed zat komt altijd van pas voor een novice user.
Realiseer me inderdaad dat curWatts alsnog wordt afgerond aangezien ik die als int blijf wegschrijven.
pulseCountS issue begrepen, ga aan de slag.
Top je snelle reaktie! -
EngineerAtHome
Mooi dat het nu werkt, of had je het zelf al gevonden? :-)
1) Een float gebruiken is hier inderdaad de oplossing, bedenk wel dat curWatts alsnog wordt afgerond tenzij je hier ook een float van maakt.
2) Nu je het zegt bedenk ik me dat iemand me hier al eerder op gewezen heeft, er zit inderdaad een foutje in de code. Omdat totalWh wordt berekend uit pulseCountS moet pulseCountS gereset worden, en totalWh niet (per se). Op deze manier voorkom je ook een overflow op de pulsecounter. -
Dick
Absoluut Top, dat was de trick, de drempelwaarde is nu juist ingesteld hetgeen het volgende resultaat oplevert, http://tspieghel.33w.net/vera/energie.php
Toch nog een paar vragen:
1) mijn meter geeft 187.5tr/Kwh, ik heb derhalve de code regel gewijzigd in: const float Stroom_C = 187.5; is dit correct? (float?)
2) Ondanks het feit dai ik de code gecopieerd heb van deze website, zijnde:
client.println(F("Host:192.168.0.111"));
client.println(F("Connection: close"));
client.println();
delay(1);
client.stop();
totalWh = 0;
totalDm3 = 0;
totalL = 0;
}
}
geeft TotalWh de accumalitieve waarde aan ipv op nul gezet na elke vijf minuten. Is de lokatie van totalWh = 0;
correct of moet het een "}" lager zijn.
Nogmaals enorm bedankt voor deze zeer handige hobby tool!
-
EngineerAtHome
Beste Dick, of dat de pull-up-weerstand nu 2K of 10K groot is maakt niet zo heel veel uit, de uitgelezen waardes zullen iets verschuiven op de schaal en de nauwkeurigheid zal iets veranderen maar dit maakt weinig uit zolang je tussen de 1K en 20K blijft.
Om de code werkend te krijgen moet je alleen nog de drempelwaarde instellen (const int drempelStroom). Als jouw waarde in rust 1015 is en tijdens passeren van de streep op je kWh-meter rond de 880 zou een drempel van ((1015 - 880) / 2) + 880 = ±945 juist zijn. Standaard staat de drempel op 650, vandaar dat je dus geen waardes ziet verschijnen, de sensorwaarde daalt immers nooit onder de drempel. -
Dick
betreft Stroom meteing met Arduino Uno en Ethernet shield 2;
In dit schrijven wordt gerefereerd naar de toepassing van een 100 en 10K Ohm weerstand. In een artikel op juerd.nl wordt echter gerefereerd naar 100 en 2K Ohm. Welke is de juiste combinatie? Als ik de serial debugging aan zet krijg ik een waarde van ca 1015 en tussen 874-900 indien ik een credit card over de optical sensor swipe. Aangezien ik moeilijk waarden in m'n database krijg, heb ik geprobeerd om de serial debugging alsvolgt aan te passen:
Serial.print(sensorStroom);
Serial.print("\t");
Serial.print(curWatts);
Serial.print("\t");
Serial.print(totalWh);
Serial.println();
delay(100);
Dit levert geen enkele waarden voor curWatts en totalWh op nadat ik menig keer over de optical sensor swipe. Waar zit ik fout in mijn gedachtengang waardoor ik geen readouts krijg?
Graag advies om dit prachtig stukje werk aan de praat te krijgen. Database en highcharts geen probleem, alleen de data nog! -
Coen
Bij deze nog een aanvulling op de arduino code voor het nauwkeuriger wegschrijven van het stroomverbruik.
Op basis van het laatst gemeten wattage en de tijd verstreken tussen de laatste puls en het moment van het schrijven van de log kun je een inschatting maken van de energie die sinds die tijd nog is verbruikt, en optellen bij de totalWh.
Dit kan met een formule als deze:
//extrapolatie obv laatste wattage en verlopen tijd sinds laatste pulse
totalWh = totalWh + curWatts*(millis()-prevMillisS)/3600000.0;
totalWh en curWatts heb ik overigens wel als 'float' gedefinieerd ipv 'int' en ik laat totalWh met 2 decimalen wegschrijven naar de log-server als volgt: String(totalWh, 2).
Coen -
EngineerAtHome
Beste Coen, ik heb jouw stuk over loggen naar Sparkfun op de volgende pagina geplaatst: http://www.engineerathome.com/elektronica/arduino+data+naar+sparkfun+loggen/46, nogmaals dank!
-
EngineerAtHome
Ha Coen, dank!
De delay(1) komt uit de webserver voorbeeldcode van Arduino, het geeft de webserver of browser aan de andere kant van de lijn iets meer tijd om de binnenkomende data te verwerken voordat de verbinding wordt verbroken.
Ik bereken hier steeds een nieuwe totalWh per 5 minuten omdat ik dan gemakkelijk een grafiek kan tekenen. Het dagtotaal bereken je eenvoudig weg met een SQL-query (SELECT SUM(totalWh) as dagverbruik WHERE timestamp > DATE_SUB(CURDATE(), INTERVAL 1 DAY)). Natuurlijk kun je er ook voor kiezen om totalWh gewoon op te laten lopen per 24 uur, het is maar net wat je handig vindt.
Bedankt voor je aanbod, misschien kan je een kort stukje schrijven over hoe dat loggen naar Sparkfun werkt? Dan plaats ik dat op de site, denk dat veel mensen zonder eigen server daar erg benieuwd naar zijn. -
Coen
Beste engineer@home,
mooi stukje code voor de arduino! ik heb het integraal gekopieerd :-) en heb voor nu de kwh meter ook daadwerkelijk geimplementeerd. Ik schrijf de data weg naar Sparkfun.
Wat kleine vraagjes:
* Wat is het idee bij de miliseconde rust nadat de web-client is benaderd?
* Waarom wordt totalWh op 0 gezet in de 5 minuten-database-wegschrijf loop?
Als ik ergens kan helpen of meedenken bij dit project hoor ik het graag. Ik heb programmeer-ervaring -
EngineerAtHome
Ha Fons, dat is een hele goede vraag, zeker voor een beginner :-)
De Arduino kan inderdaad maar een ding tegelijk maar doet zijn taken gelukkig wel heel erg snel. Bij een normaal verbruik van een paar honderd Watt zal de Arduino niet gauw een puls missen.
Op het moment dat je waterkoker, oven en vaatwasser aan staan en het verbruik in de kiloWatts ligt draait je kWh-meter echter zo snel dat het kan gebeuren dat de Arduino een puls mist tijdens wegschrijven naar de server. Aan de ene kant is dat een probleem, heel even denkt de Arduino dat je maar 300 Watt gebruikt i.p.v. 5000 Watt, bij de volgende puls zal hij zich echter weer herstellen. Aan de andere kant mis je een puls bij het optellen van het totaalverbruik, als je meter een C van 600 heeft mis je dus 1/600 kWh, elk uur schrijf je weg dus dat is maximaal 24/600 kWh per dag = 40Wh per dag onnauwkeurigheid.
Als je deze onnauwkeurigheid niet wilt kun je gebruik maken van een pin interrupt. Een interrupt kan de processor van de Arduino altijd, waar dan ook in het programma, onderbreken om zijn interrupt routine uit te voeren. Als de Arduino dus midden in een log-sessie met de server zit zal de interrupt dit gewoon onderbreken om de puls weg te schrijven, en daarna weer verder te gaan met loggen. Toen ik dit project maakte had ik echter nog nooit van een interrupt gehoord, ik heb ook heel veel moeten leren ;-) -
Fons
Prachtig project.
Zelf wil ik dit ook gaan maken.
Echter ik ben nog maar een beginner op dit vlak.
Dus eerst een leerweg volgen.
Mijn vraag is, de Arduino kan maar 1 ding tegelijkertijd (geen multitasking computer) wat gebeurd er met een puls als op dat moment de Arduino bezig is met het wegschrijven van de informatie?
Hoe is dit op te lossen of is het helemaal geen probleem?
Over dit onderwerp heb ik nog niets gelezen.
Fons -
svd010
Goeden dag,
Ik lees vandaag Steeds meer over wat er mogelijk is met arduino.
Van de week voor eerst gehoord wat er mogelijk is op me werk pompen testen cv ketels aan sturen enzo.. nu op je blog terecht gekomen en ik ben bang dat ik wat hier en daar gaat bestellen... Dankt voor de basiskennis
Stefan -
EngineerAtHome
Heren, bedankt voor de complimenten. Onder het artikel heb ik de volledige code toegevoegd die maximaal 3 verschillende sensors kan uitlezen en de waardes elke 5 minuten doorstuurt naar een SQL-database.
Meer over het loggen naar een database vind je ook in het artikel "Arduino data online loggen" dat staat gelinkt onderaan dit artikel. Daar staat ook beschreven hoe je een staafdiagram kunt tekenen met behulp van PHP en HTML.
Je zou overigens ook nog van de standaard grafiekoptie van PHPmyAdmin gebruik kunnen maken, helemaal makkelijk! -
Danny
Hoi Enigeneer@home,
Harstikke prachtig project! Alleen zoals Luuk ook al aangeeft; niet iedereen is een computer genie.
Zou je de door jouw gebruikte sketch ergens willen uploaden en ook het stukje software wat de mooie grafische weergave van je verbruik visualiseert?
Bedankt en Ga zo door!
mvg,
Danny -
Luuk
Beste EngineerAtHome,
Is het mogelijk om deze gehele code die gebruikt wordt om oa de ftp te delen? Het lukt mij namelijk niet om de Arduino websever code met de internetshield te gebruiken in combinatie met de uitlees code.
Ik zou graag willen dat de code ready to use is. Aangezien ik niet zon held ben in programmeren.
Met vriendelijke groet,
Luuk -
EngineerAtHome
Beste Léon, bedankt voor jouw oplettendheid, daar mist inderdaad een haakje!
Waarschijnlijk heb jij jouw computer, tv en wat verlichting aan staan, dan is 700 Watt helemaal geen vreemd verbruik. Mijn rustverbruik midden in de nacht is ongeveer 70 Watt. 's Avonds met de computer, televisie, verlichting etcetera aan haal ik die 700 Watt ook met gemak.
Je kunt de waterkokertest doen om te controleren of je meting een beetje klopt. Onderop je waterkoker staat als het goed is hoeveel Watt deze verbruikt. Bekijk via je Arduino wat het actuele verbruik is en wat je verbruikt als de waterkoker aan staat. Is dit verschil ongeveer zoveel als de waterkoker zou moeten verbruiken? Dan gaat de meting goed.
Overigens kan er best een tweezijdige tolerantie van zo'n 50 Watt op je waterkoker zitten, dus verwacht geen exacte getallen. -
Léon
Beste EngineerAtHome,
Volgens mij is er een typefout in je voorbeeld geslopen. De code “curWatts = (3600000 / (C * pulseTime) * 1000;” is incompleet omdat er een ) mist. Volgens mij moet dit zijn curWatts = (3600000 / (C * pulseTime)) * 1000;
Wat is trouwens een beetje gemiddeld Watt verbruik? Als ik mijn code draai en +/- elke 11 seconden de sensor ‘laat afgaan’ (wat ik ook op mijn meter zie). Dan komt ik op een CurrWatts uit van tussen de 600 en 700. Vergeleken met de grafiek die u laat zien is dat nogal een verschil!
Doe ik ergens iets fout? De code hoe ik hem nu als test heb draaien: https://github.com/LeonB87/Domotica/blob/master/KwH_Sensor.ino
M.vr.gr.
Léon
-
Leon
Kun je meer een voorbeeld geven van een ingevoerde code?
Of meer uitleg geven hoe ik de juiste code krijg om te gebruiken? -
EngineerAtHome
Je kan dit op een aantal manieren oplossen. In mijn geval is pulseCount per dag; om twaalf uur 's nachts log ik de data naar mijn SQL-server en reset ik alle variabelen waaronder pulseCount.
Je zou pulseCount ook als unsigned long kunnen declareren, dan kun je grofweg 4 miljard pulsen tellen, das een hoop stroom :-D -
Patrick
Ik snap pulseCount niet helemaal. Pulsecount sinds wanneer? Per uur? Want je kan niet oneindig de pulsen blijven optellen, je krijg een keer een overflow.
-
thomas
Hej,
Heb je misschien de code op Github staan of iets dergelijks? Mijn Arduino reageert namelijk heel anders op deze logica :P -
EngineerAtHome
Goed dat je het vraagt, dat is inderdaad cruciale informatie die nog ontbrak in mijn artikel! Ik heb het artikel uitgebreid onder het kopje 'Aansluiten op je Arduino', daar had ik meer plek dan hier. Succes met bouwen!
-
Bart
Na het lezen van je blog wil ik dit graag nabouwen. Ben helemaal nieuw met het zelf knutselen aan elektronica. En heb nu de volgende vraag: Als ik een TCRT5000 aansluit op mijn arduino moet ik dat dan doen met behulp van wat weerstandjes en zoja waarom dan, en welke?
-
EngineerAtHome
@ Alex en Chad, ik heb het artikel flink uitgebreid. Jullie vragen worden nu in de tekst behandeld.
-
Chad
Je schreef: "De sensors zijn simpele LDR's die de reflectie van een blauwe led opvangen via de KWh-schijf of gasmeter."
Kan je hier meer over vertellen? Lees je dan de verbruik op deze wijzen uit? -
Alex
Kun je uitleggen hoe je dit hebt gedaan?
-
EngineerAtHome
Haha, ja dat kan natuurlijk ook :-)
-
Marjon
En ik maar gewoon met een zaklamp, pen en papier de gasmeter volgen in deze extreem koude dagen.
-
Oscar
Wordt deze ook beschikbaar als Brick? Dan wil ik er wel eentje!