Go Down

Topic: Uitgangssignaal behouden wanneer de ingangssignalen tussen twee waarden zit. (Read 187 times) previous topic - next topic

LennieSampi

Hallo,

Voor mijn eindwerk moet ik een manueel contact gaan automatiseren door middel van temperaturen. Dit contact zit op een warmtepomp waar er nu manueel moet gekozen worden of de warmtepomp gaat koelen of verwarmen.

Ik zou nu graag hebben dat dit automatisch gaat adhv temperatuursensor die binnen en buiten is bevestigd en die verbonden is met de arduino.

Nu zit ik vast bij het programmeren doordat als de temperatuur dus hoger is dan 23°C de warmtepomp in koel modus gaat maar als de temperatuur tussen 20-23°C zit gaat hij opnieuw naar verwarmen wat niet de bedoeling is. Ik gebruik dit omdat anders de warmtepomp constant zou switchen tussen verwarmen/koelen een soort hysteresis.

Nu zou ik moeten verkrijgen dat mijn contact blijft staan zoals de vorige uitgang bij het moment dat de temperatuur tussen de 20-23°C is.

Dus bv. Als de warmtepomp aan het verwarmen is dat deze op verwarmen blijft als het een temperatuur van 22 °C is.

Ook als het binnen bv 24 graden was en de warmtepomp gaat naar koelen maar de temperatuur daalt dus binnen naar 21°C dat deze dan ook op koelen blijft staan en niet naar verwarmen omschakelt.

In de bijlage zit mijn programma tot hoever ik nu zit ermee.

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

int LedKoel = 9;             // Pin Red LED is connected to
int LedVerw = 10;
int temp_sensor_Koel = 5;       // Pin DS18B20 Sensor is connected to
int temp_sensor_Verw = 6;

float temperatureBinnen = 0;      //Variable to store the temperature in
float temperatureBuiten = 0;
int lowerLimitBinnen = 20;      //define the lower threshold for the temperature // nog veranderen naar 20
int upperLimitBinnen = 23;      //define the upper threshold for the temperature
int lowerLimitBuiten = 15;
int upperLimitBuiten = 26;

OneWire oneWirePin1(temp_sensor_Koel);

OneWire oneWirePin2(temp_sensor_Verw);

DallasTemperature sensorsBinnen(&oneWirePin1);
DallasTemperature sensorsBuiten(&oneWirePin2);

void setup(void){
  Serial.begin(9600);
 
  //Setup the LEDS to act as outputs
  pinMode(LedKoel,OUTPUT);
  pinMode(LedVerw,OUTPUT);

  sensorsBinnen.begin();
  sensorsBuiten.begin();

  digitalWrite(LedKoel, LOW);
  digitalWrite(LedVerw, LOW);
}

void loop(){
 
  Serial.print("Requesting Temperatures from sensor Binnen: ");
  sensorsBinnen.requestTemperatures();
  Serial.println("DONE");
 
  temperatureBinnen = sensorsBinnen.getTempCByIndex(0);

  Serial.print("Requesting Temperatures from sensor Buiten: ");
  sensorsBuiten.requestTemperatures();
  Serial.println("DONE");
 
  temperatureBuiten = sensorsBuiten.getTempCByIndex(0);
   
 
  Serial.print("Temperature Binnen is ");
  Serial.print(temperatureBinnen);

  Serial.print("Temperature Buiten is ");
  Serial.print(temperatureBuiten);
 
  //Warmtepomp op stand verwarmen of koelen voor binnen temperatuur en kijken naar buiten temperatuur
 
  if(temperatureBinnen <= lowerLimitBinnen && temperatureBuiten <= lowerLimitBuiten){
    Serial.println(", LedVerw is Activated");
    digitalWrite(LedKoel, LOW);
    digitalWrite(LedVerw, HIGH);
  }
  else if(temperatureBinnen > lowerLimitBinnen && temperatureBinnen < upperLimitBinnen && temperatureBuiten > lowerLimitBuiten && temperatureBuiten <= upperLimitBuiten) {
    Serial.println(", LedVerw is Activated");
    digitalWrite(LedKoel, HIGH);
    digitalWrite(LedVerw, LOW);
   
  }
  else if(temperatureBinnen >= upperLimitBinnen || temperatureBuiten >= upperLimitBuiten){
    Serial.println(", LedKoel is Activated");
    digitalWrite(LedKoel, HIGH);
    digitalWrite(LedVerw, LOW);
  }
 
 
  delay(1000);
}

Koepel

Wij noemen dat inderdaad hysteresis: nl.wikipedia.org/wiki/Hysterese.
Zodra iemand zegt dat hij/zij met een temperatuursensor een verwarming of koeling wil inschakelen, dan zeggen wij: "voeg hysteresis toe".

Weet je zeker dat je de DallasTemperature goed gebruikt ?
Als je met "...ByIndex" werkt, dan kun je index 0 opvragen en daarna index 1.

Om in je sketch de juiste keuzes te maken heb je de temperatuur nodig, maar ook de status van de verwarming/koeling. Je zou een globale 'bool' variabelen toe kunnen voegen, die bijhoudt of de verwarming of de koeling bezig is.
Je sketch doet dan verschillende dingen, afhankelijk van die 'bool' variabele.
Zijn er maar twee toestanden (verwarmen/koelen) of kan de pomp ook uitgezet worden ?

Als je al die gegevens hebt, en je hebt een goede beschrijving van wat je wilt, dan rollen de if-statements er zo uit :smiley-kitty:

Ik zou het mooier vinden als je alle temperaturen als 'float' variable doet. Dat maakt de sketch duidelijker.

De namen van je variabelen zijn soms lang en is een mengeling van Engels en Nederlands.
Code: [Select]
int ErIsNiemandDieZulkeLangeVariabelenamenGebruiktAlsIk = 3;Maar soms is korter mooier.

Dit is hoever ik kom met een beschrijving:
- Vervarmen bij binnentemperatuur van onder de 20 graden, koelen bij binnentemperatuur vanaf 23 graden of hoger, daartussen is het hysterese gebied.
- Geen idee wat de buitentemperatuur er mee te maken heeft.

shooter

bij jouw IF statements moeten nog wat haakjes bij vooral de && en zo.
en haal die ifs eerst eens los, en vraag je af welke toestanden je eigenlijk hebt.
je hebt dus koelen tot 23 bijv && buiten niet te heet, && buiten niet te koud
je hebt dus verwarmen tot 22 met zelfde voorwaarden.
en als beide niet is staat warmtepomp stil.
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Go Up