Hallo zusammen,
wie bereits an andere Stelle geschrieben hier noch mal der Vollständigkeit halber.
Ich hab ein projekt "Wetterstation"mit einem ESP8266-01 realisiert das sich derzeit in einer Lanzeit Testphase befindet.
Es läuf alles wie es soll. Jetzt hatte ich in der Vergangene Woche eine Störung an meiner Fritzbox , Wlan ausgefallen, das Ding musste ich neu starten. Damit war dann mein ESP auch abgehängt , hat sich auch nicht mehr selbstständig wieder verbunde. Wie auch , ich hatte wie in vielen Beispielen üblich das im Set-up untergebracht.
Ich hab jetzt eine Funktion wificonnect() gebaut die ich im Setup aufrufe.
Im loop frag ich dann den Wifi.satus() ab und falls der false ist gehts in die wificonnect() damit ein neuer Verbindugsaufbau erfolgt.
jetzt meine Frage was muss da alles rein. ich denke der übrige Kram für NTP Server, Webserver, I2C Bus kann / muss im Setup stehen bleiben ?
testen ist ja etwas schwierig da muss ich die frtzbox sicher dann mehrfach abschalten. Soviel Glück das es direkt beim ersten mal klappt gibts sicher nicht 
void setup() {
Serial.begin(115200);
Serial.println("-------------");
Serial.printf("Connecting to ", ssid);
wificonnect();
// NTP Zeit abrufen und läuft so automatisch zyklisch ab
setSyncProvider(get_time);
setSyncInterval(3600);
Serial.println(DatumZeit());
// WebServer starten
if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}
server.on("/", handleRoot);
server.on ( "/test1.svg", drawGraph1 );
server.on ( "/test2.svg", drawGraph2 );
server.on ( "/test3.svg", drawGraph3 );
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
// I2C Bus starten an pin 1 u pin 2
Wire.begin(0, 2);
delay(2000);
while (!bme.begin()) {
Serial.println(F(" Kann BME 280 Sensor nicht finden"));
}
// Alarmwerte vorbesetzeten ab 0:00:15 alle zwei Stunden
for (int i = 0; i <= 11; i++) {
alarmzeit[i] = i * 7200 + 15;
// Serial.println(alarmzeit[i]);
}
void alarm();// Alarm initialisieren auf aktuelle Zeit
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
wificonnect();
delay(1000);
}
..
...
.
}
void wificonnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(200);
Serial.print(".");
}
Serial.println("");
Serial.print("local IP:");
Serial.println(WiFi.localIP());
}
a) in der GUI der Fritzbox kann man das WLAN aus- und anschalten, bei vielen Modellen sogar per Taste oben drauf
b) stecke den ESP in eine Blechdose (Keksdose) - sofern du as nicht direkt neben der Fritzbox machst, sollte die WLAN-Verbindung abbrechen
Hallo
danke für den Hinweis, Keksdose ist gerade leer die bietet sich die ja geradezu für den Versuch an . 
Heinz
Die Idee mit der Kekadose ist gut aber auch nicht so einfach umzusetzen.
Ein normaler WEMOS D1 mini pro schafft es trotz Keksdose und zusätzlich Alufolie weiterhin die Verbindung zu halten.
Erst als ich einen genommen habe, den ich für die externe Antenne umgebaut habe (natürlich ohne externe Antenne) ließ der sich überzeugen, die Verbindung zu verlieren.
Sobald die Keksdose wieder auf war, hat er sich sofort reconnectet und alles lief wieder.
Ich habe im loop folgende Testfunktion benutzt:
void printWlanStatus() {
const String wiFiStatus[] = {"WL_IDLE_STATUS","WL_NO_SSID_AVAIL","WL_SCAN_COMPLETED","WL_CONNECTED","WL_CONNECT_FAILED","WL_CONNECTION_LOST","WL_DISCONNECTED"};
static int wlanStatusAlt = -99;
int wlanStatus = WiFi.status();
if (wlanStatus != wlanStatusAlt) {
Serial.print("WlanStatus: ");
Serial.print(wlanStatus);
Serial.print(" ");
Serial.println(wiFiStatus[wlanStatus]);
wlanStatusAlt = wlanStatus;
}
}
Arduino IDE 1.8.5 mit ESP8266-Package Version 2.3.0
Gruß Tommy
Rentner:
Ich hab jetzt eine Funktion wificonnect() gebaut die ich im Setup aufrufe.
Im loop frag ich dann den Wifi.satus() ab und falls der false ist gehts in die wificonnect() damit ein neuer Verbindugsaufbau erfolgt.
void wificonnect() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(200);
Serial.print(".");
}
Serial.println("");
Serial.print("local IP:");
Serial.println(WiFi.localIP());
}
Bei mir connected der ESP meistens von selbst wieder. Wenn nicht, hilft nur ein reset.
Welcher Befehl deiner Routine soll denn den Connect bewirken? Ich sehe nur eine blockierende Schleife, die erst freigibt, wenn der ESP connected hat. Das ist aber meist kontraproduktiv, da der uC dann ja gar nichts mehr vom Rest der loop macht.
Hallo sorry für die Verspätung,
Du hast natürlich recht die Funktion blokiert und wartet so lange bis die Verbindung wieder da ist. für meine Wetterstation ist das aber eigentlich nicht so dramaitisch. Ich bin halt davon ausgegangen das das WLan mal ausgefallen ist aber zeitlich nahe wieder da ist.
Eigendlich musste da noch ein Zähler rein damit man die Schleife wieder verlassen kann. Da die Abfrage auf WIFI.Status im Loop nochmals erfolgt fällt re dann wieder in die Funktion.
Ja warscheinlich verbindet sich das Modul auch von selber wieder, ohne das ich was dazu tun muss. was aber ist mit den internen daten der Lib. ? sind die dann auch noch ok ohne das man das WIFI.begin() durchlaufen hat. Warscheinlich nicht dun damit würde dann auch der Client und der Server nicht mehr laufen. Ist aber nur eine Vermutung von mir.
ich werde zuerst mal die Keksdose versuchen und / oder einfach mal das Wifi der Fritzbox abschalten um zu sehen was passiert.
danke für die Hilfe
Heinz
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
Rentner:
Ja warscheinlich verbindet sich das Modul auch von selber wieder, ohne das ich was dazu tun muss. was aber ist mit den internen daten der Lib. ? sind die dann auch noch ok ohne das man das WIFI.begin() durchlaufen hat. Warscheinlich nicht dun damit würde dann auch der Client und der Server nicht mehr laufen. Ist aber nur eine Vermutung von mir.
Da hilft wohl nur ausprobieren.
Meine Datenbankverbindung muss ich wieder neu aufbauen.
Gruß Tommy