Arduino Thermometer

buckfast_beekeeper

Golden Member

Als je met meer dan 1 sensor gaat meten, dan is een DS18b20 een veel betere keuze. Daar sluit je er zoveel van aan als je zelf wil. Even de adressen inlezen en in programmeren en klaar. Ze kosten ook nog eens amper iets en zijn verkrijgbaar met schroefdraad, waterdicht, ......

tutorial

edit:

c code:

 if (Ltemp < LTemp + 2)
  if (Htemp < HTemp + 2){
     lcd.begin (16, 2);
    lcd.print("Temperature:");
    lcd.setCursor(0, 1);
    lcd.print("Celsia:");
    lcd.setCursor(7, 1);
    lcd.print(Htemp);
    lcd.setCursor(7, 2);
    lcd.print(Ltemp);
  } 

Gaat niet werken.

c code:

 if (Ltemp < (LTemp + 2)|| Htemp < (HTemp + 2)){
     lcd.begin (16, 2);
    lcd.print("Temperature:");
    lcd.setCursor(0, 1);
    lcd.print("Celsia:");
    lcd.setCursor(7, 1);
    lcd.print(Htemp);
    lcd.setCursor(7, 2);
    lcd.print(Ltemp);
  } 

Waarom die + 2 en niet != dan wijzigt het display telkens de temperatuur wijzigt. Je hebt al een delay(5000) wat is er mis met telkens te schrijven?

[Bericht gewijzigd door buckfast_beekeeper op woensdag 16 december 2020 21:22:26 (50%)

Van Lambiek wordt goede geuze gemaakt.
Evarist

Golden Member

Mag

if (Ltemp < (LTemp + 2)|| Htemp < (HTemp + 2))

er niet af?

Nihil est verum, quod non probatur primo.
buckfast_beekeeper

Golden Member

Ik weet gewoon niet wat de bedoeling hiervan was bij de oorspronkelijke maker. Waarom ga je een temperatuur vergelijken met een vast ingestelde temperatuur om een display te refreshen? Dat is me totaal onduidelijk. Bij een thermostaat kan ik me er nog iets bij voorstellen. < x°C verwarming aan. Bij y °C airco aan. En dan nog een if om beiden uit te schakelen als de temperatuur tussen de grenzen valt.

Van Lambiek wordt goede geuze gemaakt.
marcob

Golden Member

Op 16 december 2020 22:39:08 schreef Evarist:
Mag

if (Ltemp < (LTemp + 2)|| Htemp < (HTemp + 2))

er niet af?

Wat verschrikkelijk verwarrend, Ltemp en LTemp gebruiken. Ik kwam er later achter dat er een kleine en grote T wordt gebruikt. Gebruik duidelijke variable namen.

Maar nu wordt enkel de temperatuur op het display gezet wanneer Ltemp kleiner is als 20 graden. Beetje onzinnig lijkt me.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
Evarist

Golden Member

Marcob.
Dit had ik zelf nog niet gezien. Ik zal het aanpassen.

Nihil est verum, quod non probatur primo.
buckfast_beekeeper

Golden Member

@marcob: 100% gelijk. Had dit ook pas heel laat door.

Van Lambiek wordt goede geuze gemaakt.
bprosman

Golden Member

Dat is het nadeel van bestaande software her-gebruiken.
Vaak ben je langer bezig uit te zoeken over het "Waarom" dan dat je zelf even gaat zitten, stroomdiagrammetje maken en "invullen".

De jongere generatie loopt veel te vaak zijn PIC achterna.
marcob

Golden Member

@Evarist: Kun je ons kort vertellen wat je uiteindelijk wil maken?
Dan kunnen we je de juiste kant opsturen. Ik begrijp dat iedereen niet even bedreven is in het programmeren, maar ik ben bereid om je te helpen en denk ook anderen met me.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
Evarist

Golden Member

Een thermostaat, die de CV schakelt.
De aanvoer mag maar 25° zijn en de retour 20°.

24u later verhogen deze temperaturen met 2° tot op het laatste 40°. Dan 1 week stabiel. Dan weer per 24u dalen naar 20°.

Het is een verplichte procedure voor het opstarten van vloerverwarming in een dekvloer.

Nihil est verum, quod non probatur primo.
marcob

Golden Member

Dit is geen 'kattenpis' :-), maar niet onmogelijk. Alleen ga je er met knippen en plakken vanaf het internet niet komen.

De grootste uitdaging zit hem in de CV sturing, met simpel aan/uit ga het niet lukken. Je moet rekening houden dat een CV een aanloop en uitloop heeft. Wat bedoel je met de aanvoer mag maar 25° graden zijn? Een CV ketel verwarmt standaard het water op 60° (kan je lager instellen, maar geen 25°).

Ik zou dus beginnen met een proefopstelling om de aanvoer rond 25° te houden. Als dit gelukt is kun je verder uitbreiden.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
buckfast_beekeeper

Golden Member

Een linke zaak. Bij wie ligt de verantwoordelijkheid als het fout gaat? Je moet al met zekerheid weten dat de arduino minstens 14 dagen stabiel blijft. Niet onmogelijk maar ook niet gegarandeerd. Een ESP8266 heb ik deze week moeten herstarten na 3 weken. Daarvoor had hij een maand probleemloos gedraaid.

Je gaat ook nog een RTC moeten toevoegen die de datum voor je bijhoudt. Wat zijn de regels als de cyclus wordt onderbroken door bijvoorbeeld een stroompanne? Is het dan terug starten vanaf 0 of mag je terug inpikken op de temperatuur dat het op dat ogenblik zou moeten zijn.

Staat er een mengkraan op het systeem zodat warm water van de ketel gemengd wordt met het koudere retourwater? Zo ja, hoe dient die aangestuurd te worden?

Het verbaasd me dat zo een installatie geen inrush mode kent.

Van Lambiek wordt goede geuze gemaakt.
Evarist

Golden Member

Zelf een programma schrijven zie ik niet zitten, maar een bestaand programma updaten wel.
Dank zij jullie hulp. :-)

Hoe maak/vind ik een RTC? (na even denken wist ik dat het Real Time Clock zal betekenen. Google bracht me bij Rotterdamse Taxi Centrale of Regionaal Technisch Centrum. :-) )

Ik ga de Arduino laten werken op een accu met druppellader.

Er staat geen mengkraan. De ketel kan op 30° ingesteld worden en met de thermostaataansluitingen kan hij uitgeschakeld worden bij de door de Arduino bepaalde temperatuur.

[Bericht gewijzigd door Evarist op donderdag 17 december 2020 19:09:32 (20%)

Nihil est verum, quod non probatur primo.
buckfast_beekeeper

Golden Member

Hoe werkt de thermostaat? Is dat een (aan)/uit die afvalt zodra er geen spanning meer op staat of is dat een puls type zoals theben heel vaak toepast. Een puls om in te schakelen, een puls om uit te schakelen. Zorg er in het laatste geval voor dat deze niet inschakelt. Anders valt jou regeling weg.

Maak gebruik van digitale sensoren à la DS18B20. Deze kan je nog gemakkelijk vastmaken met wat straps. Je hebt dan slechts 1 ingang nodig van je arduino.

Je hebt ook een startmoment bij te houden. Liefst in eeprom. Dit startmoment gebruik je nadien om de momenten van verhoging en verlaging te bepalen. Verder ga je de gewenste temperaturen moeten bijhouden.

Gaat de maximale temperatuur van de retour mee omhoog of zit die vast op 20°C? Ik kan me dan voorstellen dat je nooit aan 40°C gaat geraken. Al zeker niet als de temperaturen zacht blijven en er amper warmte afgifte zal zijn.

Bouw stuk voor stuk op. Eerst je display aan het werk. Daarna je RTC in orde met knoppen om je klok juist te zetten. Dan je sensoren aan het werk krijgen. Daarna een uitgang een led laten schakelen. Een led is dan snel vervangen door een relais of SSR.

Van Lambiek wordt goede geuze gemaakt.
marcob

Golden Member

Als RTC kun je bijvoorbeeld zoiets gebruiken:
https://www.tinytronics.nl/shop/nl/diversen/tijd/robotdyn-rtc-ds3231-m… ,zit ook nog een eeprom op, om gegevens op te slaan.

Zoals al aangegeven, in de Arduino IDE zitten veel voorbeelden. gebruik deze om je eigen programma te maken. Zo doe ik het ook.

Je begint met de temperatuur, eerst via serieel, daarna op het LCD.
Dan voeg je de thermostaat funkte e.d. toe.

Dan ga je een verdiepen in een real-time klok funkte. Ook hier staan voorbeleden in de IDE. Dit voeg je dan samen tot één geheel.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
Evarist

Golden Member

Kan die klok niet met de millis in de Arduino? Het hoeft niet exact 24u te zijn.

De thermostaat is aan/uit functie. Dus met een relay te bedienen.

Nihil est verum, quod non probatur primo.
marcob

Golden Member

Ja hoor kan ook, alleen moet je bijhouden in eeprom welke dag je bent. Je wil namelijk wel iets van een fail safe hebben als de module per ongeluk herstart. Je wil niet als ie op dag 18 is hij weer op dag 1 begint.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
buckfast_beekeeper

Golden Member

Kan maar een datum is iets wat we gewoon zijn te gebruiken. Je moet je millis gaan bijhouden en dat is ook een unsigned long. Bewerkingen met int, float, double en long zijn niet gegarandeerd fail safe. Valt je systeem uit halfweg de rit, zal je terug vaaf 0 starten tenzij je bij elke verhoging/verlaging de nieuwe unsigned long in eeprom weg schrijft.

Op datum lijkt me stukken handiger. Startdatum opslaan. 2°C verhogen bij Startdatum + x, weer verhogen bij startdatum +y, ....

Voor je verhoogt/verlaagt zou ik zeker de temperaturen nog eens checken. Moet deze op datum y 30°C zijn en deze is op datum y maar 20°C dan weet je dat er wat is fout gelopen en dat je terug moet starten vanaf 0.

Welke hysteresis ga je inbouwen? Je moet er voor zorgen dat je verwarming niet gaat pendelen. Dat kan al snel gebeuren als het retourwater dicht tegen de uitgaande temperatuur komt te liggen.

Van Lambiek wordt goede geuze gemaakt.
Evarist

Golden Member

Thanks.

Ik heb de code vereenvoudigd en het relay toegevoegd. (Onderaan)
Klopt dit? (Compilator geeft geen fout)

code:




//
const int sensorPinL = A0;
const int sensorPinH = A1;
const float LTemp = 20.0;
const float HTemp = 25.0;
unsigned long Time = 0;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  Serial.begin(9600);
  lcd.begin (16, 2);
  lcd.print("--Made By: KMB--");
  lcd.setCursor (0, 1);
  lcd.print(" Measuring Temp.");
  delay(5000);
  pinMode(13, OUTPUT);
}

void loop() {
  int sensorValL = analogRead(sensorPinL);
  int sensorValH = analogRead(sensorPinH);
  Serial.print("sensor ValueL: ");
  Serial.print(sensorValL);
  Serial.print("sensor ValueH: ");
  Serial.print(sensorValH);

  //float voltageL = (sensorValL / 1024.0) * 5.0;
  //float voltageH = (sensorValH / 1024.0) * 5.0;


  Serial.print(", degrees C: ");
  //float LTemp = (voltageL - .5) * 100;
  //float HTemp = (voltageH - .5) * 100;
  float LTemp = (((sensorValL / 1024.0) * 5.0) - 0.5) *100;
  float HTemp = (((sensorValH / 1024.0) * 5.0) - 0.5) *100;
  Serial.println(LTemp);
  Serial.println(HTemp);

{
    lcd.begin (16, 2);
    lcd.print("Temperature:");
    lcd.setCursor(0, 1);
    lcd.print("Celsia:");
    lcd.setCursor(7, 1);
    lcd.print(HTemp);
    lcd.setCursor(7, 2);
    lcd.print(LTemp);
  } 
  
  delay(1000);

// relay aan
   
    if ( HTemp < 25 && LTemp < 20 )
      {digitalWrite(13, HIGH);}

    else 
      {digitalWrite(13, LOW);}  
}

Op 18 december 2020 15:31:12 schreef buckfast_beekeeper:

Welke hysteresis ga je inbouwen?

+1 en -1. Goed?
Heeft de Arduino een EEprom?
Edit// Een Arduino heeft een EEprom ingebouwd. Ik zal daar nog moeten leren mee werken.

Nihil est verum, quod non probatur primo.
Evarist

Golden Member

.

[Bericht gewijzigd door Evarist op vrijdag 18 december 2020 21:13:14 (99%)

Nihil est verum, quod non probatur primo.
marcob

Golden Member

c code:

if ( HTemp < 25 && LTemp < 20 )

Nu blijft de kachel net zolang branden totdat de retour > 20° Dit betekend dat je geen controle hebt over de aanvoer temperatuur.

Je hebt totaal geen hysteresis, als de temperatuur 25° stopt de kachel en bij 24,9° begint ie weer.

Waarom noem je de variabelen gewoon niet bij de naam, dus 'temp_aanvoer' en 'temp_retour', dat maakt je leven zoveel makkelijker.

zoek eens op wat het verschil is tussen Serial.print en Serial.println

Zorg dat je consequent blijft, sensorPinL en sensorPinH declare je boven aan , zoals het hoort. Maar de relais output doe je direct via het nummer, dit doe je ook via declare. Zo hou je alle op één plek.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
buckfast_beekeeper

Golden Member

Bij welke if of functie behoren deze {}

c code:

{
    lcd.begin (16, 2);
    lcd.print("Temperature:");
    lcd.setCursor(0, 1);
    lcd.print("Celsia:");
    lcd.setCursor(7, 1);
    lcd.print(HTemp);
    lcd.setCursor(7, 2);
    lcd.print(LTemp);
  }

Onderstaande code heeft wat meer opmerkingen.

c code:

if ( HTemp < 25 && LTemp < 20 )
      {digitalWrite(13, HIGH);}

    else 
      {digitalWrite(13, LOW);} 

Ik blijf de voorkeur geven dat de openings { achter de if of else komt en de sluit } onder de if of else komt. De scope is zo ook direct duidelijk.

c code:


if ( HTemp < 25 && LTemp < 20 ){
    digitalWrite(13, HIGH);
}
else {
    digitalWrite(13, LOW);
} 

Zoals marcob ook al aangeeft gebruik

c code:

if( temp_uitvoer < 25 && temp_aanvoer < 20) ....

25 en 20 dienen ook nog aangepast naar max_temp_uitvoer en max_temp_aanvoer anders heb je een statische temperatuur.

Let op dat je de if niet onbegrijpbaar maakt. Als je gaat twijfelen splits het dan op.

Op 19 december 2020 10:04:24 schreef marcob:

c code:

if ( HTemp < 25 && LTemp < 20 )

Nu blijft de kachel net zolang branden totdat de retour > 20° Dit betekend dat je geen controle hebt over de aanvoer temperatuur.

Daar ben ik dan weer niet van overtuigd. Beide voorwaarden dienen voldaan. Als de temperatuur >25°C wordt, zal de else ook uitgevoerd worden.

Van Lambiek wordt goede geuze gemaakt.
marcob

Golden Member

@buckfast_beekeeper, je hebt gelijk. Ik zat verkeerd met de vergelijking.
Zowel aanvoer als retour moeten kleiner zijn, als één van beide hoger wordt geldt de voorwaarde niet meer.

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

Op 16 december 2020 22:39:08 schreef Evarist:
if (Ltemp < (LTemp + 2)|| Htemp < (HTemp + 2))

Slecht leesbare code: er zijn hier vier variabelen in het spel en het heeft me een minuut gekost voordat ik DAT zag.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Evarist

Golden Member

Op 19 december 2020 16:08:19 schreef rew:
[...]Slecht leesbare code: er zijn hier vier variabelen in het spel en het heeft me een minuut gekost voordat ik DAT zag.

Die fout is in de laatste versie verbeterd.

En ik kan weer verder. Tot spoedig.

Nihil est verum, quod non probatur primo.
Evarist

Golden Member

Het lukt me niet om het programma werkend te krijgen. Het probleem is inmiddels ook opgelost.

Een andere procedure zegt dat je de temp met 5° per dag moogt verhogen en ik heb iemand die dat doet gevonden.

De vloer is inmiddels opgewarmd. Bij 35° aanvoer is het in huis 25° dankzij de passiefbouw. Verbruik van het gas is onmeetbaar klein!!!

Edit, ik heb nog projecten met Arduino, maar ik moet beter leren programmeren. () {} ; waren er niet in Basic vroeger. En de functie goto en gosub zijn verdwenen.

[Bericht gewijzigd door Evarist op woensdag 6 januari 2021 13:56:27 (20%)

Nihil est verum, quod non probatur primo.