- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 48

Thema: NodeMCU UDP Paket senden + deepsleep

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2013
    Beiträge
    19
    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 18:32 Uhr)

  2. #2
    HaWe
    Gast
    brauchst du notwendigerweise deepsleep?
    Ich nutze auch für html webserver inzwischen nur noch delay() in der loop()

  3. #3
    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. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    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 20:40 Uhr)

  5. #5
    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 21:55 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.645
    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 08:01 Uhr)

  7. #7
    HaWe
    Gast
    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.

Ähnliche Themen

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

Stichworte

Berechtigungen

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

12V Akku bauen