Hout cv in combinatie met boiler en cv ketel

verwarming, isolatie, huiselijk energieverbruik

Moderator: Moderators

William
Berichten: 126
Lid geworden op: 29 jun 2010, 15:36
Locatie: Zeeland

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door William »

Paul schreef:Maar klopt het dat jij idd ook in het plaatsje Zeeland woont!? :D
Jazeker! Maar dan in de provincie :lol:
Ik fabriceer zelf wel wat denk ik... :lol:
William
Berichten: 126
Lid geworden op: 29 jun 2010, 15:36
Locatie: Zeeland

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door William »

Realtime screenshot van mijn test programma.
-Buffer met 4 temp sensors (DS18S10)
-1 sensor op aanvoer net voor buffer.
-Kleuren afhankelijk van temperatuur. (Copyright :lol: )
Naamloos.jpg
Moest het even delen.
Laatst gewijzigd door William op 05 mei 2011, 21:20, 1 keer totaal gewijzigd.
Gebruikersavatar
kockie
Site Admin
Berichten: 8536
Lid geworden op: 28 jan 2006, 17:42
Locatie: Zeddam
Contacteer:

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door kockie »

Mooi gemaakt. Wil je de broncode delen?
Mensen zeggen wel eens dat ik troep verzamel; ik noem mezelf liever een industrieel-amateur-archeoloog die probeert waardevolle artefacten te behouden.
Why should I work harder when I can work smarter
William
Berichten: 126
Lid geworden op: 29 jun 2010, 15:36
Locatie: Zeeland

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door William »

Het is gemaakt met Delphi 2010 en maakt gebruik van de WSocket component, om berichten verzonden over intranet te onvangen.
Deze berichten worden verzonden door het programma LogTemp van MRsoft via xAP protocol.
Dit draait op mijn Thin Client, waar ook de iButton adapter en sensors om aangesloten zijn.

Betreft de source;
Ik denk dat je meer doelt op de temperatuur kleuring of niet?
Zie hier:

Code: Selecteer alles

 procedure GradVertical(Canvas:TCanvas; Rect:TRect; FromColor, ToColor:TColor) ;
 var
   Y:integer;
   dr,dg,db:Extended;
   C1,C2:TColor;
   r1,r2,g1,g2,b1,b2:Byte;
   R,G,B:Byte;
   cnt:Integer;
 begin
    C1 := FromColor;
    R1 := GetRValue(C1) ;
    G1 := GetGValue(C1) ;
    B1 := GetBValue(C1) ;
 
    C2 := ToColor;
    R2 := GetRValue(C2) ;
    G2 := GetGValue(C2) ;
    B2 := GetBValue(C2) ;
 
    dr := (R2-R1) / Rect.Bottom-Rect.Top;
    dg := (G2-G1) / Rect.Bottom-Rect.Top;
    db := (B2-B1) / Rect.Bottom-Rect.Top;
 
    cnt := 0;
    for Y := Rect.Top to Rect.Bottom-1 do
    begin
       R := R1+Ceil(dr*cnt) ;
       G := G1+Ceil(dg*cnt) ;
       B := B1+Ceil(db*cnt) ;
 
       Canvas.Pen.Color := RGB(R,G,B) ;
       Canvas.MoveTo(Rect.Left,Y) ;
       Canvas.LineTo(Rect.Right,Y) ;
       Inc(cnt) ;
    end;
 end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  GradVertical(PaintBox1.Canvas, PaintBox1.ClientRect, Color1, Color2) ;
end;

procedure TForm1.PaintBox2Paint(Sender: TObject);
begin
  GradVertical(PaintBox2.Canvas, PaintBox1.ClientRect, Color2, Color3) ;
end;

procedure TForm1.PaintBox3Paint(Sender: TObject);
begin
  GradVertical(PaintBox3.Canvas, PaintBox1.ClientRect, Color3, Color4) ;
end;
Mijn bufferafbeelding bestaat namelijk uit 3 Paintboxes. De kleuren Color1 t/m 4 heb ik gedefineerd afhankelijk van de temperatuur:

Code: Selecteer alles

// Grenswaarden temperatuur naar kleur
if SensorTemp1 >= 70 then Color1:= clRed;
if SensorTemp2 >= 70 then Color2:= clRed;
if SensorTemp3 >= 70 then Color3:= clRed;
if SensorTemp4 >= 70 then Color4:= clRed;

if SensorTemp1 < 70  then Color1:= clPurple;
if SensorTemp2 < 70  then Color2:= clPurple;
if SensorTemp3 < 70  then Color3:= clPurple;
if SensorTemp4 < 70  then Color4:= clPurple;

if SensorTemp1 < 50  then Color1:= clNavy;
if SensorTemp2 < 50  then Color2:= clNavy;
if SensorTemp3 < 50  then Color3:= clNavy;
if SensorTemp4 < 50  then Color4:= clNavy;

if SensorTemp1 < 30  then Color1:= clBlue;
if SensorTemp2 < 30  then Color2:= clBlue;
if SensorTemp3 < 30  then Color3:= clBlue;
if SensorTemp4 < 30  then Color4:= clBlue;

// Paint
GradVertical(PaintBox1.Canvas, PaintBox1.ClientRect, Color1, Color2);
GradVertical(PaintBox2.Canvas, PaintBox1.ClientRect, Color2, Color3);
GradVertical(PaintBox3.Canvas, PaintBox1.ClientRect, Color3, Color4);

Image1.Repaint; //Bring Image (Buffertank) on top
Je mag ook de gehele source hoor, maar hij is nog erg slecht geoptimaliseerd en erg onleesbaar. (zoals bovenstaande code niet erg netjes is... :roll: )
Paul
Berichten: 77
Lid geworden op: 03 dec 2010, 03:45
Contacteer:

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door Paul »

William schreef:Mijn bufferafbeelding bestaat namelijk uit 3 Paintboxes. De kleuren Color1 t/m 4 heb ik gedefineerd afhankelijk van de temperatuur:

Code: Selecteer alles

// Grenswaarden temperatuur naar kleur
if SensorTemp1 >= 70 then Color1:= clRed;
if SensorTemp2 >= 70 then Color2:= clRed;
if SensorTemp3 >= 70 then Color3:= clRed;
if SensorTemp4 >= 70 then Color4:= clRed;

if SensorTemp1 < 70  then Color1:= clPurple;
if SensorTemp2 < 70  then Color2:= clPurple;
if SensorTemp3 < 70  then Color3:= clPurple;
if SensorTemp4 < 70  then Color4:= clPurple;

if SensorTemp1 < 50  then Color1:= clNavy;
if SensorTemp2 < 50  then Color2:= clNavy;
if SensorTemp3 < 50  then Color3:= clNavy;
if SensorTemp4 < 50  then Color4:= clNavy;

if SensorTemp1 < 30  then Color1:= clBlue;
if SensorTemp2 < 30  then Color2:= clBlue;
if SensorTemp3 < 30  then Color3:= clBlue;
if SensorTemp4 < 30  then Color4:= clBlue;

// Paint
GradVertical(PaintBox1.Canvas, PaintBox1.ClientRect, Color1, Color2);
GradVertical(PaintBox2.Canvas, PaintBox1.ClientRect, Color2, Color3);
GradVertical(PaintBox3.Canvas, PaintBox1.ClientRect, Color3, Color4);

Image1.Repaint; //Bring Image (Buffertank) on top
Je mag ook de gehele source hoor, maar hij is nog erg slecht geoptimaliseerd en erg onleesbaar. (zoals bovenstaande code niet erg netjes is... :roll: )
Of zo (pseudo code, delphi is me te lang geleden)

Code: Selecteer alles

functie temperatuurKleuren(temp) {
    kleurenLijst = array(0 => clBlue, 1=>clNavy, 2=>clPurple, 3=> clRed);
    return kleurenLijst[floor((temp-30)/20)];
}

// Paint
GradVertical(PaintBox1.Canvas, PaintBox1.ClientRect, temperatuurKleuren(SensorTemp1), temperatuurKleuren(SensorTemp2));
GradVertical(PaintBox2.Canvas, PaintBox1.ClientRect, temperatuurKleuren(SensorTemp2), temperatuurKleuren(SensorTemp3));
GradVertical(PaintBox3.Canvas, PaintBox1.ClientRect, temperatuurKleuren(SensorTemp3), temperatuurKleuren(SensorTemp4));

Image1.Repaint; //Bring Image (Buffertank) on top
:fff
Gebruikersavatar
sathopper
Berichten: 214
Lid geworden op: 14 sep 2011, 07:48
Locatie: Friesland
Contacteer:

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door sathopper »

Ik heb inmiddels ook de combinatie draaien (Hout cv, Boiler en CV ketel).

Ik heb zelf de besturing gebouwd en geprogrameerd.
Zie filmpje van de bouw:
http://www.youtube.com/watch?v=DPGHqhgndME

Ik regel de retour temperatuur doormiddel van een PID regeling en een omgebouwde 3 weg klep.

Mijn vraag is nu om het systeem te optimaliseren of ik wanneer de ketel is uitgebrand
de retour watertemperatuur mag laten zakken onder de 60 graden omdat ik de pomp wil laten nadraaien
om de laatste (rest) warmte van de ketel te benutten of loop ik dan ook nog steeds het risico van condensvorming?

t.z.t zal ik wat foto's posten maar wegens tijdgebrek heb ik nog geen foto's gemaakt.

:D
--- 100L Solesta zonneboiler en 120L boiler verwarmt door Hout CV ---
--- Arduino controlled PER EKO Hout CV + 1000L buffer ---
--- Evergreen Solar Zonnepanelen (10x215Wp) AEG Protect PV2000 inverter ---
--- Een niet ecologisch maar wel leuk project ---
William
Berichten: 126
Lid geworden op: 29 jun 2010, 15:36
Locatie: Zeeland

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door William »

Ik wil nu een flowmeter installeren op de aanvoer van hout-CV naar CV-systeem. Heb keuze uit 2 bereiken, namelelijk:

1-12 l/min of 2-40 l/min.

Wie kan inschatten wat in mijn geval bruikbaar is?

Ben nu overigens al dagen aan het lezen over de rocket 177. Super interessant!
hanskraayeveld
Berichten: 709
Lid geworden op: 04 okt 2015, 14:49

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door hanskraayeveld »

1-12
William
Berichten: 126
Lid geworden op: 29 jun 2010, 15:36
Locatie: Zeeland

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door William »

Bedankt Hans.
Bestel ik er een via Amazon. Scheelt weer 30 euro.
Ruuben
Berichten: 1796
Lid geworden op: 14 okt 2012, 18:42

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door Ruuben »

Doe gelijk een electrische pulsgever in serie. Kost paar euro uit China. Kun je later ook besluiten electrische liters flow weer te geven


http://www.ultisolar.com/catalog.asp?cate=10

https://www.aliexpress.com/item/New-Arr ... autifyAB=0

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

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door hanskraayeveld »

Ik zou dan een "wärmezähler" kopen.

Op eBay.de een paar tientjes gebruikt.
Werken volgens hetzelfde principe. Je ziet de aanvoer temp, afvoertemp, flow in liters, en vermogen in kW, opbrengst in kWh of mWh.

Veel completer.
Ruuben
Berichten: 1796
Lid geworden op: 14 okt 2012, 18:42

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door Ruuben »

hanskraayeveld schreef: 23 jul 2018, 22:19 Ik zou dan een "wärmezähler" kopen.

Op eBay.de een paar tientjes gebruikt.
Werken volgens hetzelfde principe. Je ziet de aanvoer temp, afvoertemp, flow in liters, en vermogen in kW, opbrengst in kWh of mWh.

Veel completer.
Dat vind ook ook supertip voor mezelf

https://www.ebay.de/itm/Warmezahler-Kun ... 02W4Ybe_jg
pelletpower
Berichten: 3293
Lid geworden op: 12 nov 2011, 13:21

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door pelletpower »

Is het deze ook geworden Ruuben? Nog andere tips wel of niet doen? Ik wil ook een beetje inzicht krijgen in het warmteverbruik/productie. Misschien samen met wat Arduino achtige temp sensoren om leidingverliezen in beeld te krijgen.
Ruuben
Berichten: 1796
Lid geworden op: 14 okt 2012, 18:42

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door Ruuben »

Ik heb er zelf een geknutseld. Met grafieken. Heb eerder ergens gepost hier.
Ramon
Berichten: 1033
Lid geworden op: 29 nov 2018, 09:50

Re: Hout cv in combinatie met boiler en cv ketel

Bericht door Ramon »

Als je een wemos d1 mini koopt, arduino IDE installeert, board ESP8266 installeert, dan kun je mijn programma ook gebruiken.

Benodigheden:

Wemos d1 mini pro
Watermeter met puls per liter
5 temperatuursensoren DS18B20

Code: Selecteer alles

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <OneWire.h> 
#include <DallasTemperature.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
//ESP AP Mode configuration
const char *ssid = "........"; //plaats hier je wifi netwerk naam
const char *password = "......."; // plaats hier je wifi netwerk password

#define NTP_OFFSET   60 * 60      // In seconds
#define NTP_INTERVAL 60 * 1000    // In miliseconds
#define NTP_ADDRESS  "europe.pool.ntp.org"
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);

String graphic = "";

int interruptPin = D3; // pin van de watermeter
byte klaar, burn = 0;

int b, x = 0;
int a = 700;
int uur0, uur3, uur6, uur9, uur12, uur15, uur18, uur21 = 0;
int kwarray[700];
int temp1array[700];
int temp2array[700];
int temp3array[700];
int temp4array[700];
int temp5array[700];
unsigned long resettime, connectiontime, pulsintime1, pulsintime2, pulsintime3, pulsintime4, pulsintime5, pulsintimehit, looptimepulses = 0;
unsigned long plot = 0;
unsigned long kw = 0;
unsigned long whloop, whtotal, whburn, allesopnul = 0;
float rendement, whstart, whroomoutput, whroomoutputtotal, kgwood, lm, temp1, temp2, temp3, temp4, temp5, tempdif = 0;
float temp1min = 100;
int debounce = 10;

#define ONE_WIRE_BUS D4  //pin van de 5 data ds18b20 tempsensoren (de gele kabel)

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
ESP8266WebServer server(80);

IPAddress ip(192, 168, 178, 40);
IPAddress gateway(192, 168, 178, 1);
IPAddress subnet(255, 255, 255, 0);

void handleRoot() {
  connectiontime = millis();
  Serial.println("Client connected. ");

  timeClient.update();
  int tijd = ((timeClient.getHours() * 60) + timeClient.getMinutes()) / 2;
  Serial.println(tijd);
  uur0 = 700 - (tijd - 0);
  if (uur0 > 720){uur0 -= 720;}
  uur3 = 700 - (tijd - 90);
  if (uur3 > 720){uur3 -= 720;}
  uur6 = 700 - (tijd - 180);
  if (uur6 > 720){uur6 -= 720;}
  uur9 = 700 - (tijd - 270);
  if (uur9 > 720){uur9 -= 720;}
  uur12 = 700 - (tijd - 360);
  if (uur12 > 720){uur12 -= 720;}
  uur15 = 700 - (tijd - 450);
  if (uur15 > 720){uur15 -= 720;}
  uur18 = 700 - (tijd - 540);
  if (uur18 > 720){uur18 -= 720;}
  uur21 = 700 - (tijd - 630);
  if (uur21 > 720){uur21 -= 720;}
  
  resettime = (21600000 - (millis() - pulsintime1));
  if (resettime > 21600000){resettime = 0;}
  int seconds = (int) (resettime / 1000) % 60 ;
  int minutes = (int) ((resettime / (1000*60)) % 60);
  int hours   = (int) ((resettime / (1000*60*60)) % 24);
  
  graphic = "";
  graphic += "HTTP/1.1 200 OK\r\n";
  graphic += "Content-Type: text/html\r\n";
  graphic += "\r\n";
  
  graphic += "<!DOCTYPE html><html><meta name='viewport' content='width=720px' meta charset='UTF-8'><body>";
  graphic += "<canvas id='myCanvas' width='700' height='750' style='border:1px solid black;'>Your browser does not support the HTML5 canvas tag.</canvas><script>var c = document.getElementById('myCanvas');var ctx = c.getContext('2d');";
  graphic += "ctx.fillStyle='black';ctx.fillRect(0, 0, 700, 531);ctx.fillStyle='lightgrey';ctx.fillRect(0, 531, 700, 219);";
  graphic += "ctx.fillStyle = 'grey'; ctx.fillRect(5, 5, 300, 100); ctx.fillRect(5, 110, 300, 100); ctx.fillRect(5, 215, 300, 100); ctx.fillRect(5, 320, 300, 100); ctx.fillRect(5, 425, 300, 100);";
  graphic += "ctx.fillRect(310, 5, 190, 100); ctx.fillStyle = 'red'; ctx.fillRect(310, 110, 190, 100); ctx.fillStyle = 'blue'; ctx.fillRect(310, 215, 190, 100); ctx.fillStyle = 'grey'; ctx.fillRect(310, 320, 190, 100); ctx.fillRect(310, 425, 190, 100);";
  graphic += "ctx.fillStyle = 'yellow'; ctx.fillRect(505, 5, 190, 100); ctx.fillStyle = 'orange'; ctx.fillRect(505, 110, 190, 100); ctx.fillStyle = 'brown'; ctx.fillRect(505, 215, 190, 100);";
  graphic += "ctx.fillStyle = 'grey'; ctx.fillRect(505, 320, 190, 100); ctx.fillRect(505, 425, 190, 100);";

  graphic += "ctx.fillStyle = 'black'; ctx.font = '30px Arial'; ctx.textAlign = 'center';";
  graphic += "ctx.fillText('Attack SLX 20',150,65);";
  graphic += String() + "ctx.fillText('" + String((float)whtotal/1000, 3) + " kWh',150,170);";
  graphic += String() + "ctx.fillText('€ " + String((float)whtotal/1000/8.8*0.65, 2) + "',150,275);";
  graphic += String() + "ctx.fillText('" + String((float)whburn/1000, 3) + " kWh',150,380);";
  graphic += String() + "ctx.fillText('€ " + String((float)whburn/1000/8.8*0.65, 2) + "',150,485);";
  graphic += String() + "ctx.fillText('" + String((float)kw/100, 1) + " kW',400,65);";
  graphic += String() + "ctx.fillText('" + String(temp1, 1) + " ºC',400,170);";
  graphic += String() + "ctx.fillText('" + String(temp2, 1) + " ºC',400,275);";
  graphic += String() + "ctx.fillText('" + String(kgwood, 1) + " kg',400,380);";
  graphic += String() + "ctx.fillText('" + String(rendement, 1) + "%',400,485);";
  graphic += String() + "ctx.fillText('" + String(temp3, 1) + " ºC',595,65);";
  graphic += String() + "ctx.fillText('" + String(temp4, 1) + " ºC',595,170);";
  graphic += String() + "ctx.fillText('" + String(temp5, 1) + " ºC',595,275);";
  graphic += String() + "ctx.fillText('0.0 ºC',595,380);";
  graphic += String() + "ctx.fillText('" + String(lm, 1) + " l/m',595,485);";
  server.sendContent(graphic);

  graphic = "";
  graphic += "ctx.fillStyle='grey';";
  for (int i = 0; i < 700; i++){
  b = i + a;
  if (b > 699){b -= 700;}
  graphic += "ctx.fillRect(" + String(b) + ", 750, 1, -" + String(kwarray[i]) + ");";
  }
  server.sendContent(graphic);
  
  graphic = "";
  graphic += "ctx.fillStyle='red';";
  for (int i = 0; i < 700; i++){
  b = i + a;
  if (b > 699){b -= 700;}
  graphic += "ctx.fillRect(" + String(b) + "," + String(750 - temp1array[i]) + ",1,2);";
  }
  server.sendContent(graphic);

  graphic = "";
  graphic += "ctx.fillStyle='blue';";
  for (int i = 0; i < 700; i++){
  b = i + a;
  if (b > 699){b -= 700;}
  graphic += "ctx.fillRect(" + String(b) + "," + String(750 - temp2array[i]) + ",1,2);";
  }
  server.sendContent(graphic);

  graphic = "";
  graphic += "ctx.fillStyle='yellow';";
  for (int i = 0; i < 700; i++){
  b = i + a;
  if (b > 699){b -= 700;}
  graphic += "ctx.fillRect(" + String(b) + "," + String(750 - temp3array[i]) + ",1,2);";
  }
  server.sendContent(graphic);

  graphic = "";
  graphic += "ctx.fillStyle='orange';";
  for (int i = 0; i < 700; i++){
  b = i + a;
  if (b > 699){b -= 700;}
  graphic += "ctx.fillRect(" + String(b) + "," + String(750 - temp4array[i]) + ",1,2);";
  }
  server.sendContent(graphic);
  
  graphic = "";
  graphic += "ctx.fillStyle='brown';";
  for (int i = 0; i < 700; i++){
  b = i + a;
  if (b > 699){b -= 700;}
  graphic += "ctx.fillRect(" + String(b) + "," + String(750 - temp5array[i]) + ",1,2);";
  }
  server.sendContent(graphic);

  graphic = "";
  graphic += "ctx.fillStyle='black';";
  graphic += "ctx.fillRect(0, 550, 700, 1);ctx.fillRect(0, 600, 700, 1);ctx.fillRect(0, 650, 700, 1);ctx.fillRect(0, 700, 700, 1);";
  graphic += "ctx.font = '10px Arial';ctx.fillStyle = 'black';ctx.fillText('30 kW',17,598);ctx.fillText('20 kW',17,648);ctx.fillText('10 kW',17,698);ctx.fillText('80 C',685,598);ctx.fillText('60 C',685,648);ctx.fillText('40 C',685,698);";
  graphic += "ctx.fillRect(" + String(uur0) + ", 550, 1, 200); ctx.fillRect(" + String(uur3) + ", 550, 1, 200); ctx.fillRect(" + String(uur6) + ", 550, 1, 200); ctx.fillRect(" + String(uur9) + ", 550, 1, 200); ctx.fillRect(" + String(uur12) + ", 550, 1, 200); ctx.fillRect(" + String(uur15) + ", 550, 1, 200); ctx.fillRect(" + String(uur18) + ", 550, 1, 200); ctx.fillRect(" + String(uur21) + ", 550, 1, 200);";
  graphic += "ctx.textAlign = 'center'; ctx.fillText('0'," + String(uur0) + ",545); ctx.fillText('3'," + String(uur3) + ",545); ctx.fillText('6'," + String(uur6) + ",545); ctx.fillText('9'," + String(uur9) + ",545); ctx.fillText('12'," + String(uur12) + ",545); ctx.fillText('15'," + String(uur15) + ",545); ctx.fillText('18'," + String(uur18) + ",545); ctx.fillText('21'," + String(uur21) + ",545);";
  graphic += "</script>";
  graphic += "<p><font size='1'>Time to reset: " + String(hours) + ":" + String(minutes) + ":" + String(seconds) +  "   Loading page time: " + String(millis() - connectiontime) + " ms</p>";
  graphic += "</body></html>";
  graphic += "\r\n\r\n";
  server.sendContent(graphic);
  graphic = "";
  server.sendContent(graphic);
  server.client().stop();
  Serial.print("Client disconnected. ");// Stop is needed because we sent no content length
  Serial.println(millis() - connectiontime);
}
void setup() {
  Serial.begin(115200);
  millis();
  DS18B20.begin();
  DS18B20.setResolution(10);
  
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, CHANGE);

  //Initialize AP Mode
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  WiFi.config(ip, gateway, subnet);
  Serial.println("");
  Serial.println("WiFi connected");

  // Print the IP address
  Serial.print("Use this URL : ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
  
  plotmenu();
  //Initialize Webserver
  server.on("/",handleRoot);
  server.begin(); 
}

void handleInterrupt() {
  if (digitalRead (interruptPin) == HIGH && klaar == 0 && millis() - pulsintimehit > 10){
  pulsintimehit = millis();
  pulsintime2 = pulsintime1;
  pulsintime1 = millis();
  looptimepulses = (pulsintime1 - pulsintime2);
  tempdif = (temp1*10 - temp2*10);
  if (tempdif < 0){tempdif = 0;}
  whloop = tempdif * 1163;              
  kw = (((float)whloop * 36)/looptimepulses);
  whloop = whloop / 10000;                 
  whtotal += whloop;
  whburn += whloop;
  lm = (float)60000 / looptimepulses;   
  allesopnul = 1; 
  burn = 1;
  klaar = 1;
  Serial.println( String() + "Pulstime: " + pulsintime1 + " Pulslaptime: " + looptimepulses + " TempHot: " + temp1 + " TempCold: " + temp2 + " Lit/min: " + lm + " Watthour: " + whburn + " Watt: " + kw*10);
  }
  
  if (digitalRead (interruptPin) == LOW && klaar == 1 && millis() - pulsintimehit > 10){klaar = 0; pulsintimehit = millis(); Serial.print("Pulse LOW: "); Serial.println(millis());}
}

void loop() {
  server.handleClient();
  
   if (kw > 0 && millis() - pulsintime1 > (looptimepulses * 1.1)){looptimepulses = looptimepulses * 1.1; kw = kw / 1.1;lm = lm / 1.1; Serial.println("10% pulsuitstel");} 
   if (millis() - pulsintime1 > 600000 && allesopnul == 1){Serial. println("kW en l/m op nul"); kw = 0; lm = 0; burn = 0; allesopnul = 2;}
   if (millis() - pulsintime1 > 21600000 && allesopnul == 2){Serial.println("Alle tellers gaan op nul..."); whburn = 0; whroomoutputtotal = 0; kgwood = 0; rendement = 0; temp1min = 100; allesopnul = 0;}
   if (millis() > plot){plotmenu();}
  }

void plotmenu(){
  plot += 120000;
  Serial.print(String() + "Plotting: " + millis());
  temperatuurmenu();
  kwarray[x] = ((float)kw/100) * 5;
  temp1array[x] = (temp1 - 20) * 2.5;
  temp2array[x] = (temp2 - 20) * 2.5;
  temp3array[x] = (temp3 - 20) * 2.5;
  temp4array[x] = (temp4 - 20) * 2.5;
  temp5array[x] = (temp5 - 20) * 2.5;
  x += 1;
  if (x > 700){x = 0;}
  a -= 1;
  if (a < 0){a = 700;}

  if (burn == 1){
    whstart = (temp1 - temp1min) * ((120 * 0.001163) + (450 * 0.0001244)) * 1000;
    whroomoutput = (temp1 - 15) * 40 / 30;
    whroomoutputtotal += whroomoutput;
    kgwood = ((whburn + whroomoutputtotal) / 1000 / (4.22 * 0.918)) + (whstart / 1000 / (4.22 * 0.5));
    rendement = whburn / (whburn + whstart + whroomoutputtotal) * 100;
    Serial.println(String() + "Burning...  whstart: " + whstart + " whroomoutputtotal: " + whroomoutputtotal + " whburn: " + whburn + " kgwood: " + kgwood + " rendement: " + rendement);
    }
  }

void temperatuurmenu(){
  DS18B20.requestTemperatures();
  temp1 = DS18B20.getTempCByIndex(0);
  temp2 = DS18B20.getTempCByIndex(1);
  temp3 = DS18B20.getTempCByIndex(2);
  temp4 = DS18B20.getTempCByIndex(3);
  temp5 = DS18B20.getTempCByIndex(4);

  //temp1 = 100 - (float(0.25)* x);
  //temp2 = 95 - (float(0.25)* x);
  //temp3 = 70 - (float(0.25)* x);
  //temp4 = 55 - (float(0.25)* x);
  //temp5 = 45 - (float(0.25)* x);
  
  if (temp1 < -100){temp1 = 0.0;}
  if (temp2 < -100){temp2 = 0.0;}
  if (temp3 < -100){temp3 = 0.0;}
  if (temp4 < -100){temp4 = 0.0;}
  if (temp5 < -100){temp5 = 0.0;}

  if (temp1 < temp1min){temp1min = temp1;}
  if (temp1 > temp1min + 5 && allesopnul == 0){burn = 1;}

  Serial.println(String() + "  Temp1: " + temp1 + " Temp2: " + temp2 + " Temp3: " + temp3 + " Temp4: " + temp4 + " Temp5: " + temp5 + " Temp1min: " + temp1min);
  }
dan kun je via internet, overal waar je maar ben, alles in de gaten houden.

zie foto:
20191230_125306.png
temperatuursensoren: alle rode draden op 5v, zwarte draden op ground, en gele draden op poort D4
watermeter: een draad op ground, 1 draad op D3
Plaats reactie