DS18B20 Sketch erweitern, anzahl erhöhen

Hallo zusammen, das sind meine ersten gehversuche mit der Softwareprogrammierung generell, bitte habt rücksicht.

Ich habe ein fertiges Sketch auf einem D1 Mini welches 10 DS18B20 ausliest und an meine Homematiczentrale sendet. Nun möchte ich das Sketch auf 11 Sensoren und später auch auf 14 erweitern. Ich habe schon alles probiert aber leider verstehe ich die mechanismen dahinter nicht. Könnt ihr mir tips geben was ich anpassen muss?

#include <OneWire.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <Umlaute.h>


// DS18S20 Temperaturchip i/o
OneWire ds(D1);  // an pin D1

//Hier die Adressen von den Sensoren eingeben



#define HKV_EG_VL     "28 FF 90 4F A4 16 4 CA"  
#define HKV_EG_RL     "28 FF 88 86 A4 16 4 22"
#define HK_EG_1       "28 FF 5D 87 A4 16 4 21"
#define HK_EG_2       "28 FF 9C 4D A4 16 4 EC"
#define HK_EG_3       "28 FF DC 4F A4 16 4 2"
#define HK_EG_4       "28 FF 2 50 A4 16 4 5C"
#define HK_EG_5       "28 FF 16 3B A4 16 4 3B"
#define HK_EG_6       "28 FF 76 AD A4 16 5 9C"
#define HK_EG_7       "28 FF 5C 86 A4 16 4 63"
#define HK_EG_8       "28 FF 50 AD A4 16 5 F8"
#define HK_EG_9       "28 FF 43 31 A4 16 4 67"
//#define HK_EG_10      ""
//#define HK_EG_11      ""
//#define HK_EG_12      ""

#define SENSOR1 HKV_EG_VL    
#define SENSOR2 HKV_EG_RL
#define SENSOR3 HK_EG_1
#define SENSOR4 HK_EG_2
#define SENSOR5 HK_EG_3
#define SENSOR6 HK_EG_4
#define SENSOR7 HK_EG_5
#define SENSOR8 HK_EG_6
#define SENSOR9 HK_EG_7
#define SENSOR10 HK_EG_8
#define SENSOR11 HK_EG_9
//#define SENSOR12 HK_EG_10
//#define SENSOR13 HK_EG_11
//#define SENSOR14 HK_EG_12

// Einstellungen für Messungen und Meldungen
#define ZEITINTERVALL_MESSUNGEN 10       //Abfragezyklus der Sensoren in Sekunden
#define ZEITINTERVALL_MELDUNGEN 60       //Sendeintervall an die Homematic in Sekunden
#define DELTA_TEMPERATURSCHWELLWERT 1    //Temperaturdifferenz zum senden an die Homematic in °C


// ******* Netzwerkeinstellungen, bitte anpassen! *******
const char* ssid = "Skynet";                                        // SSID des vorhandenen WLANs
const char* password = "";                                         // Passwort für das vorhandene WLAN
IPAddress gateway(192, 168, 1, 1);                                  // IP-Adresse des WLAN-Gateways
IPAddress subnet(255, 255, 255, 0);                                 // Subnetzmaske
IPAddress ip(192, 168, 1, 8);                                       // feste IP-Adresse für den WeMos
const char* host = "192.168.1.5";                                   // IP-Adresse der CCU
ESP8266WebServer server(80);                                        // Webserver initialisieren auf Port 80
// convert String object from UTF8 String to Extended ASCII


void MeldeWert(char* Sensor, float Temp)
{
  String strSensor;
  if (Contains(Sensor, "Sensor1")) strSensor = "HKV_EG_VL";         
  if (Contains(Sensor, "Sensor2")) strSensor = "HKV_EG_RL";
  if (Contains(Sensor, "Sensor3")) strSensor = "HK_EG_1";
  if (Contains(Sensor, "Sensor4")) strSensor = "HK_EG_2";
  if (Contains(Sensor, "Sensor5")) strSensor = "HK_EG_3";
  if (Contains(Sensor, "Sensor6")) strSensor = "HK_EG_4";
  if (Contains(Sensor, "Sensor7")) strSensor = "HK_EG_5";
  if (Contains(Sensor, "Sensor8")) strSensor = "HK_EG_6";
  if (Contains(Sensor, "Sensor9")) strSensor = "HK_EG_7";
  if (Contains(Sensor, "Sensor10")) strSensor = "HK_EG_8";
  if (Contains(Sensor, "Sensor11")) strSensor = "HK_EG_9";
  //if (Contains(Sensor, "Sensor12")) strSensor = "HK_EG_10";
  //if (Contains(Sensor, "Sensor13")) strSensor = "HK_EG_11";
  //if (Contains(Sensor, "Sensor14")) strSensor = "HK_EG_12";
  strSensor = utf8ascii(strSensor);
  Serial.println("StrSensor: " + strSensor + " und " + "Sensor: " + Sensor);
  String meldung = "";
  WiFiClient client; // Webclient initialisieren
  if (!client.connect(host, 8181)) { // mit dem CCU-Port 8181 verbinden
    Serial.println("  Fehler: Verbindung zur CCU konnte nicht aufgebaut werden");
    delay(50);
    return;
  }
  meldung = meldung + "GET /eriwan.exe?befehl=dom.GetObject('" + strSensor + "').State('" + Temp + "')";
  client.println(meldung); // Daten an CCU melden
}




char ConnectString[255] = "";
String Antwort = "";
unsigned long deltaMessungSekunden = ZEITINTERVALL_MESSUNGEN; //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
unsigned long deltaMeldungSekunden = ZEITINTERVALL_MELDUNGEN; // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)
unsigned long jetztMillis = 0;
unsigned long deltaMessungMillis = deltaMessungSekunden * 1000, letzteMessungMillis = 0;
unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000, letzteMeldungMillis = 0;
String antwort = "", meldung = "";
float deltaTemp = DELTA_TEMPERATURSCHWELLWERT; // Temperaturaenderung (*C) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)
float temp = 0, tempCCU = 0;
float NewTemp[10] =  { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};
float OldTemp[10] = { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};


String zeitstempel()
{ // Betriebszeit als Stunde:Minute:Sekunde
  char stempel[11];
  int lfdStunden = millis() / 3600000;
  int lfdMinuten = millis() / 60000 - lfdStunden * 60;
  int lfdSekunden = millis() / 1000 - lfdStunden * 3600 - lfdMinuten * 60;
  sprintf (stempel, "%03d:%02d:%02d", lfdStunden, lfdMinuten, lfdSekunden);
  return stempel;
}


void WLANVerbindung()
{
  // WLAN-Verbindung herstellen
  WiFi.config(ip, gateway, subnet); // auskommentieren, falls eine dynamische IP bezogen werden soll
  WiFi.begin(ssid, password);
  Serial.print("Verbindungsaufbau");


  Serial.println(" erfolgreich!");
  Serial.println("");
  Serial.print("Verbunden mit: ");
  Serial.println(ssid);
  Serial.print("Signalstaerke: ");
  int rssi = WiFi.RSSI();
  Serial.print(rssi);
  Serial.println(" dBm");
  Serial.print("IP-Adresse: ");
  Serial.println(WiFi.localIP());
  Serial.println("");

  sprintf(ConnectString, "

Verbunden mit: %s 
Signalstaerke: %d dBm  

", ssid, rssi);

  server.on("/", Hauptseite);
  // HTTP-Server starten
  server.begin();
}

void setup(void)
{
  // inputs/outputs initialisieren
  // seriellen port starten
  Serial.begin(9600);
  //ListSensors();
  WLANVerbindung();
}
bool Contains(String s, String search)
{
  int max = s.length() - search.length();

  for (int i = 0; i <= max; i++) {
    if (s.substring(i) == search) return true; // or i
  }

  return false; //or -1
}

Ich würde gern den Rest vom Sketch posten aber man darf nur 9000 Zeichen in einer Nachricht.

void ListSensors(void)
{
  int count = 0, i = 0;
  byte addr[8];
  float Temp = 0.0;

  char Adress[10][255] = {"", "", "", "", "", "", "", "", "", ""};
  while (ds.search(addr))
  {
    sprintf(Adress[count], "");
    for ( i = 0; i < 8; i++)
    {
      sprintf(Adress[count], "%s %X", Adress[count], addr[i]);
    }
    count++;
  }
  Antwort += "Gefundene Sensoren \n
";
  Serial.print("\nGefundene Sensoren\n");
  for (count = 0; count < 11; count++)
  {
    if (strcmp(Adress[count], ""))
    {
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n
";
      Serial.print("\n");
    }
  }

  Antwort += "
";
  Serial.print("\n");
  Antwort += "Definierte Sensoren:\n
";
  Serial.print("Definierte Sensoren:\n");

  for (count = 0; count < 11; count++)
  {
    if (Contains(Adress[count], SENSOR1) && strcmp(Adress[count], "") && strcmp(SENSOR1, ""))
    {
      Antwort += "SENSOR1: ";
      Serial.print("SENSOR1: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n
";
      Serial.print("\n");
      //MeldeWert("Sensor1", Temp);

      OldTemp[0] = NewTemp[0];
      NewTemp[0] = Temp;
      if (OldTemp[0] == -255) OldTemp[0] = Temp;
    }
   [b]Den Code für die anderen Sensoren habe ich aufgrund der Zeichanzahl pro message entfernt[/b]
    else if (Contains(Adress[count], SENSOR11) && strcmp(Adress[count], "") && strcmp(SENSOR11, ""))
    {
      Antwort += "SENSOR11: ";
      Serial.print("SENSOR11: ");
      Antwort += Adress[count];
      Serial.print(Adress[count]);
      Antwort += " Wert: ";
      Serial.print(" Wert: ");
      Temp = GetRoomTemperature(Adress[count], true);
      Antwort += Temp;
      Serial.print(Temp);
      Antwort += "\n
";
      Serial.print("\n");
      //MeldeWert("Sensor11", Temp);
      OldTemp[10] = NewTemp[10];
      NewTemp[10] = Temp;
      if (OldTemp[10] == -255) OldTemp[10] = Temp;
    }
  }

  Antwort += "
";
  Serial.print("\n");
  Antwort += "Nicht definierte Sensoren:\n
";
  Serial.print("Nicht definierte Sensoren:\n");

  for (count = 0; count < 11; count++)
  {
    //Serial.print(Adress[count]);
    if (!(Contains(Adress[count], SENSOR1) && strcmp(SENSOR1, "")) &&
        !(Contains(Adress[count], SENSOR2) && strcmp(SENSOR2, "")) &&
        !(Contains(Adress[count], SENSOR3) && strcmp(SENSOR3, "")) &&
        !(Contains(Adress[count], SENSOR4) && strcmp(SENSOR4, "")) &&
        !(Contains(Adress[count], SENSOR5) && strcmp(SENSOR5, "")) &&
        !(Contains(Adress[count], SENSOR6) && strcmp(SENSOR6, "")) &&
        !(Contains(Adress[count], SENSOR7) && strcmp(SENSOR7, "")) &&
        !(Contains(Adress[count], SENSOR8) && strcmp(SENSOR8, "")) &&
        !(Contains(Adress[count], SENSOR9) && strcmp(SENSOR9, "")) &&
        !(Contains(Adress[count], SENSOR10) && strcmp(SENSOR10, "")) &&
        !(Contains(Adress[count], SENSOR11) && strcmp(SENSOR11, "")))
    {
      if (strcmp(Adress[count], ""))
      {
        Antwort += Adress[count];
        Serial.print(Adress[count]);
        Antwort += " Wert: ";
        Serial.print(" Wert: ");
        Temp = GetRoomTemperature(Adress[count], true);
        Antwort += Temp;
        Serial.print(Temp);
        Antwort += "\n
";
        Serial.print("\n");
      }
    }
  }
  letzteMessungMillis = jetztMillis;
  ds.reset_search();
}
void Hauptseite()
{
  Antwort = "";


  Antwort += "<meta http-equiv='refresh' content='60'/>";
  ListSensors();
  Antwort += ConnectString;
  //Antwort += "</body></html>";

  server.send ( 300, "text/html", Antwort );
  delay(100);

  //server.send(300, "text/plain", Antwort);
  //delay(150);
}

float GetRoomTemperature(char adress[255], bool doreset)
{
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  byte i, present = 0, data[12], addr[8];
  char stradd[255];
  while (ds.search(addr))
  {
    sprintf(stradd, "");
    //Serial.print("\nR=");
    for ( i = 0; i < 8; i++)
    {
      sprintf(stradd, "%s %X", stradd, addr[i]);
    }
    ds.reset();
    ds.select(addr);
    ds.write(0x44, 1);        // start Konvertierung, mit power-on am Ende

    delay(200);     // 750ms sollten ausreichen
    // man sollte ein ds.depower() hier machen, aber ein reset tut das auch

    present = ds.reset();
    ds.select(addr);
    ds.write(0xBE);         // Wert lesen

    for ( i = 0; i < 9; i++)
    {
      // 9 bytes
      data[i] = ds.read();
    }

    if (Contains(stradd, adress))
    {
      LowByte = data[0];
      HighByte = data[1];
      TReading = (HighByte << 8) + LowByte;
      SignBit = TReading & 0x8000;  // test most sig bit

      if (SignBit) // negative
      {
        TReading = (TReading ^ 0xffff) + 1; // 2's comp
      }
      Tc_100 = (6 * TReading) + TReading / 4;    // mal (100 * 0.0625) oder 6.25
      /* Für DS18S20 folgendes verwenden Tc_100 = (TReading*100/2);    */
      Whole = Tc_100 / 100;  // Ganzzahlen und Brüche trennen
      Fract = Tc_100 % 100;

      if (SignBit) // negative Werte ermitteln
      {
        //Serial.print("-");
      }


      if (doreset)ds.reset_search();
      return (float)Whole + ((float)Fract / 100);
    }
  }
}
char Sensor[16];
void loop(void)
{
  server.handleClient(); // auf HTTP-Anfragen warten

  jetztMillis = millis();

  // neue Messung falls Zeitintervall erreicht
  if (jetztMillis - letzteMessungMillis > deltaMessungMillis)
  {
    ListSensors();
  }

  for (int c = 0; c < 11; c++)
  {
    if (deltaTemp != 0 && abs(OldTemp[c] - NewTemp[c]) > deltaTemp)
    {
      Serial.print("Temperatur änderung bei Sensor: ");
      Serial.print(c + 1);
      Serial.print(" erreicht.");
      OldTemp[c] = NewTemp[c];
      sprintf(Sensor, "Sensor%d", c + 1);
      MeldeWert(Sensor, NewTemp[c]);
    }
  }

  // neue Meldung an die CCU falls Zeitintervall erreicht
  if (!deltaMeldungMillis == 0 && jetztMillis - letzteMeldungMillis > deltaMeldungMillis)
  {
    Serial.print(zeitstempel() + "  Zeitintervall erreicht: \n");
    letzteMeldungMillis = jetztMillis;
    //melde_CCU();

    for (int c = 0; c < 11; c++)
    {
      sprintf(Sensor, "Sensor%d", c + 1);
      MeldeWert(Sensor, NewTemp[c]);
    }
  }
}

Eigentlich wollte ich hier den kompletten Code in aufgehübschter Form reinstellen, aber selbst wenn er gut aussieht, ist er zu lang.

Mir scheint, dass sehr viel Code doppelt und dreifach vorhanden ist. Genau um so etwas zu vermeiden, wurden Funktionen erfunden. Und wenn ich etwas aufhübsche, dann achte ich auch auf Sachen wie max. 80 Z. Breite und doppelte Zeilenschaltungen. Wenn Du die Programmiererei in ein paar Jahren ändern willst, bist Du evtl. dankbar, wenn der Code gut zu warten ist.

Gruß

Gregor

Ok das verstehe ich aber wie kann ich ihn kürzen ohne zu wissen was ich da eigentlich mache.

Macht es sinn, erstmal unnötige Dinge wie Webserver und Wifi zu entfernen und sich nur auf die Integration des 11 Sensors zu konzentrieren?

Wenn ich nur wüsste wie die Temperaturen nacheinander ausgelesen und aufgelistet werden, um sie dann an den Webserver oder ich glaube über http-Befehle an die CCU (Homematic Zentrale) gesendet werden, dann könnte ich nur die Schnipsel posten?!?

kopfnussHM:
.... ohne zu wissen was ich da eigentlich mache.

Das sind gute Voraussetzungen :wink:

Willst du nur dieses eine Ding ans laufen bringen oder dich generell in das Thema einarbeiten?

kopfnussHM:
Ok das verstehe ich aber wie kann ich ihn kürzen ohne zu wissen was ich da eigentlich mache.

Wenn Du nicht programmieren kannst und es auch nicht lernen möchtest, ist das mit dem Kürzen ein Problem. Ein paar Eigenschaften dessen, womit Arduino programmiert wird: Ein Kommentar, der mit // anfängt, endet am Ende einer Zeile. Mehrzeilige Kommentare in /* und */ „klammern“.
Das mit den 80 Zeichen pro Zeile kommt daher, dass früher viele Drucker nur 80 Zeichen pro Zeile drucken konnten. Und ein paar andere Sonderlichkeiten ...

kopfnussHM:
Macht es sinn, erstmal unnötige Dinge wie Webserver und Wifi zu entfernen und sich nur auf die Integration des 11 Sensors zu konzentrieren?

Wenn ich nur wüsste wie die Temperaturen nacheinander ausgelesen und aufgelistet werden, um sie dann an den Webserver oder ich glaube über http-Befehle an die CCU (Homematic Zentrale) gesendet werden, dann könnte ich nur die Schnipsel posten?!?

Nein, ich glaube, da kannst Du wahrscheinlich nur etwas Wesentliches ändern oder anpassen, wenn Du ein paar C/C++-Grundlagen beherrschst.

Guck mal, ob es in { und } gefasste Blöcke gibt, die sich nur an wenigen Stellen oder nur an Stellen, die eindeutig beschrieben werden können, unterscheiden. Daraus lassen sich häufig Funktionen machen - da musst Du nur an einer Stelle etwas ändern, wenn es immer gleich bleibt.

Gruß

Gregor

ElEspanol:
Das sind gute Voraussetzungen :wink:

Willst du nur dieses eine Ding ans laufen bringen oder dich generell in das Thema einarbeiten?

Sinnvoll für mich wäre es wenn ich grundlegende Funktionen im Sketch ändern kann. D.H. Sketch auf meine Bedürfnisse anpassen. Eine komplette Neuerstellung ist für mich unerreichbar.

gregorss:
Wenn Du nicht programmieren kannst und es auch nicht lernen möchtest, ist das mit dem Kürzen ein Problem. Ein paar Eigenschaften dessen, womit Arduino programmiert wird: Ein Kommentar, der mit // anfängt, endet am Ende einer Zeile. Mehrzeilige Kommentare in /* und */ „klammern“.
Das mit den 80 Zeichen pro Zeile kommt daher, dass früher viele Drucker nur 80 Zeichen pro Zeile drucken konnten. Und ein paar andere Sonderlichkeiten ...

Nein, ich glaube, da kannst Du wahrscheinlich nur etwas Wesentliches ändern oder anpassen, wenn Du ein paar C/C++-Grundlagen beherrschst.

Guck mal, ob es in { und } gefasste Blöcke gibt, die sich nur an wenigen Stellen oder nur an Stellen, die eindeutig beschrieben werden können, unterscheiden. Daraus lassen sich häufig Funktionen machen - da musst Du nur an einer Stelle etwas ändern, wenn es immer gleich bleibt.

Gruß

Gregor

Der Sketch beinhaltet ja bereits die Möglichkeit 10 Sensoren anzuschließen. Die Schnipsel die sich auf die Sensoren beziehen habe ich ja bereits erweitert um den fehlenden Sensor.

Ich bräuchte nur Hilfe bei der Änderung des Arrays, vermute ich. Vielleicht könnt ihr mir nur sagen was hier gemacht wird:
1.)

void MeldeWert(char* Sensor, float Temp)
{
  String strSensor;
  if (Contains(Sensor, "Sensor1")) strSensor = "HKV_EG_VL";

2.)

char ConnectString[255] = "";
String Antwort = "";
unsigned long deltaMessungSekunden = ZEITINTERVALL_MESSUNGEN;       //Zeitintervall (Sekunden) nach dem eine Messung erfolgt
unsigned long deltaMeldungSekunden = ZEITINTERVALL_MELDUNGEN;       // Zeitintervall (Sekunden) nach dem eine CCU-Meldung erfolgt (0 bedeutet nie)
unsigned long jetztMillis = 0;
unsigned long deltaMessungMillis = deltaMessungSekunden * 1000, letzteMessungMillis = 0;
unsigned long deltaMeldungMillis = deltaMeldungSekunden * 1000, letzteMeldungMillis = 0;
String antwort = "", meldung = "";
float deltaTemp = DELTA_TEMPERATURSCHWELLWERT;                      // Temperaturaenderung (*C) bei der eine CCU-Meldung erfolgt (0 bedeutet nie)
float temp = 0, tempCCU = 0;
float NewTemp[10] =  { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};
float OldTemp[10] = { -255, -255, -255, -255, -255, -255, -255, -255, -255, -255};

Als erstes würde ich die irren define und nochmal define und dann nochmal als if contains vereinfachen. Das ist ja mit der Kirche ums Dorf

Ausserdem sendet der keine Daten irgendwohin, sondern wartet darauf, dass sie abgeholt werden. Stichwort server.

Den Sketch überhaupt ordentlich umzubauen, erfordert schon deutlich mehr als Grundkenntnisse.

Hi

In Deinem 2.ten Post hast Du zwei/drei Positionen, wo die 10 und die 11 drin vorkommen.
Die 10 bei Gleich, die 11 bei Kleiner.

Wenn Du Diese Positionen anpasst, könnte Dein Problem vll. schon weg sein.

Schön ist der Sketch aber dadurch immer noch nicht - wenn es Dich interessiert, wirst Du aber noch dran rum feilen.

Auch diese Nummer, also die 10, solltest Du am Anfang des Sketch als Konstante festlegen und im Programm dann damit arbeiten.

Oder, Du liest ALLE Sensoren ein, Die Du finden kannst und prüfst, ob Du mit Diesen was anzufangen weist.
Da hier die Bedeutungen fest programmiert werden, ist auch ein einfacher Austausch eines Sensor nicht so leicht möglich - man muß erst die ID auslesen und im Code eintragen, dann den µC neu flashen - aktuell ist Das aber eine spätere Baustelle.

Wenn Du Änderungen am Sketch vornimmst, mach Dir vorher eine Kopie - Nichts ist ärgerlicher, als den Code zu zerschießen.

MfG

Ich muss gestehen, ich habe es mir leichter vorgestellt. Ich habe ja bereits versucht durch einfaches ersetzen der 10 durch die 11. Das führt nur immer wieder dazu das sich der Sketch aufhängt. In dem Sketch sind für mein Empfinden ziemlich viele Strings, ich befürchte das durch einfaches erweitern der Sensoren nun zuviel RAM belegt wird?

So wie es sich mittlerweile abzeichnet muss ich das Sketch von Grund auf neu erstellen. Vielleicht erkläre ich nochmal was ich erreichen will und ihr weist mir nur den Weg wohin ich marschieren muss und was ich mir dazu eineignen muss?

1.) mehrere DS18B20 Sensoren an einem PIN betreiben (ca. max 20stck)
2.) mit dem vorhandenen WLAN verbinden
3.) die ausgelesenen Tempwerte mit Sensornamen und Wert an die Homematiczentrale übergeben
(das geht über diesen Befehl: meldung =meldung +“GET /eriwan.exe?befehl=dom.GetObject(’” + strSensor +"’).State(’" + Temp + “’)”; client.println(meldung); // Daten an CCU melden))

Ich danke euch.

1.) ja, 20 sollten gehen
2.) ja. Jedoch im loop einbauen, das bei Verbindungsabriss immer versucht wird, neu zu verbinden
3.) k.A., ich kenne die Homematic nicht. Wenn es vom Browser aus geht, sollte es vom ESP aus auch gehen.

Wie kann ich denn mehrere Sensoren einbinden/abfragen und eine Übergabe an die Homematiczentrale in dem Format Sensorname + Tempwert?

Ich habe bereits die Adressen von den Sensoren ausgelesen und an den Kabeln vermerkt, dass heißt ich weiss welcher Sensor wo angebracht ist.

Wie setze ich das im Sketch am besten um?

  1. Sensoren einlesen (Adresse)
  2. Sensoradressen einen Namen vergeben
  3. Temperaturwert auslesen
  4. Sensornamen + Tempwert an Homematiczentrale übergeben (das kann ich aus dem bisherigen Sketch nehmen)

Welche Funktionen sollte ich für 1 -3 verwenden, sodass ich auch mal einen Sensor tauschen oder auch die Anzahl der Sensoren ändern kann?

Könntet ihr mir bitte einen Tip geben was der Ersketcher hier gemacht hat?

void ListSensors(void)
{
int count=0,i=0;
byte addr[8];
float Temp = 0.0;

char Adress[10][255] = {"","","","","","","","","",""};
while(ds.search(addr))
{
sprintf(Adress[count], "");
for( i = 0; i < 8; i++)
{
sprintf(Adress[count], "%s %X", Adress[count],addr[i]);
}
count++;
}
Antwort += "Gefundene Sensoren \n
";
Serial.print("\nGefundene Sensoren\n");
for(count = 0; count<10;count++)
{
if(strcmp(Adress[count], ""))
{
Antwort += Adress[count];
Serial.print(Adress[count]);
Antwort += " Wert: ";
Serial.print(" Wert: ");
Temp = GetRoomTemperature(Adress[count], true);
Antwort += Temp;
Serial.print(Temp);
Antwort += "\n
";
Serial.print("\n");
}
}

Ich habe mal was aus meinen großen Sketch was raus kopiert. Läuft bei mir mit 4 Sensoren sollte aber auch mit 20 gehen. Du musst nur noch deine Adressen eintragen.
Aber ich kann es nicht testen.

#include <DallasTemperature.h>
#include <OneWire.h>
#define ONE_WIRE_BUS D1

char Temperature[20][6];            // Rücklauf Kessel Warmwasser Vorlauf
unsigned long previousMillis = 0;
int numberOfDevices; // Anzahl der gefundenen Thermometer

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);

void setup() {
  Serial.begin(115200);
  DS18B20.begin();
  numberOfDevices = DS18B20.getDeviceCount();       // Ermittelt die Anzahl von Ds18b20 am Pin
  Serial.println(numberOfDevices);
  DS18B20.setWaitForConversion(false);
  DS18B20.requestTemperatures();
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= 5000) {         // Temperatur aller 5 Sekunden auslesen
    previousMillis = currentMillis;
    getTemperature();
  }
}

void getTemperature() {
  DeviceAddress sensor[20][8] = { {0x28, 0xFF, 0xF6, 0x1E, 0x81, 0x16, 0x04, 0xB1} , {0x28, 0xFF, 0x2E, 0x17, 0x81, 0x16, 0x04, 0x42} ,
    {0x28, 0xFF, 0x29, 0x17, 0x81, 0x16, 0x04, 0x13} , {0x28, 0xFF, 0x03, 0x18, 0x81, 0x16, 0x04, 0xCC}
  };   //Rücklauf, Kessel, Warmwasser, Vorlauf

  float temp[20];

  for (byte i = 0; i < numberOfDevices; i++ ) {
    temp[i] = DS18B20.getTempC(*sensor[i]);             // Temperatur lesen
    if (temp[i] == -127.00 ) {                        // bei Fehler abbrechen
      continue;
    }
    dtostrf(temp[i], 5, 2, Temperature[i]);
    Serial.print(i);
    Serial.print(" ");
    Serial.println(Temperature[i]);
  }
  DS18B20.requestTemperatures();
}

Gruß fips

Wenn du einen Sensor ersetzt oder neue dazu machst, musst du immer den Sketch anpassen. Oder im Sketck ein entsprechendes Userinterface programmieren, worüber es der Enduser machen kann.
Auch musst du bei 20 Sensoren an einem Pin mit der Verkabelung aufpassen. Zu lang, Topografie, Störeinstrahlung, etc.
Ich würde ein zweidimensionales Array oder besser ein struct array anlegen, und da die Adresse und den Namen festlegen.

Dann einen endlichen Automaten, der drüber iteriert und sendet. Dann must du bei Änderungen an den Sensoren nur das struct ändern.

Ich flippe aus aber ich glaube ich habe den Fehler gefunden!!!

Sobald ich das Array auf 11 vergrößert habe kam im Seriellenmonitor nur noch kauderwelsch. Irgendwie bin ich dann auf Überschreitung des nutzbaren Rams gekommen.

Ich habe einfach das Array mit der Variable char auf 11 Variablen mit einer Zeichanzahl pro Variable von 255>100 geändert, nun läuft der Sketch durch.

void ListSensors(void)
{
  int count = 0, i = 0;
  byte addr[8];
  float Temp = 0.0;

  char Adress[11][100] = {"", "", "", "", "", "", "", "", "", "", ""};
  while (ds.search(addr))
  {
    sprintf(Adress[count], "");
    for ( i = 0; i < 8; i++)
    {
      sprintf(Adress[count], "%s %X", Adress[count], addr[i]);
    }
    count++;