- 3D-Druck Einstieg und Tipps         
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
    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
  •  

12V Akku bauen