Hallo,
Du kannst Dir ja mal meinen inzwischen genutzten Ablauf anschauen.
Hatte ich irgendwo im Netz gefunden (Espressif-Forum?).
Ich habe es mal unveränder gelassen, ist von einer meiner Uhren und schickt nur Studen/Minute per Serielle an einen Pro Mini.
#include <ESP8266WiFi.h>
#include <time.h>
#include <ArduinoOTA.h>
#include <Ticker.h>
#define DEBUG
#define HOSTNAME "OTA-PANAPLEX"
#define LOOPTIME 10 // Zeit in Sekunden
#define WIFI_SSID "xxxxxxxxx"
#define WIFI_PASSWORD "xxxxxxxx"
// WiFi
WiFiEventHandler wifiConnectHandler;
WiFiEventHandler wifiDisconnectHandler;
Ticker wifiReconnectTimer;
void connectToWifi(void);
void onWifiConnect(const WiFiEventStationModeGotIP& event);
Ticker uhrzeit;
void SendUhr(void);
int timezone = 2; // MESZ
//######################################################################
void setup()
{
Serial.begin(115200);
// Start WiFi
wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);
connectToWifi();
// Start OTA server.
ArduinoOTA.setHostname(HOSTNAME);
ArduinoOTA.begin();
// Start Time service.
configTime(timezone * 3600, 0, "pool.ntp.org", "time.nist.gov");
#ifdef DEBUG
Serial.println("\nWaiting for time");
#endif
while (!time(nullptr))
{
#ifdef DEBUG
Serial.print(".");
#endif
delay(1000);
}
#ifdef DEBUG
Serial.println("");
time_t now = time(nullptr);
Serial.println(ctime(&now));
#endif
SendUhr();
uhrzeit.attach(LOOPTIME, SendUhr); // Zeit in Sekunden
#ifdef DEBUG
Serial.println("Ticker gestartet");
#endif
}
//----------------------------------------------------------------------
void loop()
{
ArduinoOTA.handle(); // Handle OTA server.
}
// ###############################################################
// ---------------------- WiFi-Tools ------------------------------
// ###############################################################
void connectToWifi()
{
#ifdef DEBUG
Serial.println("Connecting to Wi-Fi...");
#endif
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}
void onWifiConnect(const WiFiEventStationModeGotIP& event)
{
#ifdef DEBUG
Serial.println("Connected to Wi-Fi.");
Serial.println(WiFi.localIP());
#endif
}
// ###############################################################
// ---------------------- Uhr-Tools ------------------------------
// ###############################################################
void SendUhr()
{
time_t now = time(nullptr);
struct tm * timeinfo;
timeinfo = localtime(&now);
Serial.printf("%02d:%02d:%02d",timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
Serial.println();
}
NTP wird über die Posix-time.h realisiert die im SDK dabei ist.
Kannst Du natürlich weglassen, genauso OT wenn Du es nicht brauchst.
Es gibt im ESP8266-SDK bzw. der Arduino-Einbindung ein Problem:
if (WiFi.status() != WL_CONNECTED) meldet manchmal schon true zurück wenn der ESP im WLAN ist aber per DHCP noch keine IP vom Router bekommen hat.
Wenn dann sofort eine andere Funktion ins Netz will (bei mir meist MQTT) kann er in dieser Funktion hängen bleiben wenn dort die Fehlerbehandlung nicht 100% ist.
Ich habe ine ganze Weile gesucht weil ein ESP bei mir immer wieder mal nach einen WLAN-Aussetzer im WLAN erreichbar war, OTA lief, die WeMo-Emu (Amazon Echo) lief, MQTT meldete aber das der Cliebt verschwunden wäre.
Für MQTT gibt es da einen ähnlichen Ticker-Aufbau, kann ich bei Interesse auch posten.
Gruß aus Berlin
Michael