Heizungssteuerung/ Raumtemperaturregelung

Hallo Leute,
ich möchte meine Heizung/ Raumtemperatur besser und effizienter steuern und möchte dazu einen Arduino Nano nehmen. Als Inspirration habe ich dieses Video aus Youtube genommen: Temperatursteuerung selber bauen mit einem Arduino und dem DS18B20 - YouTube
dort wird alles sehr schön gezeig und erklärt, nur passt das nicht ganz für mich. Ich möchte diese Steuerung auf 4 Fühler, 4 Relais und 8 Taster erweitern. Das im Video gezeigte 20x4 I2C Display bleibt gleich und auch das einzige. nun möchte ich aber auf dem Display jede Zeile für einen Raum mit Soll und Ist Temperatur angezeigt haben. Also ungefähr so:

WZ Soll: 18C Ist: 20C
B: Soll: 18C Ist: 21C
SZ: Soll: 18C Ist: 18C
AZ: Soll: 18C Ist: 17C

Den Code habe ich soweit angepasst, nur bin ich mir nicht sicher, ob mir das Display das so auch wieder geben wird, oder wie ich das machen könnte. Bin bei Displays ziemlich am Anfang. Könnt ihr mich da bitte in den richtigen Weg lenken? den Code findet ihr hier:

/*Temperatursteuerung von Stellantriebe fuer Heizungen mit stromlos geschlossenen 24V Antriebe
 * Version 1.0 vom 9.10.2022
 * Umgeschrieben von Stephan, inspirriert durch "Der Bastelbruder"
 */

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

//================================Wohnzimmer==Ein-/Ausgaenge================================================

#define DS18B20_DATA_WZ 2
#define Knopf_Plus_PIN_WZ 3
#define Knopf_Minus_PIN_WZ 4
#define Relais_PIN_WZ A0
#define start_WZ 18.0

//=======================================Bad==Ein-/Ausgaenge================================================

#define DS18B20_DATA_B 5
#define Knopf_Plus_PIN_B 6
#define Knopf_Minus_PIN_B 7
#define Relais_PIN_B A1
#define start_B 18.0

//===============================Schlafzimmer==Ein-/Ausgaenge================================================

#define DS18B20_DATA_SZ 8
#define Knopf_Plus_PIN_SZ 9
#define Knopf_Minus_PIN_SZ 10
#define Relais_PIN_SZ A2
#define start_SZ 18.0

//==============================Arbeitszimmer==Ein-/Ausgaenge================================================

#define DS18B20_DATA_AZ 11
#define Knopf_Plus_PIN_AZ 12
#define Knopf_Minus_PIN_AZ 13
#define Relais_PIN_AZ A3
#define start_AZ 18.0

//=========================================Code=============================================================

OneWire oneWire(DS18B20_DATA_WZ);
DallasTemperature sensors(&oneWire);
float soll_Temp_WZ;
OneWire oneWire_B(DS18B20_DATA_B);
DallasTemperature sensors_B(&oneWire);
float soll_Temp_B;
OneWire oneWire_SZ(DS18B20_DATA_SZ);
DallasTemperature sensors_SZ(&oneWire);
float soll_Temp_SZ;
OneWire oneWire_AZ(DS18B20_DATA_AZ);
DallasTemperature sensors_AZ(&oneWire);
float soll_Temp_AZ;

void setup(){
  lcd.init();
  lcd.backlight();
  sensors.begin();
  pinMode(Relais_PIN_WZ, OUTPUT);
  digitalWrite(Relais_PIN_WZ,HIGH);
  pinMode(Knopf_Plus_PIN_WZ,INPUT_PULLUP);
  pinMode(Knopf_Minus_PIN_WZ,INPUT_PULLUP);
  sensors_B.begin();
  pinMode(Relais_PIN_B, OUTPUT);
  digitalWrite(Relais_PIN_B,HIGH);
  pinMode(Knopf_Plus_PIN_B,INPUT_PULLUP);
  pinMode(Knopf_Minus_PIN_B,INPUT_PULLUP);
  sensors_SZ.begin();
  pinMode(Relais_PIN_SZ, OUTPUT);
  digitalWrite(Relais_PIN_SZ,HIGH);
  pinMode(Knopf_Plus_PIN_SZ,INPUT_PULLUP);
  pinMode(Knopf_Minus_PIN_SZ,INPUT_PULLUP);
  sensors_AZ.begin();
  pinMode(Relais_PIN_AZ, OUTPUT);
  digitalWrite(Relais_PIN_AZ,HIGH);
  pinMode(Knopf_Plus_PIN_AZ,INPUT_PULLUP);
  pinMode(Knopf_Minus_PIN_AZ,INPUT_PULLUP);
}

void loop(){
//==============================================Wohnzimmer===================================================
  if (soll_Temp_WZ == 0){
    soll_Temp_WZ = start_WZ;
  } 
  while (digitalRead(Knopf_Plus_PIN_WZ) == 0){
    soll_Temp_WZ = soll_Temp_WZ + 0.1;
    lcd.setCursor(0,1);
    lcd.print("WZ Soll: ");
    lcd.print(String(soll_Temp_WZ,1));
    lcd.print("\337C ");
    delay(500);
    int knopf_lang_plus_WZ = knopf_lang_plus_WZ + 1;
      while (digitalRead(Knopf_Plus_PIN_WZ) == 0 && knopf_lang_plus_WZ == 3){
        soll_Temp_WZ = soll_Temp_WZ + 0.1;
        lcd.setCursor(0,1);
        lcd.print("WZ Soll: ");
        lcd.print(String(soll_Temp_WZ,1));
        lcd.print("\337C ");
        delay(100);
      }
  }
  while (digitalRead(Knopf_Minus_PIN_WZ) == 0){
    soll_Temp_WZ = soll_Temp_WZ - 0.1;
    lcd.setCursor(0,1);
    lcd.print("WZ Soll: ");
    lcd.print(String(soll_Temp_WZ,1));
    lcd.print("\337C ");
    delay(500);
    int knopf_lang_minus_WZ= knopf_lang_minus_WZ + 1;
      while (digitalRead(Knopf_Minus_PIN_WZ) == 0 && knopf_lang_minus_WZ == 3){
        soll_Temp_WZ = soll_Temp_WZ - 0.1;
        lcd.setCursor(0,1);
        lcd.print("WZ Soll: ");
        lcd.print(String(soll_Temp_WZ,1));
        lcd.print("\337C ");
        delay(100);
      }
  }
  sensors.requestTemperatures();
  float temp_WZ (sensors.getTempCByIndex(0));
  lcd.setCursor(0,0);
  lcd.print("WZ Ist: ");
  lcd.print(String(temp_WZ,1));
  lcd.print("\337C ");
  lcd.setCursor(0,1);
  lcd.print("WZ Soll: ");
  lcd.print(String(soll_Temp_WZ,1));
  lcd.print("\337C ");
//==============================================Bad==========================================================

  if (soll_Temp_B == 0){
    soll_Temp_B = start_B;
  } 
  while (digitalRead(Knopf_Plus_PIN_B) == 0){
    soll_Temp_B = soll_Temp_B + 0.1;
    lcd.setCursor(0,1);
    lcd.print("B Soll: ");
    lcd.print(String(soll_Temp_B,1));
    lcd.print("\337C ");
    delay(500);
    int knopf_lang_plus_B = knopf_lang_plus_B + 1;
      while (digitalRead(Knopf_Plus_PIN_B) == 0 && knopf_lang_plus_B == 3){
        soll_Temp_B = soll_Temp_B + 0.1;
        lcd.setCursor(0,1);
        lcd.print("B Soll: ");
        lcd.print(String(soll_Temp_B,1));
        lcd.print("\337C ");
        delay(100);
      }
  }
  while (digitalRead(Knopf_Minus_PIN_B) == 0){
    soll_Temp_B = soll_Temp_B - 0.1;
    lcd.setCursor(0,1);
    lcd.print("B Soll: ");
    lcd.print(String(soll_Temp_B,1));
    lcd.print("\337C ");
    delay(500);
    int knopf_lang_minus_B = knopf_lang_minus_B + 1;
      while (digitalRead(Knopf_Minus_PIN_B) == 0 && knopf_lang_minus_B == 3){
        soll_Temp_B = soll_Temp_B - 0.1;
        lcd.setCursor(0,1);
        lcd.print("B Soll: ");
        lcd.print(String(soll_Temp_B,1));
        lcd.print("\337C ");
        delay(100);
      }
  }
  sensors_B.requestTemperatures();
  float temp_B (sensors_B.getTempCByIndex(0));
  lcd.setCursor(0,0);
  lcd.print("B Ist: ");
  lcd.print(String(temp_B,1));
  lcd.print("\337C ");
  lcd.setCursor(0,1);
  lcd.print("B Soll: ");
  lcd.print(String(soll_Temp_B,1));
  lcd.print("\337C ");
//==============================================Schlafzimmer=================================================

  if (soll_Temp_SZ == 0){
    soll_Temp_SZ = start_SZ;
  } 
  while (digitalRead(Knopf_Plus_PIN_SZ) == 0){
    soll_Temp_SZ = soll_Temp_SZ + 0.1;
    lcd.setCursor(0,1);
    lcd.print("SZ Soll: ");
    lcd.print(String(soll_Temp_SZ,1));
    lcd.print("\337C ");
    delay(500);
    int knopf_lang_plus_SZ = knopf_lang_plus_SZ + 1;
      while (digitalRead(Knopf_Plus_PIN_SZ) == 0 && knopf_lang_plus_SZ == 3){
        soll_Temp_SZ = soll_Temp_SZ + 0.1;
        lcd.setCursor(0,1);
        lcd.print("SZ Soll: ");
        lcd.print(String(soll_Temp_SZ,1));
        lcd.print("\337C ");
        delay(100);
      }
  }
  while (digitalRead(Knopf_Minus_PIN_SZ) == 0){
    soll_Temp_SZ = soll_Temp_SZ - 0.1;
    lcd.setCursor(0,1);
    lcd.print("SZ Soll: ");
    lcd.print(String(soll_Temp_SZ,1));
    lcd.print("\337C ");
    delay(500);
    int knopf_lang_minus_SZ = knopf_lang_minus_SZ + 1;
      while (digitalRead(Knopf_Minus_PIN_SZ) == 0 && knopf_lang_minus_SZ == 3){
        soll_Temp_SZ = soll_Temp_SZ - 0.1;
        lcd.setCursor(0,1);
        lcd.print("SZ Soll: ");
        lcd.print(String(soll_Temp_SZ,1));
        lcd.print("\337C ");
        delay(100);
      }
  }
  sensors_SZ.requestTemperatures();
  float temp_SZ (sensors_SZ.getTempCByIndex(0));
  lcd.setCursor(0,0);
  lcd.print("SZ Ist: ");
  lcd.print(String(temp_SZ,1));
  lcd.print("\337C ");
  lcd.setCursor(0,1);
  lcd.print("SZ Soll: ");
  lcd.print(String(soll_Temp_SZ,1));
  lcd.print("\337C ");
//==============================================Arbeitszimmer================================================

  if (soll_Temp_AZ == 0){
    soll_Temp_AZ = start_AZ;
  } 
  while (digitalRead(Knopf_Plus_PIN_AZ) == 0){
    soll_Temp_AZ = soll_Temp_AZ + 0.1;
    lcd.setCursor(0,1);
    lcd.print("AZ Soll: ");
    lcd.print(String(soll_Temp_AZ,1));
    lcd.print("\337C ");
    delay(500);
    int knopf_lang_plus_AZ = knopf_lang_plus_AZ + 1;
      while (digitalRead(Knopf_Plus_PIN_AZ) == 0 && knopf_lang_plus_AZ == 3){
        soll_Temp_AZ = soll_Temp_AZ + 0.1;
        lcd.setCursor(0,1);
        lcd.print("AZ Soll: ");
        lcd.print(String(soll_Temp_AZ,1));
        lcd.print("\337C ");
        delay(100);
      }
  }
  while (digitalRead(Knopf_Minus_PIN_AZ) == 0){
    soll_Temp_AZ = soll_Temp_AZ - 0.1;
    lcd.setCursor(0,1);
    lcd.print("AZ Soll: ");
    lcd.print(String(soll_Temp_AZ,1));
    lcd.print("\337C ");
    delay(500);
    int knopf_lang_minus_AZ = knopf_lang_minus_AZ + 1;
      while (digitalRead(Knopf_Minus_PIN_AZ) == 0 && knopf_lang_minus_AZ == 3){
        soll_Temp_AZ = soll_Temp_AZ - 0.1;
        lcd.setCursor(0,1);
        lcd.print("AZ Soll: ");
        lcd.print(String(soll_Temp_AZ,1));
        lcd.print("\337C ");
        delay(100);
      }
  }
  sensors_AZ.requestTemperatures();
  float temp_AZ (sensors_AZ.getTempCByIndex(0));
  lcd.setCursor(0,0);
  lcd.print("AZ Ist: ");
  lcd.print(String(temp_AZ,1));
  lcd.print("\337C ");
  lcd.setCursor(0,1);
  lcd.print("AZ Soll: ");
  lcd.print(String(soll_Temp_AZ,1));
  lcd.print("\337C ");
}

Ich habe leider noch nicht das Display zum testen, deswegen wäre es mir lieb, wenn ich dennoch den Code soweit schon fertig habe, ebenso den Rest der Hardware. Als Sketch sieht es dann so aus:

Mit freundlichen Grüßen
Stephan

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Brauchst Du unbedingt 4 oneWireEingänge?
Du konterkarierst damit das oneWire-Prinzip.
Kann man machen.. muss aber nicht.

Und das hier:

    int knopf_lang_plus_WZ = knopf_lang_plus_WZ + 1;
    while (digitalRead(Knopf_Plus_PIN_WZ) == 0 && knopf_lang_plus_WZ == 3)

wird nie knopf_lang_plus_WZ == 3 erreichen.

Dein Umbau funktioniert nicht.
Das kannst hier simulieren:

Und du siehst dann wahrscheinlich woran es scheitert.

Auf das If wurdest eh schon hingewiesen.

Generell ist der Sketch sehr überarbeitungswürdig. Schon die Ausgangsbasis ist eher einer abschreckendes Beispiel wie man es nicht machen soll.

Danke schoneimal für die Antworten. Den Sketch habe ich ja auch aus dem Video entnommen und eben nur auf die Räume per Copy and Paste erweitert und paar Parameter angepasst.
@my_xy_projekt Wie könnte ich es denn bearbeiten, dass es das erreichen würde?

@noiasca Danke für den Link. Sowas habe ich auch schon verzweifelt gesucht und ohne vollständige Hardware kann ich das System noch nicht bauen und testen.
Allerdings zeigt es auch direkt das Problem. Wie bekomme ich das so, das eine Zeile 2 Werte hat?

weißt du was lcd.setCursor(0,1); macht?

Folge der Beschreibung der LCD API an.
https://playground.arduino.cc/Code/LCDAPI/

das habe ich gerade mit Hilfe der Simulationsoftware in dem link von dir rausgefunden. Der Code sieht jetzt wie folgt aus;

//================================Wohnzimmer==Ein-/Ausgaenge================================================

#define DS18B20_DATA_WZ 2
#define Knopf_Plus_PIN_WZ 3
#define Knopf_Minus_PIN_WZ 4
#define Relais_PIN_WZ A0
#define start_WZ 18.0

//=======================================Bad==Ein-/Ausgaenge================================================

#define DS18B20_DATA_B 5
#define Knopf_Plus_PIN_B 6
#define Knopf_Minus_PIN_B 7
#define Relais_PIN_B A1
#define start_B 18.0

//===============================Schlafzimmer==Ein-/Ausgaenge================================================

#define DS18B20_DATA_SZ 8
#define Knopf_Plus_PIN_SZ 9
#define Knopf_Minus_PIN_SZ 10
#define Relais_PIN_SZ A2
#define start_SZ 18.0

//==============================Arbeitszimmer==Ein-/Ausgaenge================================================

#define DS18B20_DATA_AZ 11
#define Knopf_Plus_PIN_AZ 12
#define Knopf_Minus_PIN_AZ 13
#define Relais_PIN_AZ A3
#define start_AZ 18.0

//=========================================Code=============================================================

OneWire oneWire(DS18B20_DATA_WZ);
DallasTemperature sensors(&oneWire);
float soll_Temp_WZ;
OneWire oneWire_B(DS18B20_DATA_B);
DallasTemperature sensors_B(&oneWire);
float soll_Temp_B;
OneWire oneWire_SZ(DS18B20_DATA_SZ);
DallasTemperature sensors_SZ(&oneWire);
float soll_Temp_SZ;
OneWire oneWire_AZ(DS18B20_DATA_AZ);
DallasTemperature sensors_AZ(&oneWire);
float soll_Temp_AZ;

void setup(){
  lcd.init();
  lcd.backlight();
  sensors.begin();
  pinMode(Relais_PIN_WZ, OUTPUT);
  digitalWrite(Relais_PIN_WZ,HIGH);
  pinMode(Knopf_Plus_PIN_WZ,INPUT_PULLUP);
  pinMode(Knopf_Minus_PIN_WZ,INPUT_PULLUP);
  sensors_B.begin();
  pinMode(Relais_PIN_B, OUTPUT);
  digitalWrite(Relais_PIN_B,HIGH);
  pinMode(Knopf_Plus_PIN_B,INPUT_PULLUP);
  pinMode(Knopf_Minus_PIN_B,INPUT_PULLUP);
  sensors_SZ.begin();
  pinMode(Relais_PIN_SZ, OUTPUT);
  digitalWrite(Relais_PIN_SZ,HIGH);
  pinMode(Knopf_Plus_PIN_SZ,INPUT_PULLUP);
  pinMode(Knopf_Minus_PIN_SZ,INPUT_PULLUP);
  sensors_AZ.begin();
  pinMode(Relais_PIN_AZ, OUTPUT);
  digitalWrite(Relais_PIN_AZ,HIGH);
  pinMode(Knopf_Plus_PIN_AZ,INPUT_PULLUP);
  pinMode(Knopf_Minus_PIN_AZ,INPUT_PULLUP);
}

void loop(){
//==============================================Wohnzimmer===================================================
  if (soll_Temp_WZ == 0){
    soll_Temp_WZ = start_WZ;
  } 
  while (digitalRead(Knopf_Plus_PIN_WZ) == 0){
    soll_Temp_WZ = soll_Temp_WZ + 0.1;
    lcd.setCursor(0,1);
    lcd.print("Soll:");
    lcd.print(String(soll_Temp_WZ,1));
    lcd.print("C");
    delay(500);
    int knopf_lang_plus_WZ = knopf_lang_plus_WZ + 1;
      while (digitalRead(Knopf_Plus_PIN_WZ) == 0 && knopf_lang_plus_WZ == 3){
        soll_Temp_WZ = soll_Temp_WZ + 0.1;
        lcd.setCursor(0,1);
        lcd.print("Soll:");
        lcd.print(String(soll_Temp_WZ,1));
        lcd.print("C");
        delay(100);
      }
  }
  while (digitalRead(Knopf_Minus_PIN_WZ) == 0){
    soll_Temp_WZ = soll_Temp_WZ - 0.1;
    lcd.setCursor(0,1);
    lcd.print("Soll:");
    lcd.print(String(soll_Temp_WZ,1));
    lcd.print("C");
    delay(500);
    int knopf_lang_minus_WZ= knopf_lang_minus_WZ + 1;
      while (digitalRead(Knopf_Minus_PIN_WZ) == 0 && knopf_lang_minus_WZ == 3){
        soll_Temp_WZ = soll_Temp_WZ - 0.1;
        lcd.setCursor(0,1);
        lcd.print("Soll:");
        lcd.print(String(soll_Temp_WZ,1));
        lcd.print("C");
        delay(100);
      }
  }
  sensors.requestTemperatures();
  float temp_WZ (sensors.getTempCByIndex(0));
  lcd.setCursor(0,0);
  lcd.print("Ist:");
  lcd.print(String(temp_WZ,1));
  lcd.print("C");
  lcd.setCursor(10,0);
  lcd.print("Soll:");
  lcd.print(String(soll_Temp_WZ,1));
  lcd.print("C");
//==============================================Bad==========================================================

  if (soll_Temp_B == 0){
    soll_Temp_B = start_B;
  } 
  while (digitalRead(Knopf_Plus_PIN_B) == 0){
    soll_Temp_B = soll_Temp_B + 0.1;
    lcd.setCursor(0,1);
    lcd.print("Soll:");
    lcd.print(String(soll_Temp_B,1));
    lcd.print("C");
    delay(500);
    int knopf_lang_plus_B = knopf_lang_plus_B + 1;
      while (digitalRead(Knopf_Plus_PIN_B) == 0 && knopf_lang_plus_B == 3){
        soll_Temp_B = soll_Temp_B + 0.1;
        lcd.setCursor(0,1);
        lcd.print("Soll:");
        lcd.print(String(soll_Temp_B,1));
        lcd.print("C");
        delay(100);
      }
  }
  while (digitalRead(Knopf_Minus_PIN_B) == 0){
    soll_Temp_B = soll_Temp_B - 0.1;
    lcd.setCursor(0,1);
    lcd.print("Soll:");
    lcd.print(String(soll_Temp_B,1));
    lcd.print("C");
    delay(500);
    int knopf_lang_minus_B = knopf_lang_minus_B + 1;
      while (digitalRead(Knopf_Minus_PIN_B) == 0 && knopf_lang_minus_B == 3){
        soll_Temp_B = soll_Temp_B - 0.1;
        lcd.setCursor(0,1);
        lcd.print("Soll:");
        lcd.print(String(soll_Temp_B,1));
        lcd.print("C");
        delay(100);
      }
  }
  sensors_B.requestTemperatures();
  float temp_B (sensors_B.getTempCByIndex(0));
  lcd.setCursor(0,1);
  lcd.print("Ist:");
  lcd.print(String(temp_B,1));
  lcd.print("C");
  lcd.setCursor(10,1);
  lcd.print("Soll:");
  lcd.print(String(soll_Temp_B,1));
  lcd.print("C");
//==============================================Schlafzimmer=================================================

  if (soll_Temp_SZ == 0){
    soll_Temp_SZ = start_SZ;
  } 
  while (digitalRead(Knopf_Plus_PIN_SZ) == 0){
    soll_Temp_SZ = soll_Temp_SZ + 0.1;
    lcd.setCursor(0,1);
    lcd.print("Soll:");
    lcd.print(String(soll_Temp_SZ,1));
    lcd.print("C");
    delay(500);
    int knopf_lang_plus_SZ = knopf_lang_plus_SZ + 1;
      while (digitalRead(Knopf_Plus_PIN_SZ) == 0 && knopf_lang_plus_SZ == 3){
        soll_Temp_SZ = soll_Temp_SZ + 0.1;
        lcd.setCursor(0,1);
        lcd.print("Soll:");
        lcd.print(String(soll_Temp_SZ,1));
        lcd.print("C");
        delay(100);
      }
  }
  while (digitalRead(Knopf_Minus_PIN_SZ) == 0){
    soll_Temp_SZ = soll_Temp_SZ - 0.1;
    lcd.setCursor(0,1);
    lcd.print("Soll:");
    lcd.print(String(soll_Temp_SZ,1));
    lcd.print("C");
    delay(500);
    int knopf_lang_minus_SZ = knopf_lang_minus_SZ + 1;
      while (digitalRead(Knopf_Minus_PIN_SZ) == 0 && knopf_lang_minus_SZ == 3){
        soll_Temp_SZ = soll_Temp_SZ - 0.1;
        lcd.setCursor(0,1);
        lcd.print("Soll:");
        lcd.print(String(soll_Temp_SZ,1));
        lcd.print("C");
        delay(100);
      }
  }
  sensors_SZ.requestTemperatures();
  float temp_SZ (sensors_SZ.getTempCByIndex(0));
  lcd.setCursor(0,2);
  lcd.print("Ist:");
  lcd.print(String(temp_SZ,1));
  lcd.print("C");
  lcd.setCursor(10,2);
  lcd.print("Soll:");
  lcd.print(String(soll_Temp_SZ,1));
  lcd.print("C");
//==============================================Arbeitszimmer================================================

  if (soll_Temp_AZ == 0){
    soll_Temp_AZ = start_AZ;
  } 
  while (digitalRead(Knopf_Plus_PIN_AZ) == 0){
    soll_Temp_AZ = soll_Temp_AZ + 0.1;
    lcd.setCursor(0,1);
    lcd.print("Soll:");
    lcd.print(String(soll_Temp_AZ,1));
    lcd.print("C");
    delay(500);
    int knopf_lang_plus_AZ = knopf_lang_plus_AZ + 1;
      while (digitalRead(Knopf_Plus_PIN_AZ) == 0 && knopf_lang_plus_AZ == 3){
        soll_Temp_AZ = soll_Temp_AZ + 0.1;
        lcd.setCursor(0,1);
        lcd.print("Soll:");
        lcd.print(String(soll_Temp_AZ,1));
        lcd.print("C");
        delay(100);
      }
  }
  while (digitalRead(Knopf_Minus_PIN_AZ) == 0){
    soll_Temp_AZ = soll_Temp_AZ - 0.1;
    lcd.setCursor(0,1);
    lcd.print("Soll:");
    lcd.print(String(soll_Temp_AZ,1));
    lcd.print("C");
    delay(500);
    int knopf_lang_minus_AZ = knopf_lang_minus_AZ + 1;
      while (digitalRead(Knopf_Minus_PIN_AZ) == 0 && knopf_lang_minus_AZ == 3){
        soll_Temp_AZ = soll_Temp_AZ - 0.1;
        lcd.setCursor(0,1);
        lcd.print("Soll:");
        lcd.print(String(soll_Temp_AZ,1));
        lcd.print("C");
        delay(100);
      }
  }
  sensors_AZ.requestTemperatures();
  float temp_AZ (sensors_AZ.getTempCByIndex(0));
  lcd.setCursor(0,3);
  lcd.print("Ist:");
  lcd.print(String(temp_AZ,1));
  lcd.print("C");
  lcd.setCursor(10,3);
  lcd.print("Soll:");
  lcd.print(String(soll_Temp_AZ,1));
  lcd.print("C");
}

Jetzt gibt es nur das Problem das @my_xy_projekt angesprochen hat. Bei OneWire, vergebe ich da den Fühlern Adressen, wenn ich die auf ein Pin setze, und wenn ja wie?
Was meint er mit

wird nie knopf_lang_plus_WZ == 3 erreichen.

aktuell legst du zwar 4 Databus an, nutzt aber eh immer nur den ersten:

sollte eigentlich
DallasTemperature sensors_AZ(&oneWire_AZ);

heißen.

Wenn du mehrere Sensoren an einem Bus (einem Pin) verwendest, dann must du beim Sensorauslesen auch den Index des Sensors oder dessen Adresse mitgeben. Also statt

getTempCByIndex(0)

vermutlich

getTempCByIndex(1) // für den zweiten Sensor

usw. In den Beispiele der Library sollte sowas eigentlich drinnen sein. Welche Library verwendest du ganz genau?

Langsam lerne ich dazu. das habe ich hier: Ds18b20 mehere sensoren an meheren pins - #4 by Chrysen auch gerade herausgefunden. Als Library wird OneWire.h und DallasTemprature verwendet.
habe ich aber immernoch das Problem was @my_xy_projekt mit

wird nie knopf_lang_plus_WZ == 3 erreichen.

gemeint hatte. Was müsste ich denn da im Code anpassen?

die eine lokale Variable static machen, aber ist es das überhaupt wert?

das wäre eine Variante mit weniger Code Duplikate:

aktuell noch mit separate Leitungen für den DS. Daher habe ich das einfach mal so übernommen.

Sinn ist folgender: Buttons, Sensoren und Relais bilden eine Einheit (eine Klasse) für einen Raum.
Jeder Raum hat eine Solltemperatur.
Jeder Raum schaltet sein Relais wenn notwendig
Jedem Raum wird eine Zeile auf dem LCD zugewiesen und diese wird bedruckt.

Generell gilt, Serial Print Ausgaben helfen zu sehen, wenn was schalten (soll).

Theoretisch könnte man statt der Referenz auf den Sensor auch den Bus übergeben und den jeweiligen Sensor Index übergeben. Aber ich lass das mal.

Mich würde mal interessieren, was mit den Relais dann eigentlich geschaltet werden soll? Pumpen? Elektroheizungen?

Ah OK. somit sieht auch der Code etwas anders und etwas simpler aus. Ich muss mich erstmal reinlesen. Siht auf jedenfall einleuchtender aus, als der Code von dem Video.

Das mit dem Bus klingt zwar gut, wäre aber wahrscheinlich nur interessant, wenn man eine komplette Heizung steuern möchte und nicht wie ich 5x 24V Stellantriebe an 5 Heizkörpern in 4 unterschiedlichen Räumen. Denn bei einer kompletten Heizungsanlage gibt es auch mehr Sensoren. Gibt es eigentlich ein Maximum an Busteilnehmern bei OneWire?
Danke auf jedenfall für deine Hilfe. ich werde mal mehr die Codes vergleichen. :slight_smile:
Allerdings gibt mir Arduino Ide bei Compilierung das hir aus:

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino: In function 'Room room()':

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:125:7: warning: left operand of comma operator has no effect [-Wunused-value]

   {3, 4, A0, 0, "WZ", sensors;};

       ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:125:10: warning: right operand of comma operator has no effect [-Wunused-value]

   {3, 4, A0, 0, "WZ", sensors;};

          ^~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:125:14: warning: right operand of comma operator has no effect [-Wunused-value]

   {3, 4, A0, 0, "WZ", sensors;};

              ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:125:17: warning: right operand of comma operator has no effect [-Wunused-value]

   {3, 4, A0, 0, "WZ", sensors;};

                 ^~~~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:125:23: warning: right operand of comma operator has no effect [-Wunused-value]

   {3, 4, A0, 0, "WZ", sensors;};

                       ^~~~~~~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:125:30: warning: right operand of comma operator has no effect [-Wunused-value]

   {3, 4, A0, 0, "WZ", sensors;};

                              ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:126:7: warning: left operand of comma operator has no effect [-Wunused-value]

   {6, 7, A1, 1, "Ba", sensors_B;};

       ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:126:10: warning: right operand of comma operator has no effect [-Wunused-value]

   {6, 7, A1, 1, "Ba", sensors_B;};

          ^~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:126:14: warning: right operand of comma operator has no effect [-Wunused-value]

   {6, 7, A1, 1, "Ba", sensors_B;};

              ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:126:17: warning: right operand of comma operator has no effect [-Wunused-value]

   {6, 7, A1, 1, "Ba", sensors_B;};

                 ^~~~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:126:23: warning: right operand of comma operator has no effect [-Wunused-value]

   {6, 7, A1, 1, "Ba", sensors_B;};

                       ^~~~~~~~~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:126:32: warning: right operand of comma operator has no effect [-Wunused-value]

   {6, 7, A1, 1, "Ba", sensors_B;};

                                ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:127:7: warning: left operand of comma operator has no effect [-Wunused-value]

   {9, 10, A2, 2, "SZ", sensors_SZ;};

       ^~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:127:11: warning: right operand of comma operator has no effect [-Wunused-value]

   {9, 10, A2, 2, "SZ", sensors_SZ;};

           ^~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:127:15: warning: right operand of comma operator has no effect [-Wunused-value]

   {9, 10, A2, 2, "SZ", sensors_SZ;};

               ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:127:18: warning: right operand of comma operator has no effect [-Wunused-value]

   {9, 10, A2, 2, "SZ", sensors_SZ;};

                  ^~~~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:127:24: warning: right operand of comma operator has no effect [-Wunused-value]

   {9, 10, A2, 2, "SZ", sensors_SZ;};

                        ^~~~~~~~~~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:127:34: warning: right operand of comma operator has no effect [-Wunused-value]

   {9, 10, A2, 2, "SZ", sensors_SZ;};

                                  ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:128:8: warning: left operand of comma operator has no effect [-Wunused-value]

   {12, 13, A3, 3, "AZ", sensors_AZ;};

        ^~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:128:12: warning: right operand of comma operator has no effect [-Wunused-value]

   {12, 13, A3, 3, "AZ", sensors_AZ;};

            ^~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:128:16: warning: right operand of comma operator has no effect [-Wunused-value]

   {12, 13, A3, 3, "AZ", sensors_AZ;};

                ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:128:19: warning: right operand of comma operator has no effect [-Wunused-value]

   {12, 13, A3, 3, "AZ", sensors_AZ;};

                   ^~~~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:128:25: warning: right operand of comma operator has no effect [-Wunused-value]

   {12, 13, A3, 3, "AZ", sensors_AZ;};

                         ^~~~~~~~~~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:128:35: warning: right operand of comma operator has no effect [-Wunused-value]

   {12, 13, A3, 3, "AZ", sensors_AZ;};

                                   ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:129:1: warning: no return statement in function returning non-void [-Wreturn-type]

 };

 ^

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino: In function 'void setup()':

ArduinoHeizung2:135:18: error: 'begin' was not declared in this scope

   for (auto &i : room) {

                  ^~~~

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino:135:18: note: suggested alternative: 'rewind'

   for (auto &i : room) {

                  ^~~~

                  rewind

ArduinoHeizung2:135:18: error: 'end' was not declared in this scope

Y:\Projekte\Arduinoheizung\ArduinoHeizung2\ArduinoHeizung2.ino: In function 'void loop()':

ArduinoHeizung2:147:3: error: expected ';' before 'for'

   for (auto &i : room) i.update();

   ^~~

exit status 1

'begin' was not declared in this scope

Nur 5 Stellantriebe an 5 Heizkörpern in 4 unterschiedlichen Räume.

Ah, was benutzt du da als Antrieb? Fertige Thermostate, denen du die Elektronik entfernt hast oder Servos?

Ganz normale 24V DC Stellantriebe die stromlos geschlossen sind. Solche werden im normalfall für die Fußbodenheizungen verwendet, passen aber auch an den Ventilen von Heizkörpern. Vorteil an denen ist, dass die nur auf oder zu können. Die Thermomeschanischen aber immer aufmachen, oder mit der Zeit kaputtgehen. Außerdem sind die Thermomeschanichen oder die Elektronischen ohne Raumfühler zu Ungenau.

Die erste Frage ist, was möchtest Du erreichen?
Soll das ein Schnellläufer werden für die Temperaturauswahl, so wie bei Uhren mit einem langen Tastendruck die Zeit eingestellt wird?

Und dann als gut gemeinter Tipp: Mach das alles erstmal nur beschränkt auf einen Sensor.
Du fummelst Dich sonst durch und kommst zu keinem brauchbarem Ergebnis.

/*Temperatursteuerung von Stellantriebe fuer Heizungen mit stromlos geschlossenen 24V Antriebe
   Version 1.0 vom 9.10.2022
   Umgeschrieben von Stephan, inspirriert durch "Der Bastelbruder"
*/

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

//================================Wohnzimmer==Ein-/Ausgaenge================================================

const byte DS18B20_DATA_WZ = 2;
const byte Knopf_Plus_PIN_WZ = 3;
const byte Knopf_Minus_PIN_WZ = 4;
const byte Relais_PIN_WZ = A0;
const float start_WZ = 18.0;

OneWire oneWire(DS18B20_DATA_WZ);
DallasTemperature sensors(&oneWire);
float soll_Temp_WZ;
float temp_WZ;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  lcd.init();
  lcd.backlight();
  sensors.begin();
  pinMode(Relais_PIN_WZ, OUTPUT);
  digitalWrite(Relais_PIN_WZ, HIGH);
  pinMode(Knopf_Plus_PIN_WZ, INPUT_PULLUP);
  pinMode(Knopf_Minus_PIN_WZ, INPUT_PULLUP);
}

void loop()
{
  wohnzimmerSetup();
  ausgabeLcd();
}
void wohnzimmerSetup()
{
  //==============================================Wohnzimmer===================================================
  if (soll_Temp_WZ == 0)
  {
    soll_Temp_WZ = start_WZ;
  }
  int knopf_lang = 0;
  while (digitalRead(Knopf_Plus_PIN_WZ) == LOW)
  {
    if ( knopf_lang < 3)
    {
      soll_Temp_WZ = soll_Temp_WZ + 0.1;
      knopf_lang++;
    }
    else
    {
      soll_Temp_WZ = soll_Temp_WZ + 1;
    }
    if (soll_Temp_WZ > 40)
    {
      soll_Temp_WZ = start_WZ;
    }
    lcd.setCursor(9, 1);
    if (soll_Temp_WZ < 10)
    { lcd.print(' '); }
    lcd.print(soll_Temp_WZ, 1);
    if (knopf_lang<3)
    delay(500);
    else
    delay(200);
  }
  knopf_lang = 0;
  while (digitalRead(Knopf_Minus_PIN_WZ) == LOW)
  {
    if ( knopf_lang < 3)
    {
      soll_Temp_WZ = soll_Temp_WZ - 0.1;
      knopf_lang++;
    }
    else
    {
      soll_Temp_WZ = soll_Temp_WZ - 1;
    }
    if (soll_Temp_WZ < start_WZ)
    {
      soll_Temp_WZ = 40;
    }
    lcd.setCursor(9, 1);
    if (soll_Temp_WZ < 10)
    { lcd.print(' '); }
    lcd.print(soll_Temp_WZ, 1);
    if (knopf_lang<3)
    delay(500);
    else
    delay(200);
  }
  temp_WZ = sensors.getTempCByIndex(0);
  sensors.requestTemperatures();
}

void ausgabeLcd()
{
  lcd.setCursor(0, 0);
  lcd.print("WZ Ist: ");
  if (temp_WZ < 10)
  { lcd.print(' '); }
  lcd.print(temp_WZ, 1);
  lcd.print("\337C ");
  lcd.setCursor(0, 1);
  lcd.print("WZ Soll: ");
  if (soll_Temp_WZ < 10)
  { lcd.print(' '); }
  lcd.print(soll_Temp_WZ, 1);
  lcd.print("\337C ");
}

Später wirst Du merken, das sich alles wiederholt, wie jetzt schon mit den zwei Button.
Dann kannst Du ganz zusammenfassen, was zusammen gehört und das in einzelne Funktionen, die wiederverwendet werden, auslagern.

Na denne..

der Code sollte nun ohne Warnings compilieren (getestet in der 1.8.19).
Obwohl ich eher glabue du hast da was daran verändert und daher ging es bei dir nicht.
Meine Warnings waren eigentlich nur aus der Simulation der DS Library.

Link temperatursteuerung.ino copy - Wokwi ESP32, STM32, Arduino Simulator

/*Temperatursteuerung von Stellantriebe fuer Heizungen mit stromlos geschlossenen 24V Antriebe
   Version 1.0 vom 9.10.2022
 
  // https://forum.arduino.cc/t/heizungssteuerung-raumtemperaturregelung/1041610/3
  // to be deleted 2022-12
*/

//#include <OneWire.h>
//#include <DallasTemperature.h>
// simulation Onewire & DS
class OneWire {
  public:
    OneWire(int pin) {(void)pin;}
};
class DallasTemperature {
  public:
    DallasTemperature(OneWire *oneWire) {(void)oneWire;}
    void begin() {};
    void requestTemperatures() {};
    float getTempCByIndex(uint8_t index)
    {
      (void)index;
      //return 22.1; // hardcoded fixe Temperatur
      return (random (200, 230)/10.0); // randomize value
    }
};
// Ende Simulation

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

constexpr byte DS18B20_DATA_WZ {2};   //Wohnzimmer
constexpr byte DS18B20_DATA_B {5};    // BAD
constexpr byte DS18B20_DATA_SZ {8};   //Schlafzimmer
constexpr byte DS18B20_DATA_AZ {11};  //Arbeitszimmer

class Room
{
  protected:
    const byte pinPlus;               // increase target temperature, button LOW active, connects to GND
    const byte pinMinus;
    const byte pinRelay;              // relay LOW active
    const byte lcdRow;                // a LCD row for this room
    const char *text ;                // text to identify that room
    float target = 21.7;              // soll temperatur
    float temp = 20;                  // last measured temperature
    uint32_t previousMillis = -10000; // time management for the temperature sensor
    DallasTemperature *sensor;

  public:
    Room (const byte pinPlus, const byte pinMinus, const byte pinRelay, const byte lcdRow, const char *text, DallasTemperature &sensor) :
      pinPlus{pinPlus}, pinMinus{pinMinus}, pinRelay{pinRelay}, lcdRow{lcdRow}, text{text}, sensor{&sensor} {}

    void begin()       // call in setup
    {
      digitalWrite(pinRelay, HIGH);
      pinMode(pinRelay, OUTPUT);
      pinMode(pinPlus, INPUT_PULLUP);
      pinMode(pinMinus, INPUT_PULLUP);
    }

    void handleLCD()  // output to a LCD
    {
      lcd.setCursor(0, lcdRow);
      lcd.print(text);
      lcd.print(" S:");
      lcd.print(target, 1);
      lcd.print(" I:");
      lcd.print(temp, 1);
      lcd.print("\337C ");
      if (digitalRead(pinRelay) == LOW) // indicator for relay on or off
        lcd.print('+'); 
      else 
        lcd.print('o');
    }

    void handleRelay() // switch relays by temperature
    {
      if (digitalRead(pinRelay) == LOW)  // relay is on
      {
        if (target <= temp)
        {
          Serial.print(text); 
          Serial.print(F(" target lower - OFF for relay pin "));
          Serial.println(pinRelay);
          digitalWrite(pinRelay, HIGH);
          handleLCD();
        }
      }
      else
      {
        if (target > temp)
        {
          Serial.print(text);
          Serial.print(F(" target higher - ON for relay pin "));
          Serial.println(pinRelay) ;
          digitalWrite(pinRelay, LOW);
          handleLCD();
        }
      }
    }

    void handleButton()  // read buttons, modify target value
    {
      const float step = 0.1;
      if (digitalRead(pinPlus) == LOW)
      {
        target += step;
        handleLCD();
        delay(200); // dirty delay
      }
      if (digitalRead(pinMinus) == LOW)
      {
        target -= step;
        handleLCD();
        delay(200); // dirty delay
      }
    }

    void handleSensor()  // read temperature sensor
    {
      if (millis() - previousMillis > 10000)
      {
        previousMillis = millis();
        temp = sensor->getTempCByIndex(0);
        handleLCD();
      }
    }

    void update()  // the "run" function for the loop
    {
      handleButton();
      handleSensor();
      handleRelay();
    }
};

OneWire oneWire(DS18B20_DATA_WZ);
DallasTemperature sensors(&oneWire);
OneWire oneWire_B(DS18B20_DATA_B);
DallasTemperature sensors_B(&oneWire_B);
OneWire oneWire_SZ(DS18B20_DATA_SZ);
DallasTemperature sensors_SZ(&oneWire_SZ);
OneWire oneWire_AZ(DS18B20_DATA_AZ);
DallasTemperature sensors_AZ(&oneWire_AZ);

Room room[] {
  {3, 4, A0, 0, "WZ", sensors},
  {6, 7, A1, 1, "Ba", sensors_B},
  {9, 10, A2, 2, "SZ", sensors_SZ},
  {12, 13, A3, 3, "AZ", sensors_AZ}
};

void setup() {
  Serial.begin(115200);
  lcd.init();
  lcd.backlight();
  for (auto &i : room) {
    i.begin();
    i.handleLCD();  // update once
  }
  sensors.begin();
  sensors_B.begin();
  sensors_SZ.begin();
  sensors_AZ.begin();
}

void loop() {
  for (auto &i : room) i.update(); // call each object
}

PS: Du hast die library noch nicht klar identifiziert, daher kann ich es nicht mit echten Sensoren ausprobieren.

Wie meinst du das mit "klar definiert"? Wie kann man das nachschauen? Es sind auf jedenfall DS18B20 Sensoren.

identifiziert. Ich weis noch immer nicht welche Library du auf deinem PC installiert hast.

Ich werde mal bisschen rum probieren. mit der Simulation ist das sehr hilfreich. :slight_smile: