Probleme mit dem Auslesen der seriellen Schnittstelle beim ESP8266

Hallo,

ich bin gerade dabei ein Projekt umzusetzen bei welchem der ESP8266 mir vom Arduino fertig in Json formatierte Strings auf der Seriellen Schnittstelle bereit stellt.
Der Anfangsstring im ESP wird auch noch richtig angezeigt, jedoch kann ich keine neuen Strings über das Terminal schicken.
Woran kann das liegen?
Ich komme zur Zeit echt nicht mehr weiter.

Mit freundlichen Grüßen
Chris

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>

#define SSID      "*"
#define PASSWD    "*"
#define HOSTNAME  "solar"

char messwerte[47] = R"DATA({"kessel": 75, "kollektor": 110,"pumpe": 55})DATA";
int i = 0;

ESP8266WebServer server ( 80 );

const String Index = R"DATA(
            <!DOCTYPE HTML>
            <html>
              <head>
                <meta charset="utf-8"/>
                <meta name="viewport" content="width=device-width, initial-scale=1.0">
                ESP8266 Solarsteuerung
              </head>
              <body>
                <h1>
                   Zustand Solaranlage
                </h1>
                <p>
                  Kesseltemperatur: <span id="kessel">??</span> °C
                </p>
                <p>
                  Kollektortemperatur: <span id="kollektor">??</span> °C
                </p>
                <p>
                  Pumpendrehzahl: <span id="pumpe">??</span> %
                </p>
                <script type="application/javascript">
    
                  var xmlhttp = new XMLHttpRequest();
                  var url = "/index.json";

                  function updateStart() {
                    xmlhttp.onreadystatechange = function() {
                      if (this.readyState == 4) {
                        if(this.status == 200) {
                          try {
                            var data = JSON.parse(this.responseText);
                            updateView(data);
                          } catch (e) {
                            console.log("Update failed: " + e);
                            console.log(this.responseText);
                          }
                        }

                        window.setTimeout(updateStart, 500);
                      }
                    };
                    xmlhttp.open("GET", url, true);
                    xmlhttp.send();
                  }

                  function updateView(data) {
                    document.getElementById("kessel").innerHTML = data.kessel;
                    document.getElementById("kollektor").innerHTML = data.kollektor;
                    document.getElementById("pumpe").innerHTML = data.pumpe;
                  }

                  updateStart();
                </script>
              </body>   
              </html>
              )DATA";

void httpIndex() {
  server.send(200, "text/html", Index);
}

void httpIndexJson() {
  String output = messwerte;
  server.send(200, "application/json", output);
}

void setup() {
  // put your setup code here, to run once:
  WiFi.mode(WIFI_STA);
  WiFi.hostname(HOSTNAME);
  WiFi.begin(SSID,PASSWD);

  MDNS.begin(HOSTNAME);

  server.on("/", httpIndex);
  server.on("/index.json", httpIndexJson);
  server.begin();
  Serial.println ( "HTTP server started" );
  


}

void loop() {
  // put your main code here, to run repeatedly:
  MDNS.update();

  server.handleClient();

  while (Serial.available() >0 && i<47) {
    messwerte[i] = Serial.read();
    i++;
  }
  i = 0;
}

Serial ist sehr langsam und Du kannst nicht davon aus gehen, dass Deine 46 Zeichen schon da sind.
Außerdem vermisse ich ein Serial.begin(...) im setup.

Gruß Tommy

Ach du Schande bin ich doof, da hab ich den Wald vor lauter bäumen nicht gesehen

Tommy56:
Serial ist sehr langsam und Du kannst nicht davon aus gehen, dass Deine 46 Zeichen schon da sind.
Außerdem vermisse ich ein Serial.begin(...) im setup.

Gruß Tommy

Wie würdest du das Problem denn lösen?
Nachdem ich die serielle Schnittstelle auch geöffnet habe kommt wenigstens etwas an aber er scheint es nicht richtig verarbeiten zu können, die Ausgabe auf der Webpage ändert sich dann in "??"

Gruß Chris

Ich weiß nicht, was Du da an Daten hast. Evtl. könnte man am Ende einen Zeilenvorschub senden und den auswerten. Lass erst mal die Webseite weg und gib das Ergebnis nur im seriellen Monitor aus.

Gruß Tommy

Die Daten kommen in folgendem Format vom Arduino {“kessel”:[Wert],“Kollektor”:[Wert],“Pumpe”:[Wert]}
und sollen einfach nur als CharArray/String abgespeichert werden damit ich die Daten direkt mit Javascript auslesen kann und den String nicht noch zerhackstückeln muss.

Mein Problem ist dass ich nicht darauf komme wie ich anständig ein Zeilenende auswerten könnte
oder Meinst du das funktioniert:

while (Serial.available() >0 && Messwerte[i] != "/n") {
    messwerte[i] = Serial.read();
    i++;
  }
  i = 0;

Wenn die vom Arduino kommen, warum willst Du die dann von Serial einlesen?
Irgendwie verstehe ich Dein Konstrukt noch nicht.

Gruß Tommy

Zum Serial Einlesen, lies bitte mal hier: https://forum.arduino.cc/index.php?topic=401210.0

Wie weit sind UNO und ESP auseinander (cm?)
Warum brauchst du den UNO, warum kann der ESP nicht die Daten ermitteln?

--> eine Komponente weniger =>> mindestens ein Problem weniger!

noiasca:
Zum Serial Einlesen, lies bitte mal hier: https://forum.arduino.cc/index.php?topic=401210.0

Wie weit sind UNO und ESP auseinander (cm?)
Warum brauchst du den UNO, warum kann der ESP nicht die Daten ermitteln?

--> eine Komponente weniger =>> mindestens ein Problem weniger!

Das ganze sollte ursprünglich nur auf dem Uno laufen auf dem die Steuerung jetzt schon läuft,
da ich Temperaturen mit Pt500 messe und die Messschaltung auf 5V berechnet ist möchte ich jetzt nicht alles neu aufbauen und auf 3,3V berechnen.
Darum kam ich auf die Idee ein ESP8266-01 den ich hier noch rumliegen habe zu nutzen um die Daten übers W-Lan abfragen zu können und nicht jedes mal in den Keller laufen zu müssen.

Ok, dann mache am Ende auf dem Arduino ein Serial.println und lies in ein char-Array ein.
Ein Beispiel ist hier mit drin.

Gruß Tommy

Die Variablen-Namen

  • Messwerte
    und
    - messwerte
    passen so?

Tommy56:
Ok, dann mache am Ende auf dem Arduino ein Serial.println und lies in ein char-Array ein.
Ein Beispiel ist hier mit drin.

Gruß Tommy

Super, danke mit dem Codebeispiel hat es jetzt funktioniert, habe auf der seriellen Schnittstelle gesehen, dass er den String immer nur abschnittsweise eingelesen hatte, dank Erkennung des Terminators funktioniert jetzt alles.

Jetzt muss ich nurnoch mDNS ans laufen bekommen, aber das ist eine andere Geschichte

Wofür mDNS? Das wird nicht von allen externen Geräten unterstützt.

Gruß Tommy

Ein Zeichen braucht 1 / Baudrate * 10 Sekunden. Die Baudrate sind die Zustandswechsel pro Sekunde und du hast 10 Bits pro Zeichen. Für den Controller ist das eine Ewigkeit.
Wenn man also in loop() nicht künstlich zeit verschwendet oder in anderen Funktionen hängt liest man nur ein Zeichen pro Durchlauf ein.