Wemos MEGA Wifi R3 (ESP8266) NTP

Hallo,

ich habe soeben meine ersten Gehversuche mit dem “Wemos Mega Wifi R3” Board. Dies ist für alle die es noch nicht kennen ein Mega 2560 Nachbau mit integriertem ESP8266. klick

Mein Plan war damit meine bereits vorhandene Mega2560 “Alarm/Licht/Rollladen Steuerung” im Garten abzulösen. Diese bringt mir derzeit Alarmmeldungen per SMS. Um die Kosten zu senken dachte ich an Meldungen über WLAN als Email.
Der Anfang ist die Zeitsynchronisierung über NTP mit der Vorhandenen FritzBox. Aber da erhalte ich bereits Fehlermeldungen beim Überprüfen. Verwendet habe ich den Code NTP Klick. Nur den Mega Part abgeändert von Softwareserial zu Serial 3.
Der Teil des Megas lies sich auch Problemlos aufspielen: Den Softwareserial Part habe ich nur auskomentiert.

/********************
  - www.geekstips.com
  - Arduino Time Sync from NTP Server using ESP8266 WiFi module
 ********************/
//#include <SoftwareSerial.h>
#include <TimeLib.h>

// setup a commong baudrate for UNO and ESP
int baudRate = 115200;
char unixString[11];
long unixTime;
boolean dataSync = false;
// setup the ESP emulated serial channel
//SoftwareSerial esp8266(2, 3);

void setup() {
  Serial.begin(baudRate);
  //esp8266.begin(baudRate);
  Serial3.begin(baudRate);
}

void loop() {

  char buffer[40];
  int i = 0;

  // while the ESP output available, push it
  // into the buffer and set the flag true
  //while (esp8266.available()) {
  while (Serial3.available()) {
    //buffer[i++] = esp8266.read();
    buffer[i++] = Serial3.read();
    dataSync = true;
  }

  // if data is available, parse it
  if (dataSync == true) {
    if ((buffer[0] == 'U') && (buffer[1] == 'N') && (buffer[2] == 'X')) {
      // if data sent is the UNX token, take it
      unixString[0] = buffer[3];
      unixString[1] = buffer[4];
      unixString[2] = buffer[5];
      unixString[3] = buffer[6];
      unixString[4] = buffer[7];
      unixString[5] = buffer[8];
      unixString[6] = buffer[9];
      unixString[7] = buffer[10];
      unixString[8] = buffer[11];
      unixString[9] = buffer[12];
      unixString[10] = '\0';

      // print the UNX time on the UNO serial
      Serial.println();
      Serial.print("TIME FROM ESP: ");
      Serial.print(unixString[0]);
      Serial.print(unixString[1]);
      Serial.print(unixString[2]);
      Serial.print(unixString[3]);
      Serial.print(unixString[4]);
      Serial.print(unixString[5]);
      Serial.print(unixString[6]);
      Serial.print(unixString[7]);
      Serial.print(unixString[8]);
      Serial.print(unixString[9]);
      Serial.println();

      unixTime = atol(unixString);
      // Synchronize the time with the internal clock
      // for external use RTC.setTime();
      setTime(unixTime);
      dataSync = false;
    }
  }
}

beim Aufspielen des ESP Teils:

/********************
  - www.geekstips.com
  - Arduino Time Sync from NTP Server using ESP8266 WiFi module
  - Arduino code example
 ********************/

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

char ssid[] = "Graf";  //  your network SSID (name)
char pass[] = "5XXXXXXXXXXXXXX9";       // your network password


unsigned int localPort = 2390;      // local port to listen for UDP packets
IPAddress timeServerIP;
const char* ntpServerName = "fritz.box";

const int NTP_PACKET_SIZE = 48;

byte packetBuffer[ NTP_PACKET_SIZE];
WiFiUDP udp;

void setup()
{
  Serial.begin(115200);
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  udp.begin(localPort);
}

void loop()
{
  WiFi.hostByName(ntpServerName, timeServerIP);

  sendNTPpacket(timeServerIP);
  delay(1000);

  int cb = udp.parsePacket();
  if (!cb) {
    delay(1);
  }
  else {
    udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    unsigned long secsSince1900 = highWord << 16 | lowWord;
    const unsigned long seventyYears = 2208988800UL;
    unsigned long epoch = secsSince1900 - seventyYears;
    Serial.print("UNX");
    Serial.println(epoch);
  }
  delay(10000);
}

unsigned long sendNTPpacket(IPAddress& address)
{
  Serial.println("sending NTP packet...");
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  udp.beginPacket(address, 123);
  udp.write(packetBuffer, NTP_PACKET_SIZE);
  udp.endPacket();
}

bekomme ich eine Fehlermeldung:

In file included from C:\Users\rieeg\Documents\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:40:0,

                 from C:\Users\rieeg\Documents\Arduino\NTP_Wifi_LCD\ESP_Part\ESP_Part.ino:7:

C:\Users\rieeg\Documents\Arduino\libraries\ESP8266WiFi\src/WiFiServer.h:51:14: error: invalid abstract return type for member function 'WiFiClient WiFiServer::available(uint8_t*)'

   WiFiClient available(uint8_t* status = NULL);

              ^

In file included from C:\Users\rieeg\Documents\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:39:0,

                 from C:\Users\rieeg\Documents\Arduino\NTP_Wifi_LCD\ESP_Part\ESP_Part.ino:7:

C:\Users\rieeg\Documents\Arduino\libraries\ESP8266WiFi\src/WiFiClient.h:36:7: note:   because the following virtual functions are pure within 'WiFiClient':

 class WiFiClient : public Client, public SList<WiFiClient> {

       ^

In file included from C:\Users\rieeg\Documents\Arduino\libraries\ESP8266WiFi\src/WiFiClient.h:27:0,

                 from C:\Users\rieeg\Documents\Arduino\libraries\ESP8266WiFi\src/ESP8266WiFi.h:39,

                 from C:\Users\rieeg\Documents\Arduino\NTP_Wifi_LCD\ESP_Part\ESP_Part.ino:7:

C:\Users\rieeg\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266/Client.h:29:21: note: 	virtual int Client::connect(const IPAddress&, uint16_t)

         virtual int connect(CONST IPAddress& ip, uint16_t port) =0;

                     ^

C:\Users\rieeg\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266/Client.h:37:22: note: 	virtual bool Client::flush(unsigned int)

         virtual bool flush(unsigned int maxWaitMs = 0) = 0;

                      ^

C:\Users\rieeg\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266/Client.h:38:22: note: 	virtual bool Client::stop(unsigned int)

         virtual bool stop(unsigned int maxWaitMs = 0) = 0;

                      ^

ESP_Part:21: error: cannot declare variable 'udp' to be of abstract type 'WiFiUDP'

 WiFiUDP udp;

         ^

In file included from C:\Users\rieeg\Documents\Arduino\NTP_Wifi_LCD\ESP_Part\ESP_Part.ino:8:0:

C:\Users\rieeg\Documents\Arduino\libraries\ESP8266WiFi\src/WiFiUdp.h:32:7: note:   because the following virtual functions are pure within 'WiFiUDP':

 class WiFiUDP : public UDP, public SList<WiFiUDP> {

       ^

In file included from C:\Users\rieeg\Documents\Arduino\libraries\ESP8266WiFi\src/WiFiUdp.h:25:0,

                 from C:\Users\rieeg\Documents\Arduino\NTP_Wifi_LCD\ESP_Part\ESP_Part.ino:8:

C:\Users\rieeg\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266/Udp.h:82:27: note: 	virtual IPAddress UDP::remoteIP() const

         virtual IPAddress remoteIP() const =0;

                           ^

C:\Users\rieeg\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266/Udp.h:84:26: note: 	virtual uint16_t UDP::remotePort() const

         virtual uint16_t remotePort() const =0;

                          ^

Mehrere Bibliotheken wurden für "ESP8266WiFi.h" gefunden
 Benutzt: C:\Users\rieeg\Documents\Arduino\libraries\ESP8266WiFi
 Nicht benutzt: C:\Users\rieeg\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\libraries\ESP8266WiFi
exit status 1
cannot declare variable 'udp' to be of abstract type 'WiFiUDP'

Eingestellt in der IDE ist ein “Generic ESP8266 Module”
Dipschalter auf dem Board 5 6 7 on
RX/TX Schalter auf RX/TX0

Irgendwie scheint er ein Problem mit dem WiFiUDP zu haben. Kann mir das einer erklären? Hat schon jemand Erfahrung mit dem Board?

MFG Rico

ich sehe da drei Probleme:

  • das Board bindet den Mega mit dem ESP mittels Softserial
  • du programmierst in den MEGA einen NTP Sketch und in den ESP einen NTP Sketch
  • Die Art und weise wie du in den ESP ein NTP Sketch einbindest ist VERALTET. Es braucht am ESP keine externe Library mehr, kein manuelles UDP um eine NTP Abfrage zu machen.

Generell sehe ich aber überhaupt keinen Grund für ein derartiges Board.

Den einzigen Ausweg Weg mit diesem Board den ich sehe ist:

  • Den ESP sauber extern zu programmieren mit einer neuen NTP Abfrage
  • eine Kommunikation zwischen ESP und MEGA aufzubauen - ich würde dazu aber I2C oder zumindest Hardware-Serial verwenden, auch wenn dazu ein manuelles Verdrahten notwendig ist.

p.s.: grad ausprobiert
Bereits Suchergebnis 2 (von mir) und 3 (von Fips) sind taugliche ESP8266 NTP Abfragen - bitte nach der einen oder anderen Arbeiten, wenn man schon nicht das Beispiel aus der IDE verwenden will...

Selbe Suche und extra vom Google Konto abgemeldet.
Werner, die wissen ganz genau wer sucht und deshalb oben platziert wird.

Hey, seid wann werden Bilder automatisch eingebunden?

Gruß Fips

noiasca:
.....nur um mir ein gutes Gefühl zu geben ;-(.

Suchfilter -> Seiten auf Deutsch

Schon sind wir beide auf dem Podium! ;D

Hallo,

jetzt bin ich verwirrt. Ich war der Meinung dass das Board HW Serial über RX/TX0 oder RX/TX3 macht.
Bei den beiden Sketchen war ich der Annahme das der ESP die NTP Zeit abholt und per Serial die UNIXTime zur Verfügung stellt. Sodass der Mega nicht erst selbst den NTP Server anfragen muss.

Ich muss, glaub ich, erstmal meine IDE auf Vordermann bringen. Irgendwie ist alles doppelt.

Jetzt muss ich erstmal zur Schicht. Ich versuche mich morgen nochmal.
Vielen Dank erstmal.