INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP8266 Webserver nach Zeit nicht mehr verfügbar.
11.01.2021, 17:25 (Dieser Beitrag wurde zuletzt bearbeitet: 11.01.2021 17:31 von ESPWolf.)
Beitrag #1
ESP8266 Webserver nach Zeit nicht mehr verfügbar.
Hallo Techniker- & ProgrammiererInnen!

Vorab zu meiner Geschichte / meinem Vorhaben:
Als eher Neuanfänger würde ich Eure Hilfe und guten Ideen gerne auffassen und dazulernen.

Umsetzten würde ich gerne einen Web Service mittels Hardware ESP8266 01-s ,
eine entsprechende Beschaltung mittels Relais sowie eine einfache Webseite.
Jene konnte ich mir aus dem im Netz befindlichen Snippets bereits zusammentragen.

Der folgende Code ( wie unschön jener auch geschrieben sein mag ) läuft soweit auf folgender Hardware:
  • ESP 8266 01-s
  • Node MCU Development Board

Zum Problem / Phänomen:
Der WebService läuft, der Programmcode tut soweit das was er soll. Leider ist der Webserver nach einiger Zeit, +- 30 Stunden Laufzeit nicht mehr erreichbar. Nach einem Reboot des WLAN - Routers melden sich beide Testumgebungen wieder normal die vorhin genannte Zeitspanne / Dauer lang.

Beide Hardwareumgebungen verlieren scheinbar nicht die Verbindung zum Router. Eine Antwort mittels Response auf die PING- Anfrage ( auch wenn der WebServer nicht mehr erreichbar ist ) ist gegeben.

Folgendes habe ich mit selbigem Ergebnis bereits versucht:
.) Routermodell, WLAN SSID sowie den WLAN- Kanal geändert
.) Update der Beiden ESP - Modelle auf die letzte Version [ NONOS_SDK-version_3.0.4 ]

Was ich feststellen konnte ist, dass sich nach dem Firmware - Update die Verfügbarkeit des WebServer verbessert hat, jener auch bei beiden Hardwarekomponenten nach einiger "undefinierter" Zeit wieder zurück ins Leben finden, ohne die Schaltung oder den Router von der Spannungsversorgung trennen zu müssen.


Hier mein Code zum gegebenen Thema:

Code:
// Load Wi-Fi library
#include <ESP8266WiFi.h>

// Replace with your network credentials
const char* ssid = "Kabellos";
const char* password = "Cablefree";

// Set web server port number to 80
WiFiServer server(80);

// Variable to store the HTTP request
String header;

// Auxiliar variables to store the current output state
String output0State = "off";
String output1State = "off";

// Assign output variables to GPIO pins

const int output0 = 0;
const int output1 = 2;

unsigned long pMillis = 0;
unsigned long cMillis = 0;
unsigned long pMillis1 = 0;
unsigned long cMillis1 = 0;
// Pause time 15 sec.
const long interval = 1500000;



void setup() {
  Serial.begin(115200);
  // Initialize the output variables as outputs
  pinMode(output0, OUTPUT);
  pinMode(output1, OUTPUT);

  // Set outputs to LOW
  digitalWrite(output0, LOW);
  digitalWrite(output1, LOW);

  // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
}
// Keep GPIO high while interval is not used up
void Relais0Off() {
  if (output0State == "on") {
    if ( cMillis <= interval )
    {
      cMillis ++;
    }
    else {
      digitalWrite(output0, LOW);
      output0State = "off";
      cMillis = 0;
    }

  }

}
// Keep GPIO high while interval is not used up
void Relais1Off() {
  if (output1State == "on") {

    if ( cMillis1 <= interval )
    {
      cMillis1 ++;
    }
    else {
      digitalWrite(output1, LOW);
      output1State = "off";
      cMillis1 = 0;
    }

  }

}

void loop() {
  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi not connected \n reboot");
    ESP.restart();
  }
  WiFiClient client = server.available();   // Listen for incoming clients
  if (client) {                             // If a new client connects,
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        header += c;
        if (c == '\n') {                    // if the byte is a newline character
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            // dXNlcjohRG9vcjIxIQ== = 'user:entrancepassword' (user:pass) base64 encode
            // Finding the right credential string, then loads web page
            if (header.indexOf("dXNlcjplbnRyYW5jZXBhc3N3b3Jk") >= 0 ) {
              client.println("HTTP/1.1 200 OK");
              client.println("Content-type:text/html");
              client.println("Connection: close");
              client.println();

              // turns the GPIOs on and off
              if (header.indexOf("GET /0/on") >= 0) {
                Serial.println("GPIO 0 on");
                output0State = "on";
                digitalWrite(output0, HIGH);
              }
              else if (header.indexOf("GET /0/off") >= 0) {
                Serial.println("GPIO 0 off");
                output0State = "off";
                digitalWrite(output0, LOW);
              }
              else if (header.indexOf("GET /1/on") >= 0) {
                Serial.println("GPIO 1 on");
                output1State = "on";
                digitalWrite(output1, HIGH);

              } else if (header.indexOf("GET /1/off") >= 0) {
                Serial.println("GPIO 1 off");
                output1State = "off";
                digitalWrite(output1, LOW);
              }

              // Display the HTML web page
              client.println("<!DOCTYPE html><html>");
              client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
              client.println("<head><meta http-equiv=\"refresh\" content=\"5; url=../\" />");
              client.println("<link rel=\"icon\" href=\"data:,\">");
              // CSS to style the on/off buttons
              client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
              client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;");
              client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
              client.println(".button2 {background-color: #77878A;}</style></head>");

              // Web Page Heading
              client.println("<body><h1>Relais- Beschaltung </h1>");
              // Display current state, and ON/OFF buttons for GPIO 0
              client.println("<p>Relais 1" + output0State + "</p>");
              // If the output0State is off, it displays the ON button
              if (output0State == "off") {
                client.println("<p><a href=\"/0/on\"><button class=\"button\">START</button></a></p>");
              } else {
                client.println("<p><a href=\"/0/off\"><button class=\"button button2\">STOP</button></a></p>");
              }

              // Display current state, and ON/OFF buttons for GPIO 1
              client.println("<p>Relais 2" + output1State + "</p>");
              // If the output0State is off, it displays the ON button
              if (output1State == "off") {
                client.println("<p><a href=\"/1/on\"><button class=\"button\">START</button></a></p>");
              } else {
                client.println("<p><a href=\"/1/off\"><button class=\"button button2\">STOP</button></a></p>");
              }
              client.println("</body></html>");

              // The HTTP response ends with another blank line
              client.println();
              // Break out of the while loop
              break;
            }
            else {
              client.println("HTTP/1.1 401 Unauthorized");
              client.println("WWW-Authenticate: Basic realm=\"Secure\"");
              client.println("Content-Type: text/html");
              client.println();
              client.println("<html>Authentication failed</html>");
              break;
            }
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
          }

        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
      Relais0Off();
      Relais1Off();
    }
    // Clear the header variable
    header = "";
    // Close the connection
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
  Relais0Off();
  Relais1Off();
}

Wo sind denn hier die Fehler versteckt...
Danke vorab für Eure Zeit und Hilfe!

Gruß aus Niederösterreich!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2021, 17:38
Beitrag #2
RE: ESP8266 Webserver nach Zeit nicht mehr verfügbar.
Welche Relais verwendest Du (Link bitte).

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2021, 17:48
Beitrag #3
RE: ESP8266 Webserver nach Zeit nicht mehr verfügbar.
Und der von dir festgestellte Fehler tritt auf beiden Controllern auf ?

Was soll das Relais machen ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2021, 18:09
Beitrag #4
RE: ESP8266 Webserver nach Zeit nicht mehr verfügbar.
(11.01.2021 17:38)Tommy56 schrieb:  Welche Relais verwendest Du (Link bitte).

Gruß Tommy

Hallo Tommy56!

Folgendes Relais wird verwendet:
Link: https://cdn-reichelt.de/documents/datenb...NBLATT.pdf

Folgendes möchte ich noch erwähnen:
.) Das Phänomen mit dem nicht erreichbaren Webserver tritt ebenso auf, wenn keine Ausgänge an den GPIO`s angeschlossen sind sprich das Board / die Boards auf dem Steckbrett "standalone" ohne angeschlossene Komponenten betrieben werden.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2021, 18:17 (Dieser Beitrag wurde zuletzt bearbeitet: 11.01.2021 18:22 von ESPWolf.)
Beitrag #5
RE: ESP8266 Webserver nach Zeit nicht mehr verfügbar.
(11.01.2021 17:48)hotsystems schrieb:  Und der von dir festgestellte Fehler tritt auf beiden Controllern auf ?

Was soll das Relais machen ?

.) Derzeit befindet sich die Schaltung noch nicht im Echtbetrieb - Aufgrund der eher unzuverlässigen Erreichbarkeit des WebServers.

.) Umgesetzt werden soll eine Beschaltung eines Torantriebes. Mittels gepostetem Code und dem Relais soll ein Tastendruck auf einen Schalter simuliert werden.
Dies funktioniert auch Grundsätzlich soweit. Anbei noch ein Schaltungsentwurf mit bereits durchgeführter Umsetzung auf einer Lochrasterplatine.

.) Das Phänomen tritt bei beiden Boards
  • ESP8266 01-s
  • Node MCU Development Board
mit und ohne angeschlossenem Relais und davorliegender Schaltung auf.


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2021, 18:19 (Dieser Beitrag wurde zuletzt bearbeitet: 11.01.2021 18:19 von Tommy56.)
Beitrag #6
RE: ESP8266 Webserver nach Zeit nicht mehr verfügbar.
Das Datenblatt ist nichtssagend. Da kann man nicht erkennen, ob eine Freilaufdiode verbaut ist. Optokoppler scheint jedenfalls nicht da zu sein.

Die Fehler treten auch ohne Relais auf? Dann würde ich auf Speicherprobleme tippen, auch wenn die Fraktion "Das geht alles mit String beim ESP" dem widersprechen wird.

Versuche mal alle konstanten Texte mit dem F-Macro ins Progmem zu schieben, um den RAM zu entlasten.

Also z.B.:
Code:
// alt
Serial.print("Connecting to ");
client.println("HTTP/1.1 200 OK");
// neu
Serial.print(F("Connecting to "));
client.println(F("HTTP/1.1 200 OK"));

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2021, 18:20 (Dieser Beitrag wurde zuletzt bearbeitet: 11.01.2021 18:23 von hotsystems.)
Beitrag #7
RE: ESP8266 Webserver nach Zeit nicht mehr verfügbar.
(11.01.2021 18:09)ESPWolf schrieb:  Folgendes Relais wird verwendet:
Link: https://cdn-reichelt.de/documents/datenb...NBLATT.pdf

Folgendes möchte ich noch erwähnen:
.) Das Phänomen mit dem nicht erreichbaren Webserver tritt ebenso auf, wenn keine Ausgänge an den GPIO`s angeschlossen sind sprich das Board / die Boards auf dem Steckbrett "standalone" ohne angeschlossene Komponenten betrieben werden.

Auch wenn es nicht die direkte Ursache für dein Problem ist, sehe ich aber ein Problem mit dem Relais. Das ist für 5Volt und damit nicht für 3,3V geeignet.
Ist auf dem Relais ein Transistor zur Ansteuerung verbaut ?

Edit:
Ok, dein letzter Post beantwortet diese Frage.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.01.2021, 18:24
Beitrag #8
RE: ESP8266 Webserver nach Zeit nicht mehr verfügbar.
(11.01.2021 18:19)Tommy56 schrieb:  Das Datenblatt ist nichtssagend. Da kann man nicht erkennen, ob eine Freilaufdiode verbaut ist. Optokoppler scheint jedenfalls nicht da zu sein.

Die Fehler treten auch ohne Relais auf? Dann würde ich auf Speicherprobleme tippen, auch wenn die Fraktion "Das geht alles mit String beim ESP" dem widersprechen wird.

Versuche mal alle konstanten Texte mit dem F-Macro ins Progmem zu schieben, um den RAM zu entlasten.

Also z.B.:
Code:
// alt
Serial.print("Connecting to ");
client.println("HTTP/1.1 200 OK");
// neu
Serial.print(F("Connecting to "));
client.println(F("HTTP/1.1 200 OK"));

Gruß Tommy

Hallo Tommy Tommy56!

Danke für die schnelle Antwort!
Ich versuche dies baldmöglichst umzusetzen und melde mich hierzu nach einem Test dessen rück!

Gruß,
Wolf
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP8266 SPIFF Daten schreiben und zeilenweise lesen? foto2004 10 252 15.04.2021 14:26
Letzter Beitrag: hotsystems
  gaaaanz einfacher Webserver wonk 17 817 12.04.2021 20:07
Letzter Beitrag: rev.antun
  ESP8266 OTA - ich bin am Ende meiner Ideen miq19 11 715 02.04.2021 10:13
Letzter Beitrag: Tommy56
  NTP-Zeit 16 Stunden daneben miq19 48 2.011 29.03.2021 16:12
Letzter Beitrag: miq19
  Webserver: Dateneingabe UND Datenausgabe wmauss 2 310 26.03.2021 20:19
Letzter Beitrag: wmauss
  Libraries für ESP8266 wonk 9 840 24.03.2021 20:18
Letzter Beitrag: wonk
  vom MEGA zum ESP8266 uk1408 24 2.025 19.03.2021 13:56
Letzter Beitrag: hotsystems
  ESP8266 Zeit vom NTP Server verändert sich Kupferwurm 18 1.873 11.03.2021 11:03
Letzter Beitrag: Tommy56
  ESP8266 NTP fadeValue bob 2 498 10.03.2021 18:29
Letzter Beitrag: Tommy56
  HTML-Ausgabe von ESP8266 D1 Mini + DHT 11 Temperatursensor auf Webseite Bobo83600 3 696 10.03.2021 09:42
Letzter Beitrag: Bobo83600

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste