Smart Aquarium mit Temperatur-, PH-Wert- und Wasserstand- Regelung

Das ist die Programmversion für active-HIGH-relais

/*
  Titel: Temperaturregelung Aquarium
  Datum: 29.06.2021
  Autor: ribaribi
  Hardware: Temperatursensor, 2x Relais, LCD Display, Taster, Arduino Mega
*/

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

const byte DS18B20_DATA = 2; //Daten-Pin für TemperaturSensor DS18B20
const byte Heizung_PIN  = 7; 
const byte Kuehlung_PIN = 6; 
const byte Knopf_PIN    = 3; 
const byte temp_start   = 20; 
const byte temp_min     = 15;
const byte temp_max     = 35;

// angenommen wenn man den IO-pin LOW schaltet wird das Relais 
//so geschaltet das der Kontakt geschlossen = HEIZUNG EINgeschaltet ist

const byte EIN = HIGH;
const byte AUS = LOW;

OneWire oneWire(DS18B20_DATA);
DallasTemperature sensors(&oneWire);
int knopf;
int soll_Temp;

void setup() {
  Serial.begin(115200); // im seriellen Monitor als Baudrate auch 115200 einstellen
  Serial.println( F("Setup-Start") );
  lcd.init();
  lcd.backlight();
  sensors.begin();
  pinMode(Heizung_PIN, OUTPUT);
  pinMode(Kuehlung_PIN, OUTPUT);
  digitalWrite(Heizung_PIN, AUS);
  digitalWrite(Kuehlung_PIN, AUS);
  pinMode(Knopf_PIN, INPUT_PULLUP);
}

void loop() {
  if (soll_Temp == 0) {
    soll_Temp = temp_start;
  }
  
  knopf = digitalRead(Knopf_PIN);
  if (knopf == 0) {
    soll_Temp = soll_Temp + 1;
  }
  
  if (soll_Temp > temp_max) {
    soll_Temp = temp_min;
  }
  
  sensors.requestTemperatures();
  float temp (sensors.getTempCByIndex(0));
  lcd.setCursor(0, 0);
  lcd.print("Temperatur Aquarium");
  lcd.setCursor(0, 1);
  //lcd.print("Aktuell:   ");
  lcd.print("active HIGH");
  lcd.print(String(temp, 1));
  lcd.print("\337C ");
  lcd.setCursor(0, 2);
  lcd.print("Soll:      ");
  lcd.print(soll_Temp);
  lcd.print(".0\337C ");

  Serial.print( F("temp=") ); // name der Variable auasgeben
  Serial.print(temp); // Inhalt der Variable ausgeben

  Serial.print( F("  soll_Temp - 2:  ") ); 
  Serial.print(soll_Temp - 2); // Ergebnis der Berechnung soll_Temp - 2 ausgeben
  Serial.println(); // println  print-line in die nächste Zeile springen
  
  Serial.print( F("temp=") ); // name der Variable auasgeben
  Serial.print(temp); // Inhalt der Variable ausgeben

  Serial.print( F("  soll_Temp + 2:  ") ); 
  Serial.print(soll_Temp + 2); // Ergebnis der Berechnung soll_Temp + 2 ausgeben
  Serial.println(); // println  print-line in die nächste Zeile springen

  if (temp <= soll_Temp - 2) {
    Serial.println( F("Bedingung (temp <= soll_Temp - 2) ist TRUE") );
    Serial.println( F("Kühlung aus, Heizung ein") );
    lcd.setCursor(0, 3);
    lcd.print("Heizung    EIN");
    digitalWrite(Heizung_PIN, EIN);
    digitalWrite(Kuehlung_PIN, AUS);
  }

  if (temp >= soll_Temp + 2) {
    Serial.println( F("Bedingung (temp >= soll_Temp + 2) ist TRUE") );
    Serial.println( F("Kühlung ein, Heizung aus") );
    lcd.setCursor(0, 3);
    lcd.print("Kuehlung   EIN");
    digitalWrite(Kuehlung_PIN, EIN);
    digitalWrite(Heizung_PIN, AUS);
  }
  
  if (temp == soll_Temp) {
    Serial.println( F("Bedingung (temp == soll_Temp) ist TRUE") );
    Serial.println( F("Heizung und Kühlung aus") );
    digitalWrite(Heizung_PIN, AUS);
    digitalWrite(Kuehlung_PIN, AUS);
  }
  
  if (!digitalRead(Heizung_PIN) && !digitalRead(Kuehlung_PIN))
  {
    Serial.println( F("Bedingung (!digitalRead(Heizung_PIN) && !digitalRead(Kuehlung_PIN) ist TRUE") );
    lcd.setCursor(0, 3);
    lcd.print("Temperatur OK ");
  }
  
  delay(500);
}

Ja das Relais hat einen Wechselkontakt damit kann man alle Varianten bekommen.
Trotzdem macht es Sinn einmal zu klären wie es später geschaltet werden soll oder ob der TO das Aufleuchten der LED als feedback für Heizung/Kühlung ist eingeschaltet benutzt oder nicht.

Auf dem Foto kann man sehen, dass keine Heizung/Kühlung angeschlossen ist.
Auch das ist eine wichtige Information.
vgs

@ribi:
poste den seriellen output NICHT als Bild sondern als TEXT

Dazu einfach in das Fenster klicken und Strg-A, Strg-C drücken.
Oder mit der Maus hineinklicken und sich den passenden Bereich markieren.
Wenn die Ausgabe immer weiterläuft USB abstöpseln.
vgs

Oder mal ganz einfach unten links den Haken bei Autoscroll rausmachen...

Du schaffst das schon.

temp ist als float definiert aber die variable soll_Temp als integer

aus dem Screenshot Ausschnitt kann man noch nicht sehen was das Programm macht wenn die Ist-temperatur drei Grad über der Soll-Temperatur ist

Genau, ich werde diese alle über die Schliesser Kontakte nehmen. Somit LED an = Heizung bzw. Kühlung an.

Werde ich Morgen Abend versuchen. Danke.

Ja sorry, ist noch nichts angeschlossen. Das kommt dann, wenn das Programm steht.

Ich werde dies Morgen Abend herauskopieren. Danke

Jaaaawooohhhl.... :smiley: Ich hab es hingekriegt. so sieht es aus:

  if (temp <= soll_Temp - 2) {
    lcd.setCursor(0, 3);
    lcd.print("Heizung    EIN");
    digitalWrite(Heizung_PIN, EIN);
  }

  if (temp >= soll_Temp + 2) {
    lcd.setCursor(0, 3);
    lcd.print("Kuehlung   EIN");
    digitalWrite(Kuehlung_PIN, EIN);
  }

  if (temp <= soll_Temp) {
    digitalWrite(Kuehlung_PIN, AUS);
  }

  if (temp >= soll_Temp) {
    digitalWrite(Heizung_PIN, AUS);
  }

  if (digitalRead(Heizung_PIN) == HIGH and digitalRead(Kuehlung_PIN) == HIGH)
  {
    lcd.setCursor(0, 3);
    lcd.print("Temperatur OK ");

Nun gehen die Relais bei +/- 2°C abweichend von Solltemperatur an und bei erreichen von Solltemp. schalten diese entsprechend ab. Wird weder geheizt noch gekühlt zeigt es Temp. OK an und ansonsten den entsprechenden Betrieb.
Juhuj... :slight_smile: danke für eure konstruktive und ausfürliche Unterstützung.
Als nächstes stehen PH Sensor, Ultraschall und Wassersensor an. Ich melde mich bestimmt wieder hier. :slight_smile: Lieber Gruss

PS: und in dem Fall tatsächlich LOW-geschaltet .. :+1:

Das hat jetzt so round about 25Posts benötigt um den angeboteten Code umzusetzen...

Schön, wenns geht. Ich werd eh schon ständig darauf hingewiesen hier nicht mehr zu posten, weil das ja schon längst gelöst war.
Na dann...

Okay wow. Die Angebotenen Codes haben geholfen aber es hat nicht funktioniert! Ich habe nun gepostet wie es aufgelöst funktioniert hat.
Ich entschuldige mich wenn ich als grober Anfänger bei meinem ersten Projekt nicht gerade alles geschnallt habe was ihr schreibt. Ich habe mich aber bemüht. Wollte niemandem die Zeit stehlen. ... Janu.

Du könntest noch das jetzt funktionierende Programm als ganzen Sketch posten.
vgs

1 Like

TempVersion5.ino (4,2 KB)

1 Like

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.