Draadloze vermogensmeter

verwarming, isolatie, huiselijk energieverbruik

Moderator: Moderators

hanskraayeveld
Berichten: 709
Lid geworden op: 04 okt 2015, 14:49

Draadloze vermogensmeter

Bericht door hanskraayeveld »

Op velerlij aandringen ben ik sinds kort overgestapt op een raspberry pi met domoticz.
Dat ging niet vlekkeloos, vind het behoorlijk ingewikkeld.
Toch heb ik wel een paar goede stappen in de richting gemaakt vind ik zelf.

Zoals velen wellicht weten heb ik een arduino met touchscreen die de opbrengst van mijn houtkachel meet.
Nu wilde ik in domoticz "zien"
Het is uiteindelijk gelukt en het resultaat mag er wezen! (schouderklop)
Mijn arduino heeft draadloos verbinding met mijn raspberry pi.
Kan ook gebruikt worden om de opbrengst van je zonneboiler te meten en monitoren.

Wat zijn de benodigdheden?

Een raspberry pi met domoticz en een 433.92 ontvanger.

Een arduino, 2 ds18b20 temperatuursensoren, een 4,7Kohm weerstand, een watermeter met pulsuitgang (per liter), en een 433 mhz transmitter

En deze schets:

Code: Selecteer alles

//Arduino vermogensmeter
//Arduino Uno
//2x ds18b20
//4,7 kOhm weerstand
//433 mHz transmitter
//Puls per 1 liter!
//libraries kunnen via google gedownload worden, onewire, dallas en x10rf

#include <OneWire.h> 
#include <DallasTemperature.h>
#include <x10rf.h>

#define tx 2   //pin 2 op de data van de transmitter
#define reps 5

#define ONE_WIRE_BUS 12  //pin 12 verbinden met de 2 data kabels van ds18b20 tempsensoren (de gele kabel)

x10rf myx10 = x10rf(tx,0,reps);

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

byte inPin = 10; // pin van de watermeter
byte waterpulsesensor;
byte klaar = 0;

unsigned long pulsintime1, pulsintime2, looptimepulses = 0;
unsigned long tempdif;
unsigned long kw, wattage = 0;
unsigned long whloop, whtotal = 0;



float temp1, temp2 = 0;

ISR (PCINT0_vect)
{
  if (digitalRead (inPin) == HIGH && klaar == 0)
     {pulsintime1 = millis(); klaar = 1;}
  
  if (digitalRead (inPin) == LOW && klaar == 2)
     {pulsintime1 = millis(); klaar = 3;}
}

void setup(void) 
{
  pinMode(inPin, INPUT_PULLUP);
  digitalWrite(inPin, HIGH); 

  PCMSK0 |= bit (PCINT2);  // pin 10 arduino mega
  PCIFR  |= bit (PCIF0);   // clear any outstanding interrupts
  PCICR  |= bit (PCIE0);   // enable pin change interrupts for D8 to D13 
  
  millis();
  DS18B20.begin();
  DS18B20.setResolution(12);

  myx10.begin();
  Serial.begin(9600);
}

void waterpulsemenu()
{ 
  looptimepulses = (pulsintime1 - pulsintime2);
  pulsintime2 = pulsintime1;
  
  DS18B20.requestTemperatures();
  temp1 = DS18B20.getTempCByIndex(0);
  temp2 = DS18B20.getTempCByIndex(1);
  
  if (temp1 < -100){temp1 = 0.0;}
  if (temp2 < -100){temp2 = 0.0;}

  tempdif = (temp2*10 - temp1*10);
  whloop = tempdif * 1164;
  kw = (((float)whloop*36)/looptimepulses);
  whloop = whloop / 1000;
  whtotal += whloop;
  klaar = 2;

  energievermogenzenden();
  
  Serial.print("PulsInTime:   ");
  Serial.print(pulsintime1);
  Serial.print("   PulsInLapTime:   ");
  Serial.print(looptimepulses);
  Serial.print("   TempKoud:   ");
  Serial.print(temp1);
  Serial.print("   TempWarm:   ");
  Serial.print(temp2);
  Serial.print("   TempDiff   ");
  Serial.print(tempdif);
  Serial.print("   Kw   ");
  Serial.println(kw);
}
void energievermogenzenden()
{
  myx10.RFXmeter(100,0,whtotal/10);
  myx10.RFXmeter(101,0,kw*10);
}


void loop(void)
{
  if (klaar == 1 && millis() - pulsintime1 > 500){waterpulsemenu();}
  if (klaar == 3 && millis() - pulsintime1 > 500){klaar = 0;}
  
  if (kw > 0 && millis() - pulsintime1 > (looptimepulses * 1.1)){looptimepulses = looptimepulses * 1.1; kw = kw / 1.1; energievermogenzenden();} 
  if (millis() - pulsintime1 > 600000){kw = 0; energievermogenzenden();}
}
In domoticz zie je dan 2 nieuwe sensoren. De eerste zend het vermogen, de 2e de energie.
Noem degene die het vermogen zend 'Power' en degene die de energie zend 'Energy'.
Dan maak je in domoticz een virtual sensor aan van electriciteit. Noem de virtuele sensor 'PowerEnergy'.
Kijk welk idx nummer je VIRTUELE sensor heb, en verander die in de onderstaande tekst.
Dan ga je naar de lua map in domoticz en upload je deze tekst en sla die op als "script_device_vermogensmeter.lua"

Code: Selecteer alles

--Domoticz Script to get medium actual power and energy between energy counter readings and puts it on a dummy device

--First create a dummy energy meter.
--Then enter the details below
--Name of the real energy and power counter

energyCounter = 'Energy'
powerCounter = 'Power'

--Name of the created dummy energy meter with the new actual value

dummyPowerEnergyMeter = 'PowerEnergy'

--ID of the created dummy energy meter with the new actual value

dummyEnergyMeterid = 12

commandArray = {}

if devicechanged[powerCounter] then

	--update dummy energy meter

	commandArray[1] = {['UpdateDevice'] = dummyEnergyMeterid .. "|0|" .. otherdevices_svalues[powerCounter] .. ";" .. otherdevices_svalues[energyCounter]}

	print(dummyEnergyMeter .. ": " .. otherdevices_svalues[powerCounter] .. " W, " .. otherdevices_svalues[energyCounter] .. " Wh")

end

return commandArray
Met een beetje geluk, zie je dan wat je op deze screenshot ziet.
Vermogensmeter.png
Laatst gewijzigd door hanskraayeveld op 18 nov 2017, 14:10, 2 keer totaal gewijzigd.
JantjeV8
Berichten: 4014
Lid geworden op: 03 feb 2009, 12:50

Re: Draadloze vermogensmeter

Bericht door JantjeV8 »

Oefff, ehhh, ik denk dat dat wel knap is.. :?
hanskraayeveld
Berichten: 709
Lid geworden op: 04 okt 2015, 14:49

Re: Draadloze vermogensmeter

Bericht door hanskraayeveld »

Tja, je moest eens weten hoeveel werk erin zit :evil:

En wat zo jammer is, dat ik er dan na een paar maanden achter komt dat er zoiets al jaren op de markt is voor een habbekrats.
Gebruikersavatar
benthuis
Moderator
Berichten: 2186
Lid geworden op: 18 mei 2010, 21:42

Re: Draadloze vermogensmeter

Bericht door benthuis »

Overkomt mij bijna net zoiets met bijna alle fancy pansy electronica escapades... Staat het er en dan denk ik, wat moet ik er eigenlijk mee. Maar Kockie had een ESP met allerlei protocollen gevonden. Ga hier toch maar weer eens mee knooien.
Kom ik boven aan de ladder, staat ie tegen de verkeerde muur... (Naar Covey)
JantjeV8
Berichten: 4014
Lid geworden op: 03 feb 2009, 12:50

Re: Draadloze vermogensmeter

Bericht door JantjeV8 »

Ehh, een watte???
hanskraayeveld
Berichten: 709
Lid geworden op: 04 okt 2015, 14:49

Re: Draadloze vermogensmeter

Bericht door hanskraayeveld »

Ik weet niet of er belangstelling voor is, maar ik heb eventueel ook nog de code voor een draadloze 433mHz regenwaterput meter.

Slaat nergens op, maar het leek mij wel leuk (ik gebruik regenwater voor mijn vaatwasser, wasmachine, en toilet) om de inhoud van mijn regenwaterreservoir te meten. Zo kun je (als je het dakoppervlak berekend), ook automatisch de gevallen regen meten en hoeveel regenwater je gebruikt.

Benodigdheden:

Arduino Nano met batterijhouder, waarvan ik de powerled express gesloopt heb, voor een langere levensduur.
433 mHz transmitter
ultrasonic distance module, die ook gebruikt wordt in de bumper van auto's

Code: Selecteer alles

#include <x10rf.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

#define tx 12         // Pin number for the 433mhz OOK transmitter

#define reps 5        // Number of times that a RF command must be repeated.

#define ledpin 6

volatile int f_wdt=1;

x10rf myx10 = x10rf(tx,0,reps);

byte trig = 3;
byte echo = 2;

unsigned int duration;
float distance = 0;
byte i = 0;
unsigned int myTime[4];

ISR(WDT_vect)
{
  if(f_wdt == 0){f_wdt=1;}
}

void enterSleep(void)
{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();
  sleep_disable();
  power_all_enable();
}



void setup() {
  
  MCUSR &= ~(1<<WDRF);
  WDTCSR |= (1<<WDCE) | (1<<WDE);
  WDTCSR = 1<<WDP0 | 1<<WDP3;
  WDTCSR |= _BV(WDIE);
  
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);

  Serial.begin(9600);
  
  // Transmitter is connected to Arduino Pin #12 
  myx10.begin();
  
}

void loop() {

if(f_wdt == 1)
  {
    f_wdt = 0;
    digitalWrite(ledpin, HIGH);
    
  for(i = 1; i < 4; i++){
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  duration = pulseIn(echo, HIGH);
  myTime[i] = duration;

  }

  if (myTime[1] <= myTime[3] && myTime[1] >= myTime[2]){duration = myTime[1];}
  if (myTime[2] <= myTime[1] && myTime[2] >= myTime[3]){duration = myTime[2];}
  if (myTime[3] <= myTime[2] && myTime[3] >= myTime[1]){duration = myTime[3];}
  if (myTime[1] >= myTime[3] && myTime[1] <= myTime[2]){duration = myTime[1];}
  if (myTime[2] >= myTime[1] && myTime[2] <= myTime[3]){duration = myTime[2];}
  if (myTime[3] >= myTime[2] && myTime[3] <= myTime[1]){duration = myTime[3];}
  
  distance = duration / 58.2;
  if (distance <= 0){distance = 999;}

  int inhoud = float(252 - distance) * float(34.225);
 
  myx10.RFXmeter(103,0,inhoud);

  Serial.print(myTime[1]);
  Serial.print(" ");
  Serial.print(myTime[2]);
  Serial.print(" ");
  Serial.print(myTime[3]);
  Serial.print(" gemiddelde: ");
  Serial.print(distance);
  Serial.print("    ");
  Serial.println(inhoud);
  
    delay(200);
    digitalWrite(ledpin, LOW);
    for (int a = 0; a < 7; a++){
    enterSleep();
    }
}
}
deze regel aanpassen voor de berekening:

int inhoud = float(252 - distance) * float(34.225);

Mijn vat is 185cm x 185cm x 200cm.
Dus per cm 34,225 liter.
mijn sensor zit 52 cm boven de bovenkant van het vat (waterstand) dus vandaar de 252 - de afstand tot het water

Hij meet 3x de afstand tot het water. En omdat er nog weleens een foutje insluipt, pak ik de middelste waarde. Niet het gemiddelde.
Dat is redelijk betrouwbaar gebleken!
Als er iemand een nog betere suggestie heb, hoor ik het graag.

Je hebt er niks aan, maar misschien maak ik hier iemand wel gelukkig mee.
Ruuben
Berichten: 1796
Lid geworden op: 14 okt 2012, 18:42

Re: Draadloze vermogensmeter

Bericht door Ruuben »

:D echt supercool dat je dit deelt.
pelletpower
Berichten: 3289
Lid geworden op: 12 nov 2011, 13:21

Re: Draadloze vermogensmeter

Bericht door pelletpower »

Hans.
Heb je nog tips om met Arduino te beginnen. Ik zoek eigenlijk een georganiseerde cursus in de buurt van Waalwijk. Gewoon betalen en dan de verplichting om op te komen dagen. Vrijblijvend thuis aanklooien betekent dat er niets gebeurd.
Alvast bedankt.
hanskraayeveld
Berichten: 709
Lid geworden op: 04 okt 2015, 14:49

Re: Draadloze vermogensmeter

Bericht door hanskraayeveld »

Dat is een lastige vraag. Ik ben iemand die gaat skiën, zonder les. Leer alles fout aan, maar het lukt uiteindelijk aardig.
Zo ook met programmeren.
Ik schrijf bijvoorbeeld nooit als ik aan het programmeren ben, uitleg erachter. Eigenlijk is dat fout, want als ik een lange programmeertext heb, zie ik soms door de bomen het bos niet meer.
Ik neem aan dat jij structureel bent, of wil zijn, en dat je les voor les, stapje voor stapje verder komt.
Ik vind dat verschrikkelijk. Ik kan dat niet. Ik wil de eerste les al een programma schrijven om mijn huis helemaal te automatiseren.
Ik moet altijd vreselijk geremd worden, leraren vinden dat frustrerend, en ik ook. Want ik hoef geen schema te tekenen, concept hoe het eruit moet gaan zien, plan van aanpak, enz enz. Ik wil nu programmeren, niks anders, en het liefst over 5 minuten resultaat.

Hoe ik het mezelf aangeleerd heb.

Ik heb een redelijk makkelijke bestaande sketch, waarvan ik dacht dat ik die gedeeltelijk wel kon gebruiken voor mijn "idee" (het meten van mijn vermogen/energie van mijn houtkachel naar cv) geupload naar een arduino uno.

Het meten van temperatuur met een ds18b20. En dan uitlezen via de seriele poort.

Dat was al een relatief grote stap. Voornamelijk libraries invoeren (include dallastemperature, onewire) vergt enige oefening.
Oefen met libraries invoeren. Voor bijna elke sensor heb je een aparte library nodig.

Oefen ook met de seriele poort. Dat is hartstikke handig! Daarmee kun je alles "uitlezen"

Oefen met het invoeren van tijd. millis()

Probeer 2 simpele programma's te combineren. Daar leer je verschrikkelijk veel van.

Ik vergeet 1 ding. Voor ik mijn eerste arduino binnen had, via china, heb ik geoefend met UnoArduSim. Een simulator. Voor de beginners echt aan te raden, want je hoeft al niet alles aan te sluiten...

Voor de rest...

Tja, de wil om er echt wat mee te bereiken. Zie er een uitdaging in. Je wilt het gaan doen met een reden.
Probeer die reden in stappen te bereiken.

Je mag me altijd om hulp vragen!
Gebruikersavatar
benthuis
Moderator
Berichten: 2186
Lid geworden op: 18 mei 2010, 21:42

Re: Draadloze vermogensmeter

Bericht door benthuis »

Hebben al eens een cursus willen starten. Ook de geschikte leraar gevonden... echter in het oosten...
Als je op internet zoekt naar fablabs en meetups voor IoT, komt er vast iets in de buurt naar boven.
Kom ik boven aan de ladder, staat ie tegen de verkeerde muur... (Naar Covey)
hanskraayeveld
Berichten: 709
Lid geworden op: 04 okt 2015, 14:49

Re: Draadloze vermogensmeter

Bericht door hanskraayeveld »

Ben jij er goed in benthuis? Ik zou het wel makkelijk vinden om soms wat te vragen aan iemand die er veel verstand van heeft, want sommige dingen snap ik ook niet. Bijvoorbeeld: Ik zou mijn kwh totaal wel op willen slaan in het geheugen van de arduino. Stel dat de stroom erafgaat, dat niet alles op nul gaat. Heb het al eens geprobeerd maar drama. Ik las dat je het ook niet te vaak kan doen ivm slijtage oid?
pelletpower
Berichten: 3289
Lid geworden op: 12 nov 2011, 13:21

Re: Draadloze vermogensmeter

Bericht door pelletpower »

Hans, herkenbaar hoe het bij jou gaat. Mijn ervaring is gewoon afspreken/betalen voor een aantal vast uren. Dan zorg je dat je er bent, er wordt niet achteraan met programmeren begonnen. De zaak wordt afgeremd en op de juiste manier geleerd. Dat scheelt een hoop dubbel werk en slechte manieren weer afleren. En zonder die harde afspraken gebeurt er voornamelijk niets.

Ben, dat valt toch tegen hier in de buurt. En het mag gerust een 30 km rijden zijn. Dus als iemand iets tegenkomt, graag.
Joepie
Berichten: 503
Lid geworden op: 13 mar 2015, 23:17

Re: Draadloze vermogensmeter

Bericht door Joepie »

hanskraayeveld schreef: 20 nov 2017, 00:10 Ik zou mijn kwh totaal wel op willen slaan in het geheugen van de arduino. Stel dat de stroom erafgaat, dat niet alles op nul gaat. Heb het al eens geprobeerd maar drama.
Ik heb er niet veel verstand van, maar heb wel gezien dat er micro-sd modules zijn voor Arduino.
"You can educate a fool, but you cannot make him think” (Talmud)
hanskraayeveld
Berichten: 709
Lid geworden op: 04 okt 2015, 14:49

Re: Draadloze vermogensmeter

Bericht door hanskraayeveld »

Het schijnt zonder die module ook te kunnen. Ik wil eigenlijk maar 2 variabelen opslaan. Kwh en liter. Beetje zonde om daar weer een aparte module voor aan te schaffen, en ik heb er geen plek voor in mijn uno. Mega wel.
Gebruikersavatar
benthuis
Moderator
Berichten: 2186
Lid geworden op: 18 mei 2010, 21:42

Re: Draadloze vermogensmeter

Bericht door benthuis »

hanskraayeveld schreef: 20 nov 2017, 00:10 Stel dat de stroom eraf gaat, dat niet alles op nul gaat. Heb het al eens geprobeerd maar drama. Ik las dat je het ook niet te vaak kan doen ivm slijtage oid?
Zou hiervoor een backup batterij gebruiken...
Ik heb er ook te weinig verstand van helaas.
Kom ik boven aan de ladder, staat ie tegen de verkeerde muur... (Naar Covey)
Plaats reactie