INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
NodeMCU12E mit UDP Client & UDP Server & Webserver
17.10.2017, 20:19 (Dieser Beitrag wurde zuletzt bearbeitet: 17.10.2017 20:22 von rkuehle.)
Beitrag #1
NodeMCU12E mit UDP Client & UDP Server & Webserver
Hallo Forum,
ich war lange nicht hier, bin dem Arduino und Verwandten aber treu geblieben ;-)
Inzwischen habe ich mich ein wenig mit dem NodeMCU beschäftigt und gleich schon mal ein Projekt angefangen. Dazu mal ein paar Infos und mein Problem dabei.
Ziel:
Eine NodeMCU spielt Sensor, misst Temperatur und Luftfeuchte und überträgt die Daten per UDP an eine andere NodeMCU.
Die andere NodeMCU speilt "Aktor", hat einen UDP Server am laufen zum Empfang der Sensordaten und vergleicht die empfangenen Werte mit selbst gemessenen Werten, zeigt dann beide Wertepaare auf einem I2C 16x2 Display an.
Weiterhin hat der Aktor einen Webserver am laufen, den man zu diesen Informationen abfragen kann.
Um zu wissen ob der Sensor noch läuft soll jeweils auch der Zeitpunkt des Eintreffens der UDP Pakete vom Sensor festgehalten werden. Dafür läuft auf dem Aktor ein NTP Client.
Sachstand:
IDE ist die 1.6.12 auf Win7 / 64 Bit mit allen Aktualisierungen.
Der Aktor misst seine eigenen Werte. Der UDP Server auf dem Aktor läuft, reagiert aktuell aber auf jedes eingehende UDP Paket. Getestet habe ich das mit dem Programm UdpClientServer von hier. Der Webserver läuft ebenfalls.
Problem:
Das Problem ist aktuell der NTPClient. Für den benutze ich die NTPClient Lib.
Ich weiß nicht warum, aber lasse ich alle Komponenten im Code aktiv, bekomme ich nicht die vom NTP Server geholte Zeit, sondern die NodeMCU - Laufzeit. Nehme ich mir das Basic Example der Lib gibt er mir die vom NTP Server geholte Zeit zurück.
Bitte:
Da ich mir sicher bin, dass der Fehler bei mir liegt, ich irgend etwas nicht beachtet habe, hier die Bitte mal über den Code zu gucken und, wenn möglich, auch zu testen. Dazu der Code anbei und die benutzten Libs (außer den Standards) als Anhang.
Vielleicht kann jemand das Problem lokalisieren!? Infos / Hinweise sind wie immer sehr willkommen.
Vorab sage ich schon einmal DANKE!
Beste Grüße Ricardo
Der Hauptsketch:
Code:
#include <NTPClient.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <DHT.h>
#include <Wire.h>                   // I2C für LCD
#include <LiquidCrystal_I2C.h>      // LCD an I2C -> nutzt intern die Wire Lib
#include "settings.h"
float dht1_t, dht1_h;
String zeit;

void setup()
{
  start_lcd();
  start_wifi();
  timeClient.begin();
  udpserver.begin(UDP_PORT);
  webserver.begin();
  pinMode(DHT1_PIN, INPUT_PULLUP);
  dht1.begin();
  do_mess();
}
void loop()
{
  timeClient.update();
  zeit = timeClient.getFormattedTime();
  yield();
  run_udpserver();
  yield();
  run_webserver();
  yield();
}
Die Tools:
Code:
void start_lcd()
{
  lcd.begin(LCD_COL, LCD_ROW);
  lcd.init();
  lcd.backlight();
  lcd.noBlink();
  lcd.clear();
  lcd.home();
}
void write_to_lcd()
{
  lcd.print(F("L:"));
  lcd.print((int)dht1_t);
  lcd.print(P(le));
  lcd.print((int)dht1_h);
  lcd.print(P(le));
  lcd.print(zeit);
  lcd.home();
}

void run_udpserver()
{
  char incomingPacket[50];
  int packetSize = udpserver.parsePacket();
  if (packetSize)
  {
    int len = udpserver.read(incomingPacket, 50);
    if (len > 0) incomingPacket[len] = 0;
    // Das sind die empfangenen Werte Serial.println(incomingPacket);
    // send back a reply, to the IP address and port we got the packet from
    udpserver.beginPacket(udpserver.remoteIP(), udpserver.remotePort());
    udpserver.write(replyPacekt);
    udpserver.endPacket();
    do_mess();
    write_to_lcd();
  }
}
void run_webserver()
{
  char c;
  WiFiClient client = webserver.available();
  if (client)
  {
    boolean blank_line = true;
    while (client.connected())
    {
      if (client.available())
      {
        c = client.read();
        client.println(P(h1));
        client.println(P(h2));
        client.print(P(h3));
        client.print(MY_HOSTNAME);
        client.print(P(le));
        client.print(zeit);
        client.println(P(h4));
        client.println((int)dht1_t);
        client.println(P(h5));
        client.println((int)dht1_h);
        client.println(P(h6));
        client.println(P(h7));
        break;
      }
      if (c == '\n') blank_line = true;
      else if (c != '\r') blank_line = false;
    }
  }
  delay(1);
  client.stop();
}
Die settings.h
Code:
// Textmakros
#define P(x) (__FlashStringHelper*)(x)
const char le[] PROGMEM = {" "};
const char dp[] PROGMEM = {":"};
// WLAN
const char * MY_SSID = "<SSID>";                // WLAN-SSID
const char * MY_PWD = "<PWD>";                // WLAN-Passwort
#define WLAN_EST_TIME 200                        // Router brauchen etwa 200 ms um WLAN Verbindung aufzubauen
// IP
const char * MY_HOSTNAME = "Aktor";                     // Hostname der NodeMCU
const uint16_t ipa[] = {192, 168, 178, 222};              // IP - Adresse der NodeMCU
const uint16_t gwa[] = {192, 168, 178, 1};               // Gateway
const uint16_t nm[] = {255, 255, 255, 0};                 // Netzmaske
const uint16_t dnsa[] = {192, 168, 178, 1};
// UDP
#define UDP_PORT 8888                                     // UDP Port
const char * replyPacekt = "Erhalten!";                   // a reply string to send back
WiFiUDP udpserver;
// Webserver
const char h1[] PROGMEM = {"<!DOCTYPE HTML>"};
const char h2[] PROGMEM = {"<html>"};
const char h3[] PROGMEM = {"<head></head><body><h1>"};
const char h4[] PROGMEM = {"</h1><h3>Temperatur: "};
const char h5[] PROGMEM = {"&deg;C</h3><h3>Luftfeuchte: "};
const char h6[] PROGMEM = {"%</h3><h3>"};
const char h7[] PROGMEM = {"</body></html>"};
#define WWW_PORT 80
WiFiServer webserver(WWW_PORT);
// NTP client
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);
// DHT
#define DHT1_PIN 12                                       // DHT22 Datenkabel wird auf D6 des Boards angelegt
#define DHT_TYPE DHT22                                    // DHT - Typ
DHT dht1(DHT1_PIN, DHT_TYPE);                             // DHT1 aktivieren
// LCD
#define LCD_I2C 0x27                                      // I2C - Adresse des LCD. SCL auf D1, SDA auf D2 des Boards
#define LCD_COL 16
#define LCD_ROW 2
LiquidCrystal_I2C lcd(LCD_I2C, LCD_COL, LCD_ROW);


Angehängte Datei(en)
.zip  libraries.zip (Größe: 38,48 KB / Downloads: 53)

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 21:16 (Dieser Beitrag wurde zuletzt bearbeitet: 17.10.2017 21:19 von Tommy56.)
Beitrag #2
RE: NodeMCU12E mit UDP Client & UDP Server & Webserver
Der zersplitterte Code ist schwer lesbar aber der NTP-Client sollte eigentlich die richtige Zeit bringen.

Was mir aber auffällt, Du sendest an den HTTP-Client (Browser) nach jedem von ihm empfangenen Zeichen eine Menge Daten. Du empfängst aber im Normalfall eine Menge Zeichen vom Browser (die Dinger sind geschwätzig). Evtl. stopfst Du Dir damit das Netz zu.

Wäre es nicht sinnvoller, erst mal alle Daten vom Client zu lesen und dann eine Antwort zu schreiben? Du weist ja überhaupt nicht, was der Client von Dir will.

Einen Webserver auf dem ESP8266-12E kann man übersichtlicher bauen. Der hat gute Libs dazu. Webserver z.B. hier oder hier.

[OT] Dein Code für die direkte Anbindung an MySQL läuft prima, mit der aktuellen Lib auch auf dem NodeMCU. Vielen Dank dafür.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 21:36
Beitrag #3
RE: NodeMCU12E mit UDP Client & UDP Server & Webserver
Hallo Tommy,
Zitat:Was mir aber auffällt, Du sendest an den HTTP-Client (Browser) nach jedem von ihm empfangenen Zeichen eine Menge Daten. Du empfängst aber im Normalfall eine Menge Zeichen vom Browser (die Dinger sind geschwätzig). Evtl. stopfst Du Dir damit das Netz zu....
Da gebe ich dir völlig Recht. Eigentlich ist das ein "Schweinecode". Der sollte eigentlich nur zum Test dienen ob man überhaupt die einzelnen Funktionen zusammen laufen lassen kann. Der Hinweis von wegen Netz zumüllen ist daher sehr sinnvoll. Ich habe mich auch immer gewundert warum die Reaktionszeit auf den HTTP - Request so lang ist. Dürfte damit zusammenhängen. Vielleicht ist es ja auch die Ursache, dass der NTP Client dann nicht zum Zuge kommt. Ich werde mir mal deine Beispiele rein tun und den Code entsprechend umstellen.
Zitat:Der zersplitterte Code ist schwer lesbar
Ich hasse es wenn man alles in eine Datei schmeißt und dann ständig am Scrollen ist. Daher die Aufteilung. Ist wohl eine Gewohnheit die ich aus der LotusScript - Programmierung übernommen habe;-)
Danke bis hierhin für deine Hinweise.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 21:50
Beitrag #4
RE: NodeMCU12E mit UDP Client & UDP Server & Webserver
(17.10.2017 21:36)rkuehle schrieb:  Ich hasse es wenn man alles in eine Datei schmeißt und dann ständig am Scrollen ist. Daher die Aufteilung. Ist wohl eine Gewohnheit die ich aus der LotusScript - Programmierung übernommen habe;-)
Danke bis hierhin für deine Hinweise.
Grüße Ricardo
Das ist auch sinnvoll.
Aber die ganzen Instanzdeklarationen haben in einer settings.h nix verloren. Die gehören ins Hauptprogramm oder evtl. in eine globals.ino.
In settings.h suche ich Sachen, die individuell sind, wie SSID, Passwort, Ports usw.
Deswegen habe ich die Konstruktoren auch erst vermisst. Erst die Browsersuche hat sie gefunden.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.10.2017, 23:49
Beitrag #5
RE: NodeMCU12E mit UDP Client & UDP Server & Webserver
(17.10.2017 20:19)rkuehle schrieb:  void run_webserver()
{
char c;
WiFiClient client = webserver.available();
if (client)
{
boolean blank_line = true;
while (client.connected())
{
if (client.available())
{
c = client.read();
client.println(P(h1));
client.println(P(h2));
client.print(P(h3));
client.print(MY_HOSTNAME);
client.print(P(le));
client.print(zeit);
client.println(P(h4));
client.println((int)dht1_t);
client.println(P(h5));
client.println((int)dht1_h);
client.println(P(h6));
client.println(P(h7));
break;
}
if (c == '\n') blank_line = true;
else if (c != '\r') blank_line = false;
}
}
delay(1);
client.stop();
}
[/code]

Ich habe im Moment leider nicht die Zeit deinen Sketch richtig auszuprobiere.
Aber so scriptet mann heute keinen Webserver mehr.(für den ESP)
Schau dir ausser den von Tommy verlinkten auch die Beispiele zu den
Bibliotheken an.
Ich habe hier Sketche am laufen die machen Time Udp Webserver Temperatur Lcd Pushup Nachricht, sozusagen "gleichzeitig" ohne Probleme.

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.02.2019, 20:14
Beitrag #6
RE: NodeMCU12E mit UDP Client & UDP Server & Webserver
(17.10.2017 20:19)rkuehle schrieb:  Das Problem ist aktuell der NTPClient. Für den benutze ich die NTPClient Lib.
Ich weiß nicht warum, aber lasse ich alle Komponenten im Code aktiv, bekomme ich nicht die vom NTP Server geholte Zeit, sondern die NodeMCU - Laufzeit. Nehme ich mir das Basic Example der Lib gibt er mir die vom NTP Server geholte Zeit zurück.

Ist schon ein bisschen älter und doch unbeantwortet. Also, für den Fall dass nochmal jemand danach sucht ... Ich denke das Folgende beschreibt Problem und Lösung:

Ich hatte das gleiche seltsame Verhalten, hatte schonmal ein funktionierendes Beispiel und habe den Code in einen neuen Sketch übernommen. Doch da gab es plötzlich keine korrekte Uhrzeit vom NTPClient!

Nach etlichem Hin und Her fiel mir endlich der Unterschied auf: Dynamische IP (alter) vs. Statische IP (neuer Sketch)

Gibt aber eine Lösung damit NTPClient auch mit statischer IP funktioniert:
Zwingend die zwei DNS Parameter mit in die Wifi.config
Code:
WiFi.config(staticIP, gateway, subnet, dns1, dns2);

siehe auch https://github.com/arduino-libraries/NTP.../issues/58

Gruß,
Jens

Meine Bastel-Fortschritte zum Mitlesen
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.02.2019, 20:52 (Dieser Beitrag wurde zuletzt bearbeitet: 10.02.2019 20:54 von Tommy56.)
Beitrag #7
RE: NodeMCU12E mit UDP Client & UDP Server & Webserver
(10.02.2019 20:14)ansorgj schrieb:  
Code:
WiFi.config(staticIP, gateway, subnet, dns1, dns2);
Ein dns-Eintrag reicht auch. Wenn Dein Router abgeraucht ist, kannst Du meist auch keinen externen DNS erreichen.
Ich habe das bisher nie als Problem empfunden, da ich die 4 Einträge generell drin habe. So schnell wird man betriebsblind.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP8266 als SPIFFS/Webserver soll Daten verarbeiten TiRe 23 1.606 23.01.2019 08:03
Letzter Beitrag: Fips
  ESP als server zum daten empfangen Gandalf 29 2.227 19.01.2019 17:37
Letzter Beitrag: Gandalf
  [Info] HTTPS - Client-Verbindungen Tommy56 1 651 18.12.2018 16:56
Letzter Beitrag: Fips
  Via Webserver GPIO schalten arguido 1 1.319 05.05.2018 11:19
Letzter Beitrag: Tommy56
  Kein client.connected() durch direkte WiFi Verbindung zwei ESP8266MOD (Wemos D1 R1) n88 4 1.621 25.02.2018 14:57
Letzter Beitrag: n88
  Einfacher Webserver Nodemcu Esp8266 Onboard Led (Pin) schalten Fips 31 10.883 06.01.2018 20:41
Letzter Beitrag: Tommy56
  ESP8266 Server connect sowerum 9 4.164 30.12.2017 17:14
Letzter Beitrag: h0ffnung
Lightbulb Sonoff WiFi Wireless Switch per Webserver vom Tablet oder Smartphone aus schalten Fips 1 5.202 12.09.2017 20:45
Letzter Beitrag: Fips
  nodeMCU ESP 12E V3 - Frage zum Beispielsketch "Hello Server" Stargazer 2 1.850 13.08.2017 21:09
Letzter Beitrag: Stargazer
  [Vorstellung] ESP8266 Webserver mit AJAX Tommy56 19 8.626 03.07.2017 12:09
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste