- LiTime Speicher und Akkus         
Ergebnis 1 bis 10 von 11

Thema: NodeMCU V3 als Server stürzt nach ein paar Minuten ab.

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    NodeMCU V3 als Server stürzt nach ein paar Minuten ab.

    Moin,
    ich arbeite nun schon seit längerem an einer recht einfach gehaltenen Datenübertragung. In der Summe nutze ich sechs Komponenten:
    • Vier Clients (Wemos D1 Mini)
    • Ein Server (NodeMCU V3)
    • Ein WLAN Router (Fritzbox)


    Gewünschte Funktion:
    Die Clients senden zu verschiedenen Zeitpunkten je eine Zahl, welche einen von zwei Status repräsentiert. Abhängig von der Zahl, wird eine LED (über einen Transistor) über den NodeMCU angesteuert. Der Staus bleibt erhalten (die LED leuchtet), bis eine andere Zahl übertragen wird und ein anderer Status eintritt. Nachdem ein Client eine Zahl übertragen hat, geht selbiger in den DeepSleep (10 Sekunden), um anschließend wieder eine Zahl zu senden.

    Was passiert:
    Am Anfang klappt alles super. Clients und Server verbinden sich mit der Fritzbox, und ich kann über die Clients munter die LEDs welche an dem NodeMCU angeschlossen sind steuern. Nach ein paar Minuten friert der NodeMCU dann ein, während die Clients motiviert weiter arbeiten. Ich bin mir recht sicher das dass Problem beim Server liegt.

    Was ich bislang versucht habe:
    • Stromversorgung getauscht, von 5V, 2A Handy Netzteil auf Laptop und zurück.
    • Ping Befehl an die Fritzbox (gegenwärtig nicht im Programm).
    • "delay(500);" Befehl aus der "Verbinden mit Netzwerk Schleife" im Setup gelöscht (was verhindert hat das dass Programm startet).


    Ich bin nun leider mit meinem Latein am Ende. Wäre super wenn mal jemand drüber schauen könnte. Entsprechend meiner bescheidenen Erfahrung ist das Programm sehr einfach und übersichtlich geschrieben.

    Vielen Dank,
    Philippp

    Code:
    /*  
    Lazy gardener V1 - Server
    
    Der Server zeigt über die angeschlossenen LEDs an, wie der Status der Beete, 
    des Wassertankes und des Netzwerkes ist.
     */
    
    #include <SPI.h>
    #include <ESP8266WiFi.h>
    
    /* Im folgenden werden die Ausgänge für die LEDs definiert. 
    Die Pinnummern unterscheiden sich von den Bezeichnungen auf dem Board*/
    
    #define led_Tomaten_rot 16       //LED für Tomaten rot
    #define led_Tomaten_gruen 5      //LED für Tomaten grün
    
    #define led_Kraeuter_rot 4        //LED für Kraeuter rot
    #define led_Kraeuter_gruen 0      //LED für Kraeuter grün
    
    #define led_WIFI_rot 14       //LED für WIFI rot
    #define led_WIFI_gruen 2      //LED für WIFI grün
    
    #define led_Blumen_rot 12       //LED für Blumen rot
    #define led_Blumen_gruen 13     //LED für Blumen grün
    
    #define led_Wassertank_rot 15       //LED für Wassertank rot
    #define led_Wassertank_gruen 3      //LED für Wassertank grün
    /************************************************************************/
    
    /* Im folgenden werden Netzwerkdaten definiert. DIese Daten müssen dem 
    Netzwerk entsprechend angepasst werden*/
    
    char ssid[] = "Netzwerk";           // Name des Netzwerkes
    char pass[] = "Passwort";     // Passwort des Netzwerkes
    WiFiServer server(80);  
                     
    /****************************************************************************/
    
    /*Alle Anweisungen der Funktion setup() werden nur einmal am Start des Programs 
    ausgeführt*/
    
    void setup() {
      Serial.begin(115200);                    // Startet die Serielle Schnittstelle
      WiFi.begin(ssid, pass);                  // Baut eine Verbindung zum W-LAN Router auf.
      
      pinMode(led_Tomaten_rot, OUTPUT);        // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
      pinMode(led_Tomaten_gruen, OUTPUT);      // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.
      pinMode(led_Kraeuter_rot, OUTPUT);       // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
      pinMode(led_Kraeuter_gruen , OUTPUT);    // LED zeigt an das Wasser vorhanden ist.  LED wird als Ausgang definiert.       
      pinMode(led_WIFI_rot, OUTPUT);           // LED zeigt an das keine Verbindung zum W-LAN besteht. LED wird als Ausgang definiert.
      pinMode(led_WIFI_gruen, OUTPUT);         // LED zeigt an das eine Verbindung zum W-LAN besteht. LED wird als Ausgang definiert.
      pinMode(led_Blumen_rot, OUTPUT);         // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
      pinMode(led_Blumen_gruen, OUTPUT);       // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.
      pinMode(led_Wassertank_rot, OUTPUT);     // LED zeigt an das Wasser knapp ist. LED wird als Ausgang definiert.
      pinMode(led_Wassertank_gruen, OUTPUT);   // LED zeigt an das Wasser vorhanden ist. LED wird als Ausgang definiert.  
    
    //Da die folgeden PINS beim booten HIGH sind, werden selbige hier zur Sicherheit noch einmal auf LOW gesetzt
      digitalWrite(led_Tomaten_rot, LOW);
      digitalWrite(led_WIFI_gruen, LOW);  
      digitalWrite(led_Wassertank_gruen, LOW);  
    
      
      while (WiFi.status() != WL_CONNECTED)   // Schleife läuft so lange, bis eine Verbindung zum W-LAN aufgebaut ist.
        {
          Serial.print(".");
          digitalWrite(led_WIFI_rot, HIGH);   //Zeigt an das keine Netzwerkverbindung besteht
          delay(500);
          }
     
      server.begin();                         // Startet die Serverfunktion
      Serial.println(" ");
      Serial.println("Connected to wifi");
      Serial.print("IP: ");     Serial.println(WiFi.localIP());         // Zeigt die IP an
      Serial.print("Subnet: "); Serial.println(WiFi.subnetMask());      // Zeigt die Subnet Mask an
      Serial.print("Gateway: "); Serial.println(WiFi.gatewayIP());      // Zeigt die Gateway Adresse an
      Serial.print("SSID: "); Serial.println(WiFi.SSID());              // Zeigt den Netzwerknamen an
      Serial.print("Signal: "); Serial.println(WiFi.RSSI());            // Signalstärke in dBm
    }
    
    
    void loop () {
      //Folgende Abfrage klärt ob noch immer eine Netzwerkverbindung besteht.
      if (WiFi.status() != WL_CONNECTED)
        {
          //Zeigt an das keine Netzwerkverbindung besteht.
          digitalWrite(led_WIFI_rot, HIGH);   
          digitalWrite(led_WIFI_gruen, LOW);
          digitalWrite(led_Tomaten_gruen, LOW);
          digitalWrite(led_Kraeuter_gruen, LOW);
          digitalWrite(led_Blumen_gruen, LOW);
          digitalWrite(led_Wassertank_gruen, LOW);
          digitalWrite(led_Tomaten_rot, LOW);
          digitalWrite(led_Kraeuter_rot, LOW);
          digitalWrite(led_Blumen_rot, LOW);
          digitalWrite(led_Wassertank_rot, LOW); 
          } 
          
       else {
          //Zeigt an das eine Netzwerkverbindung aufgebaut wurde.
          digitalWrite(led_WIFI_rot, LOW);   
          digitalWrite(led_WIFI_gruen, HIGH);
            }
           
      int a = -1;                                // speichert Übergabe des Clients
      WiFiClient client = server.available();
      if (client) {
        if (client.connected()) {
          Serial.println(".");
    
         while(a == -1) //Schleife läuft so lange bis ein passendes Ergebnis übertragen wird.
               { 
                a = client.read();                      // Liest die Übergabe des Clients
               }
          
          Serial.println("Kontrollwert: ");             // Gibt gelesenen Wert zur Kontrolle aus 
          Serial.print(a);                              // Gibt gelesenen Wert zur Kontrolle aus 
          
          switch(a)                                     // Mehrfachauswahl Anfang
          {
           case 0:                                       //Tomaten hat genug Wasser
           digitalWrite(led_Tomaten_rot, LOW);         
           digitalWrite(led_Tomaten_gruen, HIGH);
           break;
    
           case 1:                                      //Tomaten müssen bewaessert werden
           digitalWrite(led_Tomaten_rot, HIGH);        
           digitalWrite(led_Tomaten_gruen, LOW);
           break;
    
           case 2:                                     //Kraeuter hat genug Wasser
           digitalWrite(led_Kraeuter_rot, LOW);       
           digitalWrite(led_Kraeuter_gruen, HIGH);
           break;  
    
           case 3:                                     //Kraeuter muss bewaessert werden
           digitalWrite(led_Kraeuter_rot, HIGH);        
           digitalWrite(led_Kraeuter_gruen, LOW);
           break;  
    
            case 4:                                    //Blumen hat genug Wasser
           digitalWrite(led_Blumen_rot, LOW);         
           digitalWrite(led_Blumen_gruen, HIGH);
           break;
    
           case 5:                                    //Blumen muss bewaessert werden
           digitalWrite(led_Blumen_rot, HIGH);        
           digitalWrite(led_Blumen_rot, LOW);
           break;
    
            case 6:                                   //Wassertank hat genug Wasser
           digitalWrite(led_Wassertank_rot, LOW);         
           digitalWrite(led_Wassertank_gruen, HIGH);
           break;
    
           case 7:                                    //Wassertank muss nachgefuellt werden
           digitalWrite(led_Wassertank_rot, HIGH);        
           digitalWrite(led_Wassertank_rot, LOW);
           break;
           }// Mehrfachauswahl Ende
        }
        client.stop();                // Beendet die Verbindung mit dem Client
      }
    }

  2. #2
    HaWe
    Gast
    hallo,
    deine Abfrage in der loop() ist etwas anders gestrickt als wie ich es kenne:
    Code:
      WiFiClient client = wifiserver.available();
    
      while ( client.connected() ) {
         if ( client.available() )   {
             char c = client.read();
             //...
             //... z.B. switch-Abfrage
             //...
             client.stop();
         }
         //...
         delay(1);
      }
    Bin aber auch kein Fachmann, vlt hilft es aber trotzdem

    - - - Aktualisiert - - -

    PS,
    ich mache aber nur die Koomunikation mit websites über die wifiserver/client libs,
    die Kommunikation mit mehreren ESP-Clients mache ich über die webserver lib.

  3. #3
    Danke,
    werde ich mal ausprobieren. Wofür ist das delay von einer ms am Ende?
    LG,
    Philippp

  4. #4
    HaWe
    Gast
    Zitat Zitat von Philippp Beitrag anzeigen
    Wofür ist das delay von einer ms am Ende?
    kA, ob das nötig ist, stand bei mir so im example-Code.

  5. #5
    Also ich habe ein delay(10) an das Ende des Programmes gesetzt. Seit dem hatte ich nur noch einen Absturz, und das nachdem das Programm schon lange lief. Das ist zwar noch immer einer zuviel, aber um Welten besser als das was ich vorher hatte. Ein ehemaliger Kollege von mir meinte das er in so ziemlich jede Schleife ein kleines delay() reinschreibt, weil sich die Chips sonst "tot rechnen". Werde ich mir wohl auch angewöhnen.
    Als nächstes werde ich mir mal die Stromversorgung anschauen. Ich wollte die ganze Geschichte eigentlich mit USB 3.0 versorgen. Das müsste locker ausreichen. Frage ist nur wie sauber die Spannung ist. Ich habe mal gelesen das ESP8266 Chips da sehr empfindlich sind...
    LG,

    Philippp

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Philippp Beitrag anzeigen
    Ein ehemaliger Kollege von mir meinte das er in so ziemlich jede Schleife ein kleines delay() reinschreibt, weil sich die Chips sonst "tot rechnen".
    Selten einen größeren Blödsinn gelesen.

    Ich habe mal gelesen das ESP8266 Chips da sehr empfindlich sind...
    Was man im Internet so alles lesen kann. Der Chip braucht bis zu 380mA, das liefert jeder USB Anschluß selbst mit einem Linearregler für die 3,3V. Praktische Erfahrungen zeigen, daß der Chip auch noch mit rund 2,5V arbeitet. Das führt dann leicht zu der Annahme, daß die Versorgung ok ist, obwohl sie in Wirklichkeit zu schwach ist.

    Übliche Probleme sind, daß der ESP an den internen 3,3V Regler eines USB-Chips angeschlossen wird. Die können typisch weniger als 100mA (Data Sheet not read Error). Bei einem großen Stützkondensator reichts dann manchmal gerade so, da die knapp 400mA nur kurz beim Senden gebraucht werde. Dafür verlangsamt dieser Kondensator die Anschaltflanke so stark, daß der ESP keinen sauberen Power-On Reset mehr bekommt und damit ab und an mal nicht anläuft. Sporadische Abstürze sind da aber nicht zu erwarten. Ich verwende 3-Bein Schaltregler von z.B. Recom. Mit der 500mA Variante laufen bei mit alle ESP zuverlässig.

    Abstürze nach einigen Minuten Laufzeit haben typisch 2 Gründe: Temperatur oder Speicherüberlauf. Wäre es Temperatur, würde die Zeit bei schnell aufeinanderfolgenden Tests immer kürzer werden.

    Für mich klingt das Problem nach einem Speicherüberlauf. Bei TCP Verbindungen ist es ein häufig auftretendes Problem, daß Verbindungen nicht sauber geschlossen werden und offen bleiben, obwohl die Übertragung eigentlich beendet ist. Die Verbindung belegt dabei Buffer und Kontrollstrukturen. Am Ende beendet dann eine Timer im TCP-Stack die ganze Sache und gibt den Speicher wieder frei. Da auf einem PC Gigabytes Speicher zur Verfügung stehen, fällt das selten auf und solche fehlerhaften Programme haben ein langes Leben. Auf einem System mit wenig Speicher wird das dann ein Problem. IMHO kann der TCP-Stack des ESP maximal 4 Verbindungen gleichzeitig, mehr Speicher steht nicht zur Verfügung.

    Also ich habe ein delay(10)...
    Ich werte das als Bestätigung für meine Vermutung. Das delay() ermöglicht (meistens) dem Timer im TCP-Stack die Verbindung zu schließen. Das ist natürlich keine Lösung des wirklichen Problems.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. nodeMCU zu nodeMCU: keine Kommunikations-Verbindung mehr nach wenigen Minuten
    Von HaWe im Forum NodeMCU-Board und ESP8266, ESP32-Serie
    Antworten: 0
    Letzter Beitrag: 02.10.2017, 15:01
  2. Airbus E-Fan 2.0: In 38 Minuten nach Calais
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 06.07.2015, 18:10
  3. TWI Stürzt nach kurzer Zeit ab :(
    Von ChRiZ im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 29.01.2008, 09:35
  4. Matlab 7.1 Studentenversion stürzt nach 3 Sekunden ab...
    Von RoboLeo im Forum Software, Algorithmen und KI
    Antworten: 6
    Letzter Beitrag: 11.11.2007, 15:23
  5. Nach ca 15 Minuten etwas auslösen, ohne Timer zu benutzen?
    Von x8r im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 21.03.2007, 17:36

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus