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
Lesezeichen