- Akku Tests und Balkonkraftwerk Speicher         
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
    Das mit dem LAN hatten wir ja gemeinsam durch probiert. Daran lag es scheinbar nicht. Neu verbinden muss er sich jetzt auch.


    Zitat Zitat von Moppi
    Also meine Erfahrungen mit UDP waren jedenfalls durchweg positiv
    Dann schreib doch bitte mal ein Scetch indem ein einziges UDP-Paket einen String übermittelt und sich dann der ESP eine Minute schlafen legt. Wie gesagt, eigentlich kein Hexenwerk...

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich redete von LAN. Habe mal mit Java auf nem Server einen Chat für Browser gebaut, dort habe ich wegen der Einfachheit UDP verwendet. Nicht nur, dass sich das einfach implementieren lies (wie ich fand) es funktionierte dort auch einwandfrei.

    Ich hätte das auch mit dem nodeMCU probiert, aber meine Pläne hatten sich zerschlagen. Ich hatte das nodeMCU schon rausgekramt, Maß genommen (Gehäuse) und wollte loslegen. Dann sah ich, dass nur ein Analogeingang da sein soll. Ich dachte an Multiplexen des Aanlog-Eingangs am nodeMCU, mir ist aber keine brauchbare Lösung eingefallen, so dass ich wieder beim ATmega328 hängen geblieben bin. Sonst hätte ich mich schon hier gemeldet, hätte das dann wahrscheinlich auch per UDP versucht.

    Ich schaue mal was, hatten wir hier nicht so einige Links von Beispielcodes?

    MfG

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich habe es jetzt mal ausprobiert.

    Ich habe dabei auf eine Netzwerkadresse direkt gesendet xxx.xxx.x.1 und auf Broadcast xxx.xxx.x.255. Als Testtool habe ich Packet Sender installiert. UDP-Adresse 58817.
    Beim Deep Sleep habe ich einen Wert von 128 eingesetzt. Das sind Abstände von ca. 6 Sekunden in denen er schläft, aufwacht (Reset) und Paket sendet.
    Die Pause vor einem Deep Sleep habe ich mit "delay(5000)" gemacht.

    Jedes Paket kommt an.

    Das Versenden der Pakete dauert durchaus, mit Anmelden am Netzwerk, ein paar Sekunden. Geht das nodeMCU zu schnell in Deep Sleep, wird kein Paket versendet.

    Ich habe auch ein nodeMCU, das rumspinnt, weil es ständig Ausnahmefehler produziert und also immer neu startet. Ich habe dann ein anderes nodeMCU genommen, gleiche Sorte (hatte 5 bestellt), das funktioniert scheints einwandfrei.

    Jedenfalls, bei diesem ersten Test jetzt kann ich nicht erkennen, dass nichts ankommt, das Gegenteil ist der Fall.

    Ich habe die FritzBox Cable 6360.

    Ich habe die Sleep-Zeit auf ca. 1min verlängert:

    Klicke auf die Grafik für eine größere Ansicht

Name:	auszug.jpg
Hits:	3
Größe:	25,3 KB
ID:	33925


    Ich sehe, ob alle Pakete ankommen, weil ich immer nur ein Paket verschicke. Nicht mit mehreren Versuchen (zig Pakete bis eins ankommt).


    MfG

    PS:

    Code:
    #include <ESP8266WiFi.h>
    #include <WiFiUDP.h>
    #define PORT 50000 //ab 50000 ist mir sicherer, habe ich irgendwann mal ausspioniert, untenrum muss man bei Portnummern ggf. mit Kollisionen anderer Programme rechnen
    WiFiUDP udpServer;
    
    
    const char* ssid = "xxxxxxx"; //SSID WLAN Netz
    const char* password = "xxxxxxxxxxxxxxxxxxxxxxx"; //Passwort des WLAN Netzes
    const char* ziel = "192.168.0.255"; //Empfänger Broadcast-Adresse xxx.xxx.x.255 !
    
    
    void setup() {
     Serial.begin(115200);
     delay(10);
    
    
     Serial.println();
     Serial.println();
     Serial.print("Verbinde mich mit Netz: ");
     Serial.println(ssid);
     
     WiFi.begin(ssid, password);
     WiFi.config(IPAddress(192,168,0,xx), IPAddress(192,168,0,x), IPAddress(255,255,255,0), IPAddress(192,168,0,x)); 
    //richtige Konfiguration - 192,168,0,x : IP-Adresse der FritzBox
    //und 192,168,0,xx : IP-Adresse dieses nodeMCU
    //255,255,255,0 : Subnetzmaske
     
     while (WiFi.status() != WL_CONNECTED) {
     delay(500);
     Serial.print(".");
     }
    
    
     Serial.println("");
     Serial.println("WiFi Verbindung aufgebaut"); 
     Serial.print("Eigene IP des ESP-Modul: ");
     Serial.println(WiFi.localIP());
    
    
         // UDP Server starten
        udpServer.begin(PORT);
    
    
     delay(500);
    
    
            if(udpServer.beginPacket(ziel, 58817)==1)Serial.println("beginPacket - ok");  //Zielport muss natürlich stimmen, nicht irgendwo hin schicken - ziel ist hier Broadcast-Addresse (s.o.)
                                                                                                                      //Port: >50000
            udpServer.write("Hallo"); 
            udpServer.endPacket();
    
    
    
    
    
    
    }
    
    
    void loop() {
      delay(5000); //extremst wichtig - UDP-Paket muss erst sicher versendet sein!
      ESP.deepSleep(60*1000000);
    }
    Geändert von Moppi (08.01.2019 um 13:54 Uhr)

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2013
    Beiträge
    19
    Hallo Moppi,

    recht herzlichen Dank das du dir die Mühe gemacht hast!!!
    Ich werde in einer ruhigen Minute deinen Scetch ausprobieren. Bis auf die enormen delays erst einmal kein großer Unterschied meine ich. Das die Wartezeiten eingehalten werden müssen wusste ich ja, aber soo lange ist mir neu. Ich bin gespannt ob mein ESP deinen Code frisst und endlich das macht was er soll

    Zum Thema MQTT kann ich dennoch sagen, dass es vom Handling auch echt super funktioniert.

    Gruß d2x

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Das delay() ist so lang, weil ich sehen wollte, ob es überhaupt funktioniert. Wäre auch erstaunlich, wenn jedes Paket so viel Zeit braucht. Habe nur gesehen, dass es nicht ankommt, wenn man nicht wartet. Immerhin wird jedes mal eine Netzwerkverbindung hergestellt, vielleicht dauert auch das nur einmal so lange und Verschicken geht schneller. Jedenfalls kommt ohne das delay() nix an.

    Nun müsstest Du aber analysieren können, warum es bei Dir nicht funktioniert hat.

    Ansonsten bin ich so vorgegangen, wie wir vorher schon besprochen hatten, bzw. wie meine Vorschläge waren. Zuerst Fragmente aus dem Internet zusammengesucht und Eigene verwendet, bis es funktionierte. Dann mit dem Hardwarereset-Taster am Modul geschaut, ob es nach dem Starten jedes mal funktioniert. Dann den Sleep eingebaut, dann das delay(). Habs dann noch ein wenig aufgeräumt, damit man durchblickt. War auch noch eine Empfangsroutine drin, die hat auch funktioniert, aber das war ja nun für das Beispiel nicht notwendig.

    Interessant ist jetzt natürlich, wo bei Dir das Problem lag.

    MfG
    Geändert von Moppi (08.01.2019 um 22:36 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Ich habe mir den Code jetzt mal angeschaut, was Du anders gemacht hast:

    WiFi.mode (WIFI_STA);

    verwende ich nicht, sollte aber kein Problem sein.

    Die Konfiguration hast Du rausgenommen:

    //WiFi.config (IPlocal, IPdns, IPgateway, IPsubnetmask);

    Also benutzt Du DHCP...
    Frage wäre, ob die FritzBox (die hattest Du doch auch) im Minutentakt neue IP-Adressen für eine MAC-Adresse vergibt. Und wenn, ob dadurch evtl. Schwierigkeiten entstehen.
    Der Aufruf der Funktion oben unterscheidet sich außerdem, ich verwende die so:

    WiFi.config (IPlocal, IPdns, IPsubnetmask, IPgateway);

    Das Senden von Daten läuft dann offenbar identisch, so wie ich es auch mache.

    Zum Schluss aber tust Du dann noch das alles:

    udp.stop();
    WiFi.disconnect();
    WiFi.mode(WIFI_OFF);

    Wobei ich nicht denken würde, dass letzteres ein Problem darstellen würde. Allerdings brichst Du damit alles ab und u.U. bevor das Paket richtig verschickt wurde. Ich habe davor keine Pause gefunden.

    Du tust zwar dieses:

    if(sendingStat = 1) {
    Serial.println("UDP Packet successful send");
    }
    else {
    Serial.println("UDP Packet not send");
    }

    Allerdings wartest Du nicht, bis das Paket verschickt wurde und brichst dann also direkt die Verbindung ab.
    Außerdem ist ein Syntaxfehler enthalten:

    if(sendingStat = 1){..}

    Fällt was auf?

    So wäre richtig:

    if(sendingStat == 1){..}

    Zu allem Überfluss, verwendest Du dann auch noch:

    sendingStat == udp.endPacket();

    Außerhalb einer Bedingungsprüfung, einfach so im Code.
    Dieser Ausdruck erfüllt nicht seinen Zweck, udp.endPacket() wird nicht ausgeführt - tippe ich mal.
    richtig wäre:


    sendingStat = udp.endPacket();


    Das Problem an der Sache ist, dass Du mit so einem Programmierstil nicht weit kommst. Copy und Paste mag funktionieren, aber nicht immer. Man kann nicht jeden Ausdruck in einem Code irgendwo raus nehmen und an anderer Stelle wieder einsetzen. Man muss die Sprachsyntax beachten. Deshalb ist ganz wichtig, wenn etwas nicht funktioniert, zunächst nach solchen Fehlern zu schauen. Erst wenn ich sicher wäre, dass der Code syntaktisch richtig und frei von Schreibfehlern ist, würde ich den anderen Leuten zur Prüfung überlassen. Mir fällt das dann auch nur auf, wenn ich mich intensiv damit beschäftige, nicht unbedingt, wenn ich drüber lese. Sonst wäre mir das schon früher aufgefallen.

    Ich habe mal geschaut, da kann man Sachen gut in deutscher Sprache finden:

    Tutorial Arduino Operatoren


    Als Experiment, der allererste Code, so weit von den vorher angesprochenen Fehlern bereinigt. Da ich DHT.h nicht habe, konnte ich das jetzt nicht kompilieren:


    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 
    const int SendePause = 2500;        //Pause nach Senden - kann verkürzt werden, bis es nicht mehr funktioniert
    
    
    //Init DHT-Sensor
    DHT dht(DHTPIN, DHTTYPE);
    //set IPs
    IPAddress IPudp (192, 168, 10, 255);        //Broadcastadresse (die Art des Broadcast bestimmt die Verteilung des gesendeten Pakets)
    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;            //an diesem UDP-Port muss der Empfänger immer lauschen
    
    
    char ssid[] = ("Hier steht die SSID");
    char passphrase[] = ("hier ist das Passwort");
    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, IPsubnetmask, IPgateway);
      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);
    }
    
    
    
    
    void loop() {
    
    
      Serial.printf("Now listening at IP %s, UDP port %d\n\n", WiFi.localIP().toString().c_str(), receiveUdpPort);
    
    
      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);
      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();
      delay(SendePause);
    
    
      yield();
      if(sendingStat == 1) {
        Serial.println("UDP Packet successful send");
      }
      else {
        Serial.println("UDP Packet not send");
      }
      Serial.println("Wait..");
      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);
      WiFi.disconnect();
      delay(500);
      Serial.println("ESP goes to deepsleep");
      ESP.deepSleep(60*1000000);
      }
    }


    MfG
    Geändert von Moppi (10.01.2019 um 12:39 Uhr)

Ä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
  •  

Solar Speicher und Akkus Tests