Dezimalzahlen per Serial übertragen

Hallo

Habe für meinen Pool eine Steuerung gebastelt die verschiedene Temperaturen ausliest und verarbeitet. Zusätzlich kenn ich noch über einen Webserver einige Funktionen steuern. Leider ist das ganze träge geworden wenn ich über den ESP die Temperaturen und Uhrzeit auslese und gleichzeitig den Webserver steuern will. Habe das nun auf 2 ESP aufgeteilt. Der 1. liest Temperaturen und Uhrzeit aus und soll diese Daten an den 2. ESP über die Serielle Schnittstelle senden. funktioniert auch nur leider überträgt es mir die Nachkommastellen nicht mit auf den 2. ESP so das immer ,0 dran steht. Ich komme leider nicht weiter und hoffe hier kann mich jemand auf den Fehler hinweisen.

ESP der sendet:

float tempPool;
float tempNachHeizung;
float tempAusen;

void loop()

   //Temperatursensoren auslesen

    sensors.requestTemperatures();
    tempPool = sensors.getTempC(sensor1);
    tempNachHeizung = sensors.getTempC(sensor2);
    tempAusen = sensors.getTempC(sensor3);
    //Zeit auslesen

    time_t now = time(nullptr);
    String time = String(ctime(&now));
    time.trim();
    time.substring(0, 19).toCharArray(time_value, 20);
    struct tm *timeinfo = localtime(&now);
    aktuelleMinute = timeinfo-> tm_min;
    aktuelleStunde = timeinfo-> tm_hour;
    Serial.print("A");
    Serial.print(",");
    Serial.print(aktuelleStunde);
    Serial.print(",");
    Serial.print(aktuelleMinute);
    Serial.print(",");
    Serial.print("B");
    Serial.print(",");
    Serial.print(tempPool);
    Serial.print(",");
    Serial.print("C");
    Serial.print(",");
    Serial.print(tempAusen);
    Serial.print(",");
    Serial.print("D");
    Serial.print(",");
    Serial.print(tempNachHeizung);
    abfrageZeitTemperatur = millis();
  }

ESP der Empfängt:

float tempPool;
float tempNachHeizung;
float tempAusen;

//Daten empfangen
float i;
float b, c, d, e, f, g, h;
int empfangsZaehler;

void loop()

 //Daten vom ESP Uhrzeit empfangen A = Uhrzeit B,C und D jeweils eine Temperatur


  if (Serial.available () <= 0 ); {

    i = Serial.read();
  }

  if (i == 'A')
  {
    empfangsZaehler++;
    while (Serial.available () <= 0 );
    i = Serial.read();

    if (i == ',')
    {
      b = Serial.parseInt();
      c = Serial.parseInt();
    }
  }


  if (i == 'B')
  {
    while (Serial.available () <= 0 );
    i = Serial.read();

    if (i == ',')
    {
      d = Serial.parseInt();
    }
  }

  if (i == 'C')
  {
    while (Serial.available () <= 0 );
    i = Serial.read();

    if (i == ',')
    {
      e = Serial.parseInt();

    }
  }

  if (i == 'D')
  {
    Serial.print("A");
    Serial.print(",");
    while (Serial.available () <= 0 );
    i = Serial.read();

    if (i == ',')
    {
      f = Serial.parseInt();
    }
  }

  aktuelleStunde = b;
  aktuelleMinute = c;
  tempPool = d;
  tempAusen = e;
  tempNachHeizung = f;

Verstehe nicht ganz warum er mir die Nachkommastelle nicht übernimmt muss ich die auftrennen und extra senden oder ist das auch anderst möglich?

Gruß Joe

da würde ich erstmal hier ansetzen.
Warum wird ein Programm mit "allem" auf einem ESP träge?

Die ganzen CodeDuplikate für die Serielle Kommunikation machen das sicher auch nicht besser.
Wenn man unbedingt will, dann kann man sich eine Serielle Kommunikation mit diesem Muster aufbauen:

Aber ich würde zunächst mal wieder retour auf einen ESP gehen.

Hallo,
dann machst Du da was falsch
Es sieht so aus als wenn Du das Einlesen der Temperaturen in jedem loop Umlauf machst. Mach das nur alle 2-3 sekunden einmal Schau Dir das Beispiel WaitForConversation aus der Dallas Lib an

Was für einen Webserver nutzt Du ?

Zu Deinem Seriellen Übertragungsproblem
Warum so kompliziert. ?
Gib Doch alles ganz normal aus , meinetwegen in einer Zeile und trenne die einzelnen variablen durch ein Trennzeichen z.B. ein ; Am ende kommt ein Endzeichen z.B ein LF.
z.B
10;23;20.52;19

Auf die unterschiedlichen Trennzeichen und A,B..usw kann man verzichten das macht es nur kompliziert. Das serielle Ausgeben machst Du besser auch nicht ständig , sondern auch nur alle paar Sekunden unter Verwendung von millis().

Beim Empfänger liest Du alles in eine char Arrray ein, bis das Endzeichen kommt , und trennst Dann auf in dem Du nach dem Trennzeichen suchst. Dazu bietet sich z.B strtok() an.

Hallo joggl

Es ist kein kluges Softwaredesign, Empfänger und Sender in zwei getrennten Dateien anzulegen, da dies bedeutet, dass Änderungen in zwei Dateien gepflegt werden müssen.

Vielen Dank für die Antworten. Temperaturen und Zeit lese ich nur alle 10 Sekunden aus und Serial sende ich auch in diesem Zeitraum (über millis()). Zeit hole ich über W-Lan aus dem Internet und es dauert immer 2 bis 3 Sekunden bis das fertig ist und aus irgendeinem Grund startet der ESP immer wieder neu (alle 1-2 Tage). Webserver ist auf dem ESP mit drauf. Den hab ich im Internet gefunden und auf mein Programm abgeändert, kommt wenn man auf Bildersuche Google "demo für esp8266 steuerung webserver" eingibt. ich weis nicht ob ich das verlinken darf. Wenn ich das ohne "A,B,C usw" mache kommt bei mir falsche Werte an auch da hab ich noch nicht gefunden warum. Aber ich werde mir die 2 Links genauer anschauen und versuchen zu einer Lösung zu kommen. Mache das mit Arduino noch nicht so lange und muss oft Stundenlang im Internet nach Lösungen suchen :slight_smile:

Arbeitest du viel mit Strings? Zeige doch mal den Code.Die Version ohne serielle Schnittstelle

Ohje ob das ne gute Idee ist :slight_smile:

//Internet
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

//Temperaturfühler
#include <OneWire.h>
#include <DallasTemperature.h>

//Uhrzeit
#include <time.h>

//Erweiterungsmodul
#include"PCF8574.h"

const char* ssid = "";
const char* password = "";


// Den Telegram-Bot initialisieren
#define botToken ""  // den Bot-Token bekommst du vom Botfather)

//Deine User ID
#define userID ""


WiFiClientSecure client;

UniversalTelegramBot bot(botToken, client);

X509List cert(TELEGRAM_CERTIFICATE_ROOT);


//Uhrzeit
char tmp[50];
char time_value[20];


//Temperaturfühler
const int temperaturbus = D3;   //Bus Pin
OneWire oneWire(temperaturbus);
DallasTemperature sensors(&oneWire);


uint8_t sensor1[8] = { 0x28, 0x1D, 0xE1, 0x49, 0xF6, 0xC5, 0x3C, 0x61  }; //Temperatur Pool
uint8_t sensor2[8] = { 0x28, 0x81, 0x6D, 0x48, 0xF6, 0x8C, 0x3C, 0xE1  }; //Temperatur Heizung
uint8_t sensor3[8] = { 0x28, 0xA3, 0x89, 0x48, 0xF6, 0x2F, 0x3C, 0x47  }; //Temperatur Außen

//Erweiterungsmodul
PCF8574 m1(0X20);

float tempPool;
float tempNachHeizung;
float tempAusen;
float  dimmwert = 1.0;


unsigned long abfrageZeitTemperatur = 1000;
unsigned long abfrageZeitUhr = 1000;
unsigned long einschaltZeitFrost;
unsigned long ausschaltZeitFrost;
unsigned long einschaltZeitHeizung;
unsigned long ausschaltZeitHeizung;
unsigned long pumpeHeizungLaufzeit;
unsigned long pumpeDüseZeit;
unsigned long zeitHoch;
unsigned long zeitRunter;
unsigned long ulReqcount;
unsigned long ulReconncount;
unsigned long heizenLauuft;




int pumpeHeizung = P0;
int netzteil = P1;
int rolladenein = P2;
int umwaelz = P3;
int rolladenbewegen = P4;
int PumpeDuesen = P5;
int poolSteuerung = P6;
int ledRot = D5;
int ledGruen = D6;
int ledBlau = D7;
int ledWeis = D8;


int hauptschalter = HIGH;
int hauptschalterPool= HIGH;
int heizungPool = HIGH;
int temperaturSoll = 37;
int frost = HIGH;
int ledBeleuchtung = HIGH;
int klappeFernseherRunter = HIGH;
int klappeFernseherHoch = HIGH;
int klappeFernseherStop = LOW;
int pumpeHeizungLauuft = HIGH;
int pumpeHeizungHeizen = HIGH;
int pumpeHeizungFrost = HIGH;
int umwaelzpumpe = HIGH;
int umwaelzpumpeHeizung = HIGH;
int umwaelzpumpeFiltern = HIGH;
int umwaelzpumpeFrost = HIGH;
int netzteilHeizung = HIGH;
int netzteilLed = HIGH ;
int netzteilFrost = HIGH;
int netzteilStatus = HIGH;
int filtern = HIGH;
int filterModus = LOW;
int badeModus = HIGH;
int weis = HIGH;
int blau = HIGH;
int gruen = HIGH;
int rot = HIGH;
int gelb = HIGH;
int pink = HIGH;
int lila = HIGH;
int orange = HIGH;
int ledAus = HIGH;
int farbeAendern = HIGH;
int statusGasLeer = HIGH;



int aktuelleMinute;
int aktuelleStunde;
int umwaelzStunden = 3;





// Create an instance of the server on Port 80
WiFiServer server(80);



//Telegram Nachrichten

void handleNewMessages(int numNewMessages)
{
  Serial.println("handleNewMessages");
  Serial.println(String(numNewMessages));

  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;

    String from_name = bot.messages[i].from_name;
    if (from_name == "")
      from_name = "Guest";

    if (text == "/Status")
    {
      bot.sendChatAction(chat_id, "typing");
      delay(1000);
      String stringtemp = "Pooltemp: ";
      stringtemp += String(tempPool , 1);
      stringtemp += "°";
      stringtemp += "\n";
      stringtemp += "Heizungtemp: ";
      stringtemp += String(tempNachHeizung, 1);
      stringtemp += "°";
      stringtemp += "\n";
      stringtemp += "Außentemp: ";
      stringtemp += String(tempAusen, 1);
      stringtemp += "°";
      stringtemp += "\n";
      if (heizungPool == LOW) {
        stringtemp += "Heizung eingeschaltet" ;
      }
      if (heizungPool == HIGH) {
        stringtemp += "Heizung ausgeschaltet" ;
      }
      stringtemp += "\n";
      stringtemp += "Solltemp: ";
      stringtemp += String(temperaturSoll);
      stringtemp += "°";
      bot.sendMessage(chat_id, (stringtemp));

    }


    if (text == "/HeizungEin")
    {
      bot.sendChatAction(chat_id, "typing");
      delay(1000);
      heizungPool = LOW;
      bot.sendMessage(chat_id, "Heizung eingeschaltet");
    }

    if (text == "/HeizungAus")
    {
      bot.sendChatAction(chat_id, "typing");
      delay(1000);
      heizungPool = HIGH;
      bot.sendMessage(chat_id, "Heizung ausgeschaltet");
    }
  }
}

void setup()
{
  m1.begin();

  // setup globals
  ulReqcount = 0;
  ulReconncount = 0;

  m1.pinMode(pumpeHeizung, OUTPUT);
  m1.digitalWrite(pumpeHeizung, HIGH);
  m1.pinMode(netzteil, OUTPUT);
  m1.digitalWrite(netzteil, HIGH);
  m1.pinMode(rolladenein, OUTPUT);
  m1.digitalWrite(rolladenein, HIGH);
  m1.pinMode(umwaelz, OUTPUT);
  m1.digitalWrite(umwaelz, HIGH);
  m1.pinMode(rolladenbewegen, OUTPUT);
  m1.digitalWrite(rolladenbewegen, HIGH);
  m1.pinMode(PumpeDuesen, OUTPUT);
  m1.digitalWrite(PumpeDuesen, HIGH);
  m1.pinMode(poolSteuerung, OUTPUT);
  m1.digitalWrite(poolSteuerung, HIGH);


  pinMode(ledWeis, OUTPUT);
  digitalWrite(ledWeis, 0);
  pinMode(ledRot, OUTPUT);
  digitalWrite(ledRot, 0);
  pinMode(ledGruen, OUTPUT);
  digitalWrite(ledGruen, 0);
  pinMode(ledBlau, OUTPUT);
  digitalWrite(ledBlau, 0);


  // start serial
  Serial.begin(9600);
  delay(1);

  //Tempfühler
  sensors.begin();

  // inital connect
  WiFi.mode(WIFI_STA);
  WiFiStart();

  //Uhrzeit
  // Aktuelle Uhrzeit über den Zeit-Server ermitteln
  configTime(2 * 3600, 0, "0.de.pool.ntp.org", "ptbtime1.ptb.de");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }


  client.setInsecure();


}

void WiFiStart()
{
  ulReconncount++;

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  IPAddress ip();
  IPAddress dns();
  IPAddress gateway();
  IPAddress subnet();
  WiFi.config(ip, dns, gateway, subnet);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop()
{
  //Hauptschalter: Jede Nacht oder über den Hauptschalter(Webserver) wird der Pool ausgeschaltet. Umwälzpumpe geht immer(zur eingestellten Zeit).

  if(hauptschalterPool == LOW){
    m1.digitalWrite(poolSteuerung, LOW);
  }

  if(hauptschalterPool == HIGH){
    m1.digitalWrite(poolSteuerung, HIGH);
  }
  
  if (((aktuelleStunde == 01) && (aktuelleMinute == 30)) or (hauptschalter == LOW)) {

    heizungPool = HIGH;
    ledBeleuchtung = HIGH;
    klappeFernseherRunter = LOW;
    hauptschalter = HIGH;
    hauptschalterPool = HIGH;
    weis = HIGH;
    blau = HIGH;
    gruen = HIGH;
    rot = HIGH;
    gelb = HIGH;
    pink = HIGH;
    lila = HIGH;
    orange = HIGH;
    ledAus = LOW;
    farbeAendern = LOW;

  }

  //Heizung: Wird die Heizung eingeschaltet (Heizung hat vorrang bei Frost) kann über die Solltemperatur (Webseerver) die Temperatur vom Pool gesteuert werden.

  if (heizungPool == LOW) {
    netzteilHeizung = LOW;
    umwaelzpumpeHeizung = LOW;


    if (((tempPool + 100) - temperaturSoll) >= 100) {
      pumpeHeizungHeizen = HIGH;
      ausschaltZeitHeizung = millis();
      einschaltZeitHeizung = millis();
    }
    if (((tempPool + 100) - temperaturSoll) < 99) {
      heizenLauuft = millis();
      if (millis() - einschaltZeitHeizung < 840000) {
        pumpeHeizungHeizen = LOW;
        ausschaltZeitHeizung = millis();

      }
      if (millis() - einschaltZeitHeizung >= 840000) {
        pumpeHeizungHeizen = HIGH;
        if (millis() - ausschaltZeitHeizung >= 10000) {
          einschaltZeitHeizung = millis();
        }
      }
    }
  }


  if (heizungPool == HIGH) {
    umwaelzpumpeHeizung = HIGH;
    netzteilHeizung = HIGH;
    pumpeHeizungHeizen = HIGH;
    ausschaltZeitHeizung = millis();
    einschaltZeitHeizung = millis();
    statusGasLeer = HIGH;
  }


  //Frost: Fällt die Temperatur unter 1° wird die Frostschaltung aktiviert. Die Heizungspumpe wird alle 15 Minuten für 2 Minuten eingeschaltet um wärmeres Wasser durch die Heizung zu Pumpen. Bei aktiver Heizung wird die
  //Frostschaltung deaktiviert fertig

  if (tempAusen < 1) {
    frost = LOW;
  }

  if (tempAusen >= 1) {
    frost = HIGH;
  }



  if ((frost == LOW) && (pumpeHeizungHeizen == HIGH) && (millis() - heizenLauuft > 30000))  {     //Bei Frost und  Heizungspumpe aus (Falls Heizunng Pool aktiv ist aktiviert sich die Frostschaltung erst 
    umwaelzpumpeFrost = LOW;                                                                     // nach 30 Sekunden wegen der 15 Minuten abschaltung der Gasheizung
    netzteilFrost = LOW;  
    if (millis() - einschaltZeitFrost < 60000) {  // 1 Minuten ein
      pumpeHeizungFrost = LOW;
      ausschaltZeitFrost = millis();

    }
    if (millis() - einschaltZeitFrost >= 60000) {
      pumpeHeizungFrost = HIGH;
      if (millis() - ausschaltZeitFrost >= 900000) {   // 15 Minuten aus
        einschaltZeitFrost = millis();
      }
    }
  }

  if (frost == HIGH) {
    ausschaltZeitFrost = millis();
    einschaltZeitFrost = millis();
    pumpeHeizungFrost = HIGH;
    umwaelzpumpeFrost = HIGH;
    netzteilFrost = HIGH;
  }

  //Led Beleuchtung: Wird eine Farbe gewählt wird (Webserver), wird die Led Beleuchtung und das Netzteil eingeschaltet.


  if ((ledAus == LOW) && (farbeAendern == LOW)) {
    netzteilLed = HIGH;
    analogWrite(ledWeis, 0);
    analogWrite(ledBlau, 0);
    analogWrite(ledRot, 0);
    analogWrite(ledGruen, 0);
    farbeAendern = HIGH;
  }

  if ((weis == LOW) && (farbeAendern == LOW)) {
    netzteilLed = LOW;
    analogWrite(ledBlau, 0);
    analogWrite(ledRot, 0);
    analogWrite(ledGruen, 0);
    analogWrite(ledWeis, (255 * dimmwert));
    farbeAendern = HIGH;
  }

  if ((blau == LOW) && (farbeAendern == LOW)) {
    netzteilLed = LOW;
    analogWrite(ledWeis, 0);
    analogWrite(ledRot, 0);
    analogWrite(ledGruen, 0);
    analogWrite(ledBlau, (255 * dimmwert));
    farbeAendern = HIGH;
  }


  if ((gruen == LOW) && (farbeAendern == LOW)) {
    netzteilLed = LOW;
    analogWrite(ledWeis, 0);
    analogWrite(ledBlau, 0);
    analogWrite(ledRot, 0);
    analogWrite(ledGruen, (255 * dimmwert));
    farbeAendern = HIGH;
  }


  if ((rot == LOW) && (farbeAendern == LOW)) {
    netzteilLed = LOW;
    analogWrite(ledWeis, 0);
    analogWrite(ledBlau, 0);
    analogWrite(ledGruen, 0);
    analogWrite(ledRot, (255 * dimmwert));
    farbeAendern = HIGH;
  }


  if ((gelb == LOW) && (farbeAendern == LOW)) {
    netzteilLed = LOW;
    analogWrite(ledWeis, 0);
    analogWrite(ledBlau, 0);
    analogWrite(ledRot, (255 * dimmwert));
    analogWrite(ledGruen, (255 * dimmwert));
    farbeAendern = HIGH;
  }

  if ((pink == LOW) && (farbeAendern == LOW)) {
    netzteilLed = LOW;
    analogWrite(ledWeis, 0);
    analogWrite(ledRot, (255 * dimmwert));
    analogWrite(ledGruen, (20 * dimmwert));
    analogWrite(ledBlau, (147 * dimmwert));
    farbeAendern = HIGH;
  }

  if ((lila == LOW) && (farbeAendern == LOW)) {
    netzteilLed = LOW;
    analogWrite(ledWeis, 0);
    analogWrite(ledRot, (102 * dimmwert));
    analogWrite(ledGruen, (0 * dimmwert));
    analogWrite(ledBlau, (204 * dimmwert));
    farbeAendern = HIGH;
  }

  if ((orange == LOW) && (farbeAendern == LOW)) {
    netzteilLed = LOW;
    analogWrite(ledWeis, 0);
    analogWrite(ledBlau, 0);
    analogWrite(ledRot, (255 * dimmwert));
    analogWrite(ledGruen, (127 * dimmwert));
    farbeAendern = HIGH;
  }

  //Fernseher Klappe auf und zu

  if (klappeFernseherStop == LOW) {
    m1.digitalWrite(rolladenein, HIGH);
    m1.digitalWrite(rolladenbewegen, HIGH);
    zeitHoch = millis();
    zeitRunter = millis();
  }

  if (klappeFernseherHoch == LOW) {
    m1.digitalWrite(rolladenein, LOW);
    m1.digitalWrite(rolladenbewegen, HIGH);
    zeitRunter = millis();
  }

  if (klappeFernseherRunter == LOW) {
    klappeFernseherStop = HIGH;
    m1.digitalWrite(rolladenein, LOW);
    m1.digitalWrite(rolladenbewegen, LOW);

    if (millis() - zeitRunter > 30000) {
      klappeFernseherRunter = HIGH;
      klappeFernseherStop = LOW;
    }
  }


  //Umwälzpumpe: Die Pumpe wird zum Filtern für die eingestellten Stunden pro Tag eingeschaltet

  if ((aktuelleStunde == 12) && (aktuelleMinute == 30)) {
    filtern = LOW;
    umwaelzpumpeFiltern = LOW;
  }

  if ((aktuelleStunde == (12 + umwaelzStunden)) && (aktuelleMinute == 30)) {
    filtern = HIGH;
    umwaelzpumpeFiltern = HIGH;
  }

  // Wenn Filtern aktiviert, wird die Jet Pumpe für 20 Sekunden dazu geschaltet

  if ((filtern == LOW) && (millis() - pumpeDüseZeit < 20000)) {
    m1.digitalWrite(PumpeDuesen, LOW);
  }

  if ((filtern == LOW) && (millis() - pumpeDüseZeit >= 20000)) {
    m1.digitalWrite(PumpeDuesen, HIGH);
  }

  if (filtern == HIGH) {
    pumpeDüseZeit = millis();
  }



  //Umwälzpumpe

  if ((umwaelzpumpeHeizung == LOW) or (umwaelzpumpeFrost == LOW) or (umwaelzpumpeFiltern == LOW)) {
    umwaelzpumpe = LOW;
  }

  if ((umwaelzpumpeHeizung == HIGH) && (umwaelzpumpeFrost == HIGH) && (umwaelzpumpeFiltern == HIGH)) {
    umwaelzpumpe = HIGH;
  }


  if (umwaelzpumpe == LOW) {
    m1.digitalWrite(umwaelz, LOW);
  }

  if (umwaelzpumpe == HIGH) {
    m1.digitalWrite(umwaelz, HIGH);
  }


  //Netzteil

  if ((netzteilLed == LOW) or (netzteilHeizung == LOW) or (netzteilFrost == LOW)) {
    netzteilStatus = LOW;
  }

  if ((netzteilLed == HIGH) && (netzteilHeizung == HIGH) && (netzteilFrost == HIGH)) {
    netzteilStatus = HIGH;
  }


  if (netzteilStatus == LOW) {
    m1.digitalWrite(netzteil, LOW);
  }

  if (netzteilStatus == HIGH) {
    m1.digitalWrite(netzteil, HIGH);
  }


  //Heizungspumpe

  if ((pumpeHeizungHeizen == LOW) or (pumpeHeizungFrost == LOW)) {
    m1.digitalWrite(pumpeHeizung, LOW);
    pumpeHeizungLauuft = LOW;
  }

  if ((pumpeHeizungHeizen == HIGH) && (pumpeHeizungFrost == HIGH)) {
    m1.digitalWrite(pumpeHeizung, HIGH);
    pumpeHeizungLauuft = HIGH;
    pumpeHeizungLaufzeit = millis();
  }





  // überwachung Füllstand Gasflasche. Wenn Flasche leer wird eine Telegram Nachricht gesendet

  if ((pumpeHeizungLauuft == LOW) && (millis() - pumpeHeizungLaufzeit > 120000) && (frost == HIGH)) {
    if (((tempNachHeizung - tempPool) < 5) && (statusGasLeer == HIGH)) {
      bot.sendMessage(userID, "Gas leer", "");
      Serial.println("Gas leer");
      statusGasLeer = LOW;
    }
  }


  //Telegram, Temperatur und Uhrzeit wird alle 10 Sekunden abfragen

  if (millis() - abfrageZeitTemperatur > 10000) {

    //Prüfe Telegram Chat

    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while (numNewMessages)
    {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    //Temperatursensoren auslesen

    sensors.requestTemperatures();
    tempPool = sensors.getTempC(sensor1);
    tempNachHeizung = sensors.getTempC(sensor2);
    tempAusen = sensors.getTempC(sensor3);
    Serial.print("Temperatur Pool: ");
    Serial.print(tempPool);
    Serial.println("ºC");
    Serial.print("Temperatur nach Heizung: ");
    Serial.print(tempNachHeizung);
    Serial.println("ºC");
    Serial.print("Temperatur Außen: ");
    Serial.print(tempAusen, 1);
    Serial.println("ºC");

    //Zeit auslesen

    time_t now = time(nullptr);
    String time = String(ctime(&now));
    time.trim();
    time.substring(0, 19).toCharArray(time_value, 20);
    struct tm *timeinfo = localtime(&now);
    aktuelleMinute = timeinfo-> tm_min;
    aktuelleStunde = timeinfo-> tm_hour;
    Serial.print("Uhrzeit: ");
    Serial.println(time_value);
    abfrageZeitTemperatur = millis();
  }





  //Webserver


  // check if WLAN is connected
  if (WiFi.status() != WL_CONNECTED)
  {
    WiFiStart();
  }

  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client)
  {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  unsigned long ultimeout = millis() + 250;
  while (!client.available() && (millis() < ultimeout) )
  {
    delay(1);
  }
  if (millis() > ultimeout)
  {
    Serial.println("client connection time-out!");
    return;
  }

  // Read the first line of the request
  String sRequest = client.readStringUntil('\r');
  //Serial.println(sRequest);
  client.flush();

  // stop client, if request is empty
  if (sRequest == "")
  {
    Serial.println("empty request! - stopping client");
    client.stop();
    return;
  }

  // get path; end of path is either space or ?
  // Syntax is e.g. GET /?pin=MOTOR1STOP HTTP/1.1
  String sPath = "", sParam = "", sCmd = "";
  String sGetstart = "GET ";
  int iStart, iEndSpace, iEndQuest;
  iStart = sRequest.indexOf(sGetstart);
  if (iStart >= 0)
  {
    iStart += +sGetstart.length();
    iEndSpace = sRequest.indexOf(" ", iStart);
    iEndQuest = sRequest.indexOf("?", iStart);

    // are there parameters?
    if (iEndSpace > 0)
    {
      if (iEndQuest > 0)
      {
        // there are parameters
        sPath  = sRequest.substring(iStart, iEndQuest);
        sParam = sRequest.substring(iEndQuest, iEndSpace);
      }
      else
      {
        // NO parameters
        sPath  = sRequest.substring(iStart, iEndSpace);
      }
    }
  }

  ///////////////////////////////////////////////////////////////////////////////
  // output parameters to serial, you may connect e.g. an Arduino and react on it
  ///////////////////////////////////////////////////////////////////////////////
  if (sParam.length() > 0)
  {
    int iEqu = sParam.indexOf("=");
    if (iEqu >= 0)
    {
      sCmd = sParam.substring(iEqu + 1, sParam.length());
      Serial.println(sCmd);
    }
  }


  ///////////////////////////
  // format the html response
  ///////////////////////////
  String sResponse, sHeader;

  ////////////////////////////
  // 404 for non-matching path
  ////////////////////////////
  if (sPath != "/")
  {
    sResponse = "<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>";

    sHeader  = "HTTP/1.1 404 Not found\r\n";
    sHeader += "Content-Length: ";
    sHeader += sResponse.length();
    sHeader += "\r\n";
    sHeader += "Content-Type: text/html\r\n";
    sHeader += "Connection: close\r\n";
    sHeader += "\r\n";
  }
  ///////////////////////
  // format the html page
  ///////////////////////
  else
  {
    ulReqcount++;
    sResponse  = "<html><head><title>Whirlpool</title></head><body>";
    sResponse += "<font color=\"#000000\"><body bgcolor=\"#d0d0f0\">";
    sResponse += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">";
    sResponse += "<h1>Whirlpool Steuerung</h1>";
    sResponse += "<p> <a href=\"?pin=Aktualisieren\"><button>Aktualisieren</button></a></p>";
    sResponse += "Temp. Pool: ";
    sResponse += String (tempPool, 1);
    sResponse += "&deg<BR>";
    sResponse += "Temp. Heizung: ";
    sResponse += String (tempNachHeizung, 1);
    sResponse += "&deg<BR>";
    sResponse += "Temp. Au&szligen: ";
    sResponse += String (tempAusen, 1);
    sResponse += "&deg<BR>";
    sResponse += "<FONT SIZE=+1>";
    sResponse += "<p>Hauptschalter: <a href=\"?pin=hauptschalterEin\"><button>Einschalten</button></a>&nbsp;<a href=\"?pin=hauptschalterAus\"><button>Ausschalten</button></a></p>";
    sResponse += "<p>Heizung: <a href=\"?pin=heizungEin\"><button>Einschalten</button></a>&nbsp;<a href=\"?pin=heizungAus\"><button>Ausschalten</button></a></p>";
    sResponse += "<p>Soll Wassertemperatur: <a href=\"?pin=Temperaturtief\"><button>K&aumllter</button></a>&nbsp;<a href=\"?pin=Temperaturhoch\"><button>W&aumlrmer</button></a>&nbsp;&nbsp;";
    if ((sCmd.indexOf("Temperaturtief") >= 0) && (temperaturSoll > 10))
    {
      temperaturSoll--;
    }
    if ((sCmd.indexOf("Temperaturhoch") >= 0) && (temperaturSoll < 42))
    {
      temperaturSoll++;
    }
    sResponse += String (temperaturSoll);
    sResponse += "&deg";
    sResponse += "<p>";
    sResponse += "<p>LED Beleuchtung: <a href=\"?pin=ledAus\"><button>Ausschalten</button></a>&nbspDimmer: <a href=\"?pin=dunkler\"><button>&nbsp-&nbsp</button></a>&nbsp;<a href=\"?pin=heller\"><button>&nbsp+&nbsp</button></a></p>";
    if (sCmd.indexOf("dunkler") >= 0)
    {
      if (dimmwert > 0.1) {
        dimmwert = dimmwert - 0.1;
        farbeAendern = LOW;
      }
    }

    if (sCmd.indexOf("heller") >= 0)
    {
      if (dimmwert < 1.0) {
        dimmwert = dimmwert + 0.1;
        farbeAendern = LOW;
      }
    }
    sResponse += "<p><a href=\"?pin=weis\"><button>Wei&szlig</button></a>&nbsp;<a href=\"?pin=blau\"><button>Blau</button></a>&nbsp;<a href=\"?pin=gruen\"><button>Gr&uumln</button></a>&nbsp;<a href=\"?pin=rot\"><button>Rot</button></a>&nbsp;<p>";
    sResponse += "<a href=\"?pin=gelb\"><button>Gelb</button></a>&nbsp;<a href=\"?pin=pink\"><button>Pink</button></a>&nbsp;<a href=\"?pin=lila\"><button>Lila</button></a>&nbsp;<a href=\"?pin=orange\"><button>Orange</button></a></p>";
    sResponse += "<p>Fernseher T&uumlr: <a href=\"?pin=tuerHoch\"><button>Hoch</button></a>&nbsp;<a href=\"?pin=tuerStop\"><button>Stop</button></a>&nbsp;<a href=\"?pin=tuerRunter\"><button>Runter</button></a></p>";

    //////////////////////
    // react on parameters
    //////////////////////
    if (sCmd.length() > 0)
    {

      if (sCmd.indexOf("hauptschalterEin") >= 0)
      {
        hauptschalterPool = LOW;
      }


      if (sCmd.indexOf("hauptschalterAus") >= 0)
      {
        hauptschalter = LOW;
      }



      if (sCmd.indexOf("heizungEin") >= 0)
      {
        heizungPool = LOW;
      }
      if (sCmd.indexOf("heizungAus") >= 0)
      {
        heizungPool = HIGH;
      }



      if (sCmd.indexOf("ledAus") >= 0)
      {
        weis = HIGH;
        blau = HIGH;
        gruen = HIGH;
        rot = HIGH;
        gelb = HIGH;
        pink = HIGH;
        lila = HIGH;
        orange = HIGH;
        ledAus = LOW;
        farbeAendern = LOW;
      }

      if (sCmd.indexOf("weis") >= 0)
      {
        weis = LOW;
        blau = HIGH;
        gruen = HIGH;
        rot = HIGH;
        gelb = HIGH;
        pink = HIGH;
        lila = HIGH;
        orange = HIGH;
        ledAus = HIGH;
        farbeAendern = LOW;
      }
      if (sCmd.indexOf("blau") >= 0)
      {
        weis = HIGH;
        blau = LOW;
        gruen = HIGH;
        rot = HIGH;
        gelb = HIGH;
        pink = HIGH;
        lila = HIGH;
        orange = HIGH;
        ledAus = HIGH;
        farbeAendern = LOW;
      }
      if (sCmd.indexOf("gruen") >= 0)
      {
        weis = HIGH;
        blau = HIGH;
        gruen = LOW;
        rot = HIGH;
        gelb = HIGH;
        pink = HIGH;
        lila = HIGH;
        orange = HIGH;
        ledAus = HIGH;
        farbeAendern = LOW;
      }
      if (sCmd.indexOf("rot") >= 0)
      {
        weis = HIGH;
        blau = HIGH;
        gruen = HIGH;
        rot = LOW;
        gelb = HIGH;
        pink = HIGH;
        lila = HIGH;
        orange = HIGH;
        ledAus = HIGH;
        farbeAendern = LOW;
      }
      if (sCmd.indexOf("gelb") >= 0)
      {
        weis = HIGH;
        blau = HIGH;
        gruen = HIGH;
        rot = HIGH;
        gelb = LOW;
        pink = HIGH;
        lila = HIGH;
        orange = HIGH;
        ledAus = HIGH;
        farbeAendern = LOW;
      }
      if (sCmd.indexOf("pink") >= 0)
      {
        weis = HIGH;
        blau = HIGH;
        gruen = HIGH;
        rot = HIGH;
        gelb = HIGH;
        pink = LOW;
        lila = HIGH;
        orange = HIGH;
        ledAus = HIGH;
        farbeAendern = LOW;
      }
      if (sCmd.indexOf("lila") >= 0)
      {
        weis = HIGH;
        blau = HIGH;
        gruen = HIGH;
        rot = HIGH;
        gelb = HIGH;
        pink = HIGH;
        lila = LOW;
        orange = HIGH;
        ledAus = HIGH;
        farbeAendern = LOW;
      }
      if (sCmd.indexOf("orange") >= 0)
      {
        weis = HIGH;
        blau = HIGH;
        gruen = HIGH;
        rot = HIGH;
        gelb = HIGH;
        pink = HIGH;
        lila = HIGH;
        orange = LOW;
        ledAus = HIGH;
        farbeAendern = LOW;
      }




      if (sCmd.indexOf("tuerHoch") >= 0)
      {
        klappeFernseherStop = HIGH;
        klappeFernseherRunter = HIGH;
        klappeFernseherHoch = LOW;
        zeitHoch = millis();
      }
      if (sCmd.indexOf("tuerStop") >= 0)
      {
        klappeFernseherHoch = HIGH;
        klappeFernseherRunter = HIGH;
        klappeFernseherStop = LOW;
      }
      if (sCmd.indexOf("tuerRunter") >= 0)
      {
        klappeFernseherStop = HIGH;
        klappeFernseherHoch = HIGH;
        klappeFernseherRunter = LOW;
        zeitRunter = millis();
      }


    }

    sResponse += "Heizung: ";
    if (heizungPool == LOW) {
      sResponse += "Ein<BR>";
    }
    if (heizungPool == HIGH) {
      sResponse += "Aus<BR>";
    }
    sResponse += "<p>Soll Umw&aumllzpumpe: <a href=\"?pin=stundeweniger\"><button>&nbsp-&nbsp</button></a>&nbsp;<a href=\"?pin=stundemehr\"><button>&nbsp+&nbsp</button></a>&nbsp;&nbsp;";
    if ((sCmd.indexOf("stundeweniger") >= 0) && (umwaelzStunden > 1))
    {
      umwaelzStunden--;
    }
    if ((sCmd.indexOf("stundemehr") >= 0) && (umwaelzStunden < 8))
    {
      umwaelzStunden++;
    }
    sResponse += String (umwaelzStunden);
    sResponse += " Stunden";
    sResponse += "<p>";
    sResponse += "Umw&aumllzpumpe: ";
    if (umwaelzpumpe == LOW) {
      sResponse += "Ein<BR>";
    }
    if (umwaelzpumpe == HIGH) {
      sResponse += "Aus<BR>";
    }
    sResponse += "<FONT SIZE=-2>";
    sResponse += "<BR>Aufrufz&auml;hler=";
    sResponse += ulReqcount;
    sResponse += " - Verbindungsz&auml;hler=";
    sResponse += ulReconncount;
    sResponse += "<BR>";
    sResponse += "Whirlpool 11/2023<BR>";
    sResponse += "</body></html>";

    sHeader  = "HTTP/1.1 200 OK\r\n";
    sHeader += "Content-Length: ";
    sHeader += sResponse.length();
    sHeader += "\r\n";
    sHeader += "Content-Type: text/html\r\n";
    sHeader += "Connection: close\r\n";
    sHeader += "\r\n";
  }

  // Send the response to the client
  client.print(sHeader);
  client.print(sResponse);

  // and stop the client
  client.stop();
  abfrageZeitTemperatur = millis();
  Serial.println("Client disonnected");
}

nur so sehen wir was du hast.

Leider hast du deinen Webserver auf ein falsches Beispiel aufgebaut.
Richtig wäre der HTTP Server (nicht der Wifi Server).

Autschn.

Ja.
Es gibt Dir die Möglichkeit, wenn sich jemand findet das aufzulösen, daraus zu lernen wie es besser geht. MIt dem Ergebnis wirst Du dann weiter mit nur einem ESP arbeiten können :slight_smile:

Es ist ein sehr langer Spaghetticode geworden, was es natürlich sehr schwer macht sich da einzulesen.

Aber wie schon vermutet, hast Du sehr viel (um nicht zu sagen alles) mit String gemacht und legst teilweise mit jedem Umlauf wieder welche an, was DIr irgendwann den Speicher so zerfleddert, dass nix mehr passt. z.B.:

  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;
    String from_name = bot.messages[i].from_name;

was mich fasziniert ist, dass Du mit Umlauten im Quellcode arbeitest....

unsigned long pumpeDüseZeit;

Solche Konstrukte:

  if (umwaelzpumpe == LOW)
  {
    m1.digitalWrite(umwaelz, LOW);
  }
  if (umwaelzpumpe == HIGH)
  {
    m1.digitalWrite(umwaelz, HIGH);
  }

bedeuten, dass Du zwei Vergleiche machst, von denen einer überflüssig ist.
Variante 1:

  if (umwaelzpumpe == LOW)
  {
    m1.digitalWrite(umwaelz, LOW);
  }
  else
  {
    m1.digitalWrite(umwaelz, HIGH);
  }

Variante 2:

    m1.digitalWrite(umwaelz, umwaelzpumpe);

:slight_smile:
Und da gibts noch ganz viel mehr.

Und dann musst Du Deine delays auflösen.
Die sorgen dafür, dass eine direkte Reaktion zu der Zeit nicht möglich ist...

@noiasca

Welches Beispiel wären den als HTTP Server geeignet? Da hab ich ein paar bei mir drin.

@my_xy_projekt

Ja da bin ich ja auch Dankbar für.

Was ich jetzt aber nicht ganz verstehe ist:

  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;
    String from_name = bot.messages[i].from_name;

das wird doch eigentlich gar nicht bei jedem Durchlauf ausgeführt nur wenn eine neue Nachricht ankommt oder sehe ich das falsch?

Das mit dem Umlaut hat sich einmal eingeschlichen und wird normal vermieden

Delays hab ich einmal im eigentlichen loop mit (1) das müsste doch zu vernachlässigen sein

Wenn ich mein Seriellen Monitor anschaue läuft es eigentlich gut durch bis auf den Teil da hängt er immer die paar Sekunden:

if (millis() - abfrageZeitTemperatur > 10000) {

    //Prüfe Telegram Chat

    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while (numNewMessages)
    {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    //Temperatursensoren auslesen

    sensors.requestTemperatures();
    tempPool = sensors.getTempC(sensor1);
    tempNachHeizung = sensors.getTempC(sensor2);
    tempAusen = sensors.getTempC(sensor3);
    Serial.print("Temperatur Pool: ");
    Serial.print(tempPool);
    Serial.println("ºC");
    Serial.print("Temperatur nach Heizung: ");
    Serial.print(tempNachHeizung);
    Serial.println("ºC");
    Serial.print("Temperatur Außen: ");
    Serial.print(tempAusen, 1);
    Serial.println("ºC");

    //Zeit auslesen

    time_t now = time(nullptr);
    String time = String(ctime(&now));
    time.trim();
    time.substring(0, 19).toCharArray(time_value, 20);
    struct tm *timeinfo = localtime(&now);
    aktuelleMinute = timeinfo-> tm_min;
    aktuelleStunde = timeinfo-> tm_hour;
    Serial.print("Uhrzeit: ");
    Serial.println(time_value);
    abfrageZeitTemperatur = millis();
  }

Wieviele Ausgaben "got response" bekommst Du?
Wenn es mehr als 1 ist, musst Du das anders lösen.
Und hier:

ist die Reihenfolge falsch.
Erst den letzten Wert auslesen, dann die neue Werteermittlung auslösen.

Wenn man jeden Teil in eigene Funktionen packt, kann man das besser händeln und mit der Ausgabe auf dem SerMon drauf reagieren, wenn sich z.B. der Wert tatsächlich geändert hat.

Und hier:

      bot.sendChatAction(chat_id, "typing");
      delay(1000);
      String stringtemp = "Pooltemp: ";
.....
    if (text == "/HeizungAus")
    {
      bot.sendChatAction(chat_id, "typing");
      delay(1000);
      heizungPool = HIGH;
      bot.sendMessage(chat_id, "Heizung ausgeschaltet");
    }

Das sind 3 x 1 Sekunde ...

got response bekomme ich nur wenn ich per Telegram eine Nachricht an den ESP schreibe und auch nur dann sind die Delays mit drin (Könnte ich auch raus machen haben nur den Sinn das im Telegram oben kurz typing... erscheint). Hat mit dem eigentlichen Ablauf ja nichts zu tun.

Der Spaghetti Sketch würde ja auch gehen wenn ich die Temperatur Fühler Daten richtig übertragen könnte. Wieder ne Stunde dran gesessen und klappt nicht :joy:

Dann muss mal etwas länger drauf geschaut werden.
Aber das kann ich nicht kurzfristig leisten.
Vielleicht mal zwischendurch, wenn mir der Schädel nicht so qualmt vom Rest der sich hier noch als unfertig rumtreibt....

Update: Habs jetzt hinbekommen. Vielen Dank nochmal an alle für die Hilfe. Werde das jetzt mal so laufen lassen und nach und nach verändern das ich vielleicht wieder einen ESP nehmen kann. So kann ich wenigstens schon mal baden gehen :+1:

Alter Post vor dem Update:

Vielen Dank für die Mühe :grimacing:

Jetzt bin ich soweit das ich das empfangene (;21;40;27.84;-127.00;-127.00;
) mit diesem Code aufteile und im Seriellen Monitor richtig angezeigt wird. Wie bekomme ich jetzt die Werte statt auf den Monitor in variable b,c,d,e,f

#include <stdio.h>
#include <string.h>

const byte numChars = 32;
char receivedChars[numChars];

boolean newData = false;


int aktuelleStunde;
int aktuelleMinute;
float tempPool;
float tempNachHeizung;
float tempAusen;
float b, c, d, e, f, g, h;


void setup() {
    Serial.begin(9600);
    Serial.println("<Arduino is ready>");
}

void loop() {

    recvWithStartEndMarkers();
    showNewData();
}

void recvWithStartEndMarkers() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = 'A';
    char endMarker = 'X';
    char rc;
 
 // if (Serial.available() > 0) {
    while (Serial.available() > 0 && newData == false) {
        rc = Serial.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
}

void showNewData() {
    if (newData == true) {
        Serial.print("This just in ... ");
        Serial.println(receivedChars);
        newData = false;


char *token;
char *mystring = receivedChars;
const char *delimiter =";";

   token = strtok(mystring, delimiter);

   while (token != NULL) {
      Serial.println(token);
      token=strtok(NULL, delimiter);
}
}
}

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