-         
Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 48

Thema: NodeMCU UDP Paket senden + deepsleep

  1. #21
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2013
    Beiträge
    19
    Anzeige

    Du kannst natürlich mit dem nodeMCU die Pakete auch an jeden Rechner einzeln schicken. Wenn das besser funktioniert. Oder Du schickst jedes Paket 3mal, damit es min. einmal ankommt, bis das Problem gefunden ist.
    An Broadcast wollte ich eigentlich senden, falls der Server mal die IP ändern sollte.

    oder solange wiederholt senden, bis alle ein ack zurückgesendet haben
    Zurücksenden wollte ich eigentlich nicht. Zumindest war das bisher nicht geplant. Aus übungstechnischer Sicht wäre das allerdings eine Maßnahme. Es ist auch nur ein Empfänger.

    Das ist das Problem. netcat spielt nicht gut mit UDP-Boadcasts. Mit "socat" klappt das besser.
    Ich konnte bisher keine Mängel bei netcat feststellen. Die Anzeige ist identisch mit Wireshark gewesen. Ich werde es mir dennoch mal ansehen.

    Aktueller Stand:
    Ohne deepSleep kommen die Pakete zuverlässig an. Mit deepSleep kommen sie an, wenn sie gerade mal Lust haben.
    Geändert von d2x (16.11.2018 um 19:32 Uhr)

  2. #22
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    3.787
    brauchst du notwendigerweise deepsleep?
    Ich nutze auch für html webserver inzwischen nur noch delay() in der loop()
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  3. #23
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2013
    Beiträge
    19
    Ich möchte einige Sensoren mit Batterien versorgen (Sensor heißt NodeMCU + DHT22 o.ä.) . Daher benötige ich einen Aufbau der wenig Energie benötigt. Ich schalte sogar den DHT22 erst kurz vor dem Auslesen ein und anschließend wieder aus.

  4. #24
    Erfahrener Benutzer Roboter Experte Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    646
    Blog-Einträge
    5
    Kannst Du den Code noch mal posten, den du aktuell verwendest, so wie er funktioniert, dass alle Pakete ankommen und so, wie er nicht funktioniert?

    Wenn Du schreibst Deep Sleep, dann ist WiFi = Off, System Clock = Off und CPU = Off.
    Zumindest von dem WiFi-Modul habe ich schon gelesen, dass es einige Zeit benötigt, bis es quasi wieder richtig funktioniert.

    Irgendwo steht doch in Deinem Code: WiFi.begin ...
    Schreib vor diesem Befehl mal versuchsweise: WiFi.forceSleepWake();


    MfG
    Geändert von Moppi (16.11.2018 um 21:40 Uhr)

  5. #25
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2013
    Beiträge
    19
    https://github.com/esp8266/Arduino/issues/3481

    Kommt mir sehr bekannt vor! Ich sende auch nur ein einziges Paket!

    Hier der Code der funktioniert:
    Code:
    #include <ESP8266WiFi.h>          //ESP8266 Core WiFi Library (you most likely already have this in your sketch)
    #include <WiFiUdp.h>
    #include <DHT.h>
    
    #define DHTPIN 0             
    #define DHTTYPE DHT22 
    
    //Init DHT-Sensor
    DHT dht(DHTPIN, DHTTYPE);
    //set IPs
    IPAddress IPudp (192, 168, 10, 68);
    IPAddress IPlocal (192, 168, 10, 201);
    IPAddress IPdns (192, 168, 10, 1);
    IPAddress IPgateway (192, 168, 10, 1);
    IPAddress IPsubnetmask (255, 255, 255, 0);
    
    //*******DeviceID-config************************
    char UnitID[] = "id_1";
    //******************************************
    unsigned int receiveUdpPort = 5006;
    unsigned int sendUdpPort = 5005;
    
    char ssid[] = ("xxx");
    char passphrase[] = ("xxx");
    char charTemp[10];
    char charHum[10];
    int sendingStat;
    
    
    WiFiUDP udp;
    
    
    void setup() { 
      Serial.begin(115200);
      delay(1000);
      Serial.println("\n\nSerial connection started");
      
    
      WiFi.mode (WIFI_STA);
      //WiFi.config (IPlocal, IPdns, IPgateway, IPsubnetmask);
      WiFi.begin(ssid, passphrase);
      while (WiFi.status() != WL_CONNECTED) 
      {
        delay(500);
        Serial.print(".");
        Serial.print(WiFi.status());
      }
      WiFi.printDiag(Serial);
      Serial.print(WiFi.status());
    
      pinMode(12, OUTPUT);
      Serial.printf("Now listening at IP %s, UDP port %d\n\n", WiFi.localIP().toString().c_str(), receiveUdpPort);
      delay(5000);  
    
    }
    
    
    void loop() {
    
      digitalWrite(12, HIGH);
      delay(3500);
      float hum = dht.readHumidity();
      float temp = dht.readTemperature();
      digitalWrite(12, LOW);
      dtostrf(temp,5,2,charTemp); 
      dtostrf(hum,5,2,charHum);
      delay(1000);
      if (isnan(hum) || isnan(temp)) {
        Serial.println("Sensorfehler!");
        udp.beginPacket(IPudp,sendUdpPort);
        udp.write(UnitID);
        udp.write(" Sensorfehler\n");
        udp.endPacket();
      } 
      else {
      long rssi = WiFi.RSSI(); 
      Serial.println("Sending Sensordata");
      if (!udp.begin(receiveUdpPort)) {
       Serial.println("UDP Socketerror");
      }
      Serial.printf("Now sending UDP on port %d \n", sendUdpPort);
      
      udp.beginPacket(IPudp,sendUdpPort);
      udp.write(UnitID);
      udp.write(" ");
      udp.write(charTemp);
      udp.write(" ");
      udp.write(charHum);
      udp.write(" ");
      udp.write(rssi);
      sendingStat == udp.endPacket();
    
      yield();
      if(sendingStat = 1) {
        Serial.println("UDP Packet successful send");
      }
      else {
        Serial.println("UDP Packet not send");
      }
      Serial.println("Wait 0,5s..");
      delay(500);
      Serial.print("   UDP Destination IP: :");
      Serial.println(IPudp);
      Serial.print("   UDP Port: ");
      Serial.println(sendUdpPort);
      Serial.print("   Device ID: ");
      Serial.println(UnitID);
      Serial.print("   Temperatur: ");
      Serial.println(charTemp);
      Serial.print("   Relative Luftfeuchte: ");
      Serial.println(charHum);
      Serial.print("   Daempfung: ");
      Serial.println(rssi);
      //udp.stop();
      //WiFi.disconnect();
      //WiFi.mode(WIFI_OFF);
      Serial.println("wait 5,5s");
      delay(5500);
      //Serial.println("ESP goes to deepsleep 60s");
      //ESP.deepSleep(60e6);
      delay(100);
      }
    
    }
    Und dieser funktioniert nicht zuverlässig. Die Pakete kommen zwischen ca. 10s - 500s an (Unterschied nur in den letzten, nicht mehr auskommentierten Zeilen):
    Code:
    #include <ESP8266WiFi.h>          //ESP8266 Core WiFi Library (you most likely already have this in your sketch)
    #include <WiFiUdp.h>
    #include <DHT.h>
    
    #define DHTPIN 0             
    #define DHTTYPE DHT22 
    
    //Init DHT-Sensor
    DHT dht(DHTPIN, DHTTYPE);
    //set IPs
    IPAddress IPudp (192, 168, 10, 68);
    IPAddress IPlocal (192, 168, 10, 201);
    IPAddress IPdns (192, 168, 10, 1);
    IPAddress IPgateway (192, 168, 10, 1);
    IPAddress IPsubnetmask (255, 255, 255, 0);
    
    //*******DeviceID-config************************
    char UnitID[] = "id_1";
    //******************************************
    unsigned int receiveUdpPort = 5006;
    unsigned int sendUdpPort = 5005;
    
    char ssid[] = ("XXX");
    char passphrase[] = ("XXX");
    char charTemp[10];
    char charHum[10];
    int sendingStat;
    
    
    WiFiUDP udp;
    
    
    void setup() { 
      Serial.begin(115200);
      delay(1000);
      Serial.println("\n\nSerial connection started");
      
    
      WiFi.mode (WIFI_STA);
      //WiFi.config (IPlocal, IPdns, IPgateway, IPsubnetmask);
      WiFi.begin(ssid, passphrase);
      while (WiFi.status() != WL_CONNECTED) 
      {
        delay(500);
        Serial.print(".");
        Serial.print(WiFi.status());
      }
      WiFi.printDiag(Serial);
      Serial.print(WiFi.status());
    
      pinMode(12, OUTPUT);
      Serial.printf("Now listening at IP %s, UDP port %d\n\n", WiFi.localIP().toString().c_str(), receiveUdpPort);
      delay(5000);  
    
    }
    
    
    void loop() {
    
      digitalWrite(12, HIGH);
      delay(3500);
      float hum = dht.readHumidity();
      float temp = dht.readTemperature();
      digitalWrite(12, LOW);
      dtostrf(temp,5,2,charTemp); 
      dtostrf(hum,5,2,charHum);
      delay(1000);
      if (isnan(hum) || isnan(temp)) {
        Serial.println("Sensorfehler!");
        udp.beginPacket(IPudp,sendUdpPort);
        udp.write(UnitID);
        udp.write(" Sensorfehler\n");
        udp.endPacket();
      } 
      else {
      long rssi = WiFi.RSSI(); 
      Serial.println("Sending Sensordata");
      if (!udp.begin(receiveUdpPort)) {
       Serial.println("UDP Socketerror");
      }
      Serial.printf("Now sending UDP on port %d \n", sendUdpPort);
      
      udp.beginPacket(IPudp,sendUdpPort);
      udp.write(UnitID);
      udp.write(" ");
      udp.write(charTemp);
      udp.write(" ");
      udp.write(charHum);
      udp.write(" ");
      udp.write(rssi);
      sendingStat == udp.endPacket();
    
      yield();
      if(sendingStat = 1) {
        Serial.println("UDP Packet successful send");
      }
      else {
        Serial.println("UDP Packet not send");
      }
      Serial.println("Wait 0,5s..");
      delay(500);
      Serial.print("   UDP Destination IP: :");
      Serial.println(IPudp);
      Serial.print("   UDP Port: ");
      Serial.println(sendUdpPort);
      Serial.print("   Device ID: ");
      Serial.println(UnitID);
      Serial.print("   Temperatur: ");
      Serial.println(charTemp);
      Serial.print("   Relative Luftfeuchte: ");
      Serial.println(charHum);
      Serial.print("   Daempfung: ");
      Serial.println(rssi);
      udp.stop();
      WiFi.disconnect();
      WiFi.mode(WIFI_OFF);
      Serial.println("wait 5,5s");
      delay(5500);
      Serial.println("ESP goes to deepsleep 60s");
      ESP.deepSleep(60e6);
      delay(100);
      }
    
    }
    Geändert von d2x (16.11.2018 um 22:55 Uhr)

  6. #26
    Erfahrener Benutzer Roboter Experte Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    646
    Blog-Einträge
    5
    Irgendwo steht doch in Deinem Code: WiFi.begin ...
    Schreib vor diesem Befehl mal versuchsweise: WiFi.forceSleepWake();
    Und wie ist das Ergebnis damit?

    Und nochmal eine andere blöde Frage von mir, weil ich das mit dem nodeMCU noch nicht ausprobiert habe.
    Und zwar: Wenn er aus dem Schlafmodus zurückkehrt, wo läuft das Programm weiter? - Startet der Kontroller komplett neu oder macht er in Loop weiter? Mich irritiert, dass zwar Sachen ausgeschaltet werden, die für die Kommunikation benötigt werden, aber in Loop nicht wieder eingeschaltet werden.


    Ich habe das Problem auch noch anderweitig im Netz gefunden, aber ich denke, das muss abzustellen sein. Es sei denn, das WiFi-Modul wäre defekt oder so, aber das ist es nicht, also muss es eine Lösung geben. Wer baut bitte einen Sleep-Mode ins nodeMCU ein, wenn hinterher das integrierte WiFi nicht mehr richtig funktioniert ...

    Nachtrag: Habs schon gefunden: der ESP startet neu, nach Deep Sleep

    60e6 = 24806 Millisekunden oder wieviel ist das in Sekunden? - 60 sec

    Die serielle Kommunikation (Serial...) bitte mal raus nehmen, die brauchst Du später sowieso nicht. Beschränke mal auf das, was das nodeMCU später tun soll. Nämlich Datenerfassung und per WiFI und UDP verschicken.

    Nachtrag:

    Und zum Schluss vorerst eine andere Vorgehensweise:
    Wenn das nodeMCU startet, sende mal bitte ein Paket an das nodeMCU selber (und nur dieses) und warte bis das angekommen ist. Eigentlich müsste das nodeMCU die Pakete, die per Broadcast gesendet werden, auch wieder empfangen können. Daher würde ich ein Paket mit dem nodeMCU verschicken und prüfen, ob das beim nodeMCU auch an kommt. Wenn nicht, würde ich das Paket nochmal senden und warten ob es dann ankommt. Die Alternative ist eben, das erste "Verfikations"-Paket nur an das nodeMCU zu schicken, dass es auch verschickt. Wenn das erfolgreich war, würde ich schauen, ob danach jedes weitere UDP-Paket im Netzwerk ankommt, das verschickt wird.

    Im Netz werden unterschiedliche Probleme mit dem Deep Sleep beschrieben und jeder hat andere Erfahrungen damit.


    MfG
    Geändert von Moppi (17.11.2018 um 09:01 Uhr)

  7. #27
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    3.787
    Zitat Zitat von Moppi Beitrag anzeigen
    Und nochmal eine andere blöde Frage von mir, weil ich das mit dem nodeMCU noch nicht ausprobiert habe.
    Und zwar: Wenn er aus dem Schlafmodus zurückkehrt, wo läuft das Programm weiter? - Startet der Kontroller komplett neu oder macht er in Loop weiter?
    MfG
    er startet dann komplett neu, inkl. setup().

    Der DHT11 ist übrigens auch extrem zickig, er braucht oft bis zu 2sec, bis er nach mehrmaligem Versuch überhaupt Daten liefert, davor ist alles ungültig. Viel bessere Ergebnisse habe ich mit BME280 und BMP280 per i2c.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  8. #28
    Erfahrener Benutzer Roboter Experte Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    646
    Blog-Einträge
    5
    Schön und optimal ist das sicher alles nicht.

    Einer schrieb irgendwo, dass er eben WiFi.forceSleepWake(); VOR WiFi.begin(); eingesetzt hat und es dann funktionierte. Andere stellen fest, dass das nodeMCU erst, nachdem es einmal Daten empfangen hat, Daten sicher verschickt. Obwohl das irgendwie alles nicht richtig ist, finde ich. Praktisch startet das nodeMCU neu mit allem drum und dran - hoffentlich. Dann muss es sich ordentlich und sicher am Netzwerk angemeldet haben und dann sollte man auch Daten verschicken können, ohne dass etwas verloren geht. Wenn das nodeMCU aus einer Batterie versorgt wird, kann es an der Spannungsquelle auch nicht liegen, so wie dann wieder auf einer andern Seite geschrieben wird. Wobei es so sein soll, dass das nodeMCU beim Starten mehr Strom benötigen soll (oder so ähnlich), so dass die Spannungsquelle hier mitspielen muss, dass es nicht zu diffusen Fehlern kommt.

    MfG

  9. #29
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beiträge
    3.787
    ich würde dazu raten, das Problem ganz neu im ESP8266 Forum als issue zu melden - und vorher sicherheitshalber auch auf IDE 1.8.6, den neuesten esp core 2.4.2 und auch die neueste esp8266WiFi lib etc. abzudaten, denn es werden die issues nur bei den jeweils neuesten Versionen von den Entwicklern bearbeitet.

    Es wird dort auch immer ein minimalistischer lauffähiger Test-Sketch verlangt, den würde ich in jedem Falle mit konstanten oder überprüfbaren randomisierten Werten OHNE DHT11 schreiben.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  10. #30
    Erfahrener Benutzer Roboter Experte Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    646
    Blog-Einträge
    5
    Bitte diese Seite mal durchlesen, das Beispiel scheint auch zu funktionieren und Hinweise zu Problemen gibts auch.

    https://www.arduino-hausautomation.d...im-tiefschlaf/

    MfG
    Moppi

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Ähnliche Themen

  1. Welches Paket für "Atom" installieren?
    Von RoboTrader im Forum Arduino -Plattform
    Antworten: 9
    Letzter Beitrag: 18.11.2017, 14:30
  2. 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
  3. Deepsleep oder Sleep
    Von hubert_K im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 02.09.2010, 13:32
  4. 1 Befehl für ein Paket von Befehlen?
    Von stani im Forum AVR Hardwarethemen
    Antworten: 12
    Letzter Beitrag: 10.10.2009, 12:42
  5. Keine RP6-CD im paket
    Von WarChild im Forum Robby RP6
    Antworten: 10
    Letzter Beitrag: 17.04.2009, 19:48

Stichworte

Berechtigungen

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