My wemos disconnects from wifi and does not reconnect by itself

Hello friends! I am with a problem in my code, I think so … for some reason the wemos disconnects from the internet after many days of working without problems, and does not reconnect by itself, I have to press the reset button del wemos and so it works again ok, the equipment is not close to me … but could you help me to see if there is any problem in the code or give me a hand to implement ESP.restart that from what I could read could be my solution … I was thinking of forcing the computer to restart every 12 hours to ensure better performance … what do you think? I’m very new to this, I ask for your patience please

  #include <FS.h>    
//#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> 
#include <ArduinoJson.h>
//for LED status
#include <Ticker.h>
Ticker ticker;

bool alarm_mode = false ;
bool verificador = false;
//int led_placa = 2;
int sensor = 5;
int buzzer = 15;
int alarm_led = 4;
int alarm_led_off = 0;
int indicador = 13;
int ledPin = 14;
int contconexion = 0;
int conteoReactivacion = 0;
int ledState = LOW;             // ledState used to set the LED
int VirtualPinA = 3;
    
//define your default values here, if there are different values in config.json, they are overwritten.
char mqtt_server[40];
char mqtt_port[6] = "8080";
char blynk_token[34] = "UfZal9ErKrGIf5OwX5yYBgmlT7PDNAT8"; 

//flag for saving data
bool shouldSaveConfig = false;

//callback notifying us of the need to save config

void tick()
{
  //toggle state
  int state = digitalRead(indicador);  // get the current state of GPIO1 pin
  digitalWrite(indicador, !state);     // set pin to the opposite state
}

void ledState1()
{
   if (ledState == LOW) {
      ledState = HIGH;
      Blynk.virtualWrite(VirtualPinA, 0);
     
    } else {
      ledState = LOW;
      Blynk.virtualWrite(VirtualPinA, 1023);
     
    }
  }

//gets called when WiFiManager enters configuration mode
void configModeCallback (WiFiManager *myWiFiManager) {
  Serial.println("Entered config mode");
  Serial.println(WiFi.softAPIP());
  //if you used auto generated SSID, print it
  Serial.println(myWiFiManager->getConfigPortalSSID());
  //entered config mode, make led toggle faster
  ticker.attach(0.2, tick);
}
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
  }
// Keep this flag not to re-sync on every reconnection
bool isFirstConnect = true;
// This function will run every time Blynk connection is established
BLYNK_CONNECTED() 
{
  if (isFirstConnect) 
  {
    // Request Blynk server to re-send latest values for all pins
    Blynk.syncAll();
    isFirstConnect = false;
  }
}

  BlynkTimer timer;
void myTimerEvent() {
Serial.println("Tiempo des en seg: " + String(conteoReactivacion));
  if (alarm_mode == false) {
    conteoReactivacion++;
    if (conteoReactivacion >= 1800) { 
      Blynk.virtualWrite(V1, 1);
      digitalWrite(alarm_led, HIGH);
      digitalWrite(alarm_led_off, LOW);
      alarm_mode = true;
    }
  } else {
    conteoReactivacion = 0;
  }
  if (digitalRead(sensor) == 0) {
    Blynk.virtualWrite(V0, "NORMAL");
    delay(3000);   // Tiempo de demora al recibir señal de disparo
  }
  if (digitalRead(sensor) == 1)

  {
    Blynk.virtualWrite(V0, "ALERTA");
    
    if (alarm_mode == true)
      //AUTOR ALEXIS MORA
    {
      Blynk.email("ale24cba@gmail.com", "Historial de Alarmas", "Alarma Disparo");
      Blynk.notify("Alarma Disparo");
      digitalWrite(buzzer, HIGH);
      delay(500);
      digitalWrite(buzzer, LOW);
    }
  }
}
BLYNK_WRITE(V1) {
  Serial.println(param.asInt());
  switch (param.asInt()) {
    case 1: {
        alarm_mode = true;
        digitalWrite(alarm_led, HIGH);
        digitalWrite(alarm_led_off, LOW);
        break;
      }
    case 2: {
        alarm_mode = false;
        digitalWrite(buzzer, LOW);
        digitalWrite(alarm_led, LOW);
        digitalWrite(alarm_led_off, HIGH);
        break;
    }    
  }
}

void setup()
{
  pinMode(sensor, INPUT_PULLUP);
  pinMode(buzzer, OUTPUT);
  pinMode(alarm_led, OUTPUT);
  pinMode(alarm_led_off, OUTPUT);
  pinMode(indicador, OUTPUT);
//pinMode(led_placa, OUTPUT);
//pinMode(BUILTIN_LED, OUTPUT);
//start ticker with 0.5 because we start in AP mode and try to connect
  ticker.attach(0.6, tick);
 
  // Debug console
  Serial.begin(115200);
   Serial.println();
   
  //clean FS, for testing
  //SPIFFS.format();
 // Blynk.begin(auth, ssid, pass);
  // Setup a function to be called every second
  timer.setInterval(1000L, myTimerEvent);
  timer.setInterval(1000L, ledState1); //timer will run every sec 

  // put your setup code here, to run once:
  
  //clean FS, for testing
  //SPIFFS.format();

  //read configuration from FS json
  Serial.println("mounting FS...");

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");
    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");
      File configFile = SPIFFS.open("/config.json", "r");
      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");

          //strcpy(mqtt_server, json["mqtt_server"]);
         //strcpy(mqtt_port, json["mqtt_port"]);
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");
        }
        configFile.close();
      }
    }
  } else {
    Serial.println("failed to mount FS");
  }
  //end read

  // The extra parameters to be configured (can be either global or just in the setup)
  // After connecting, parameter.getValue() will get you the configured value
  // id/name placeholder/prompt default length
  //WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 40);
  //WiFiManagerParameter custom_mqtt_port("port", "mqtt port", mqtt_port, 6);
  WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 34);

  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wifiManager;

  //set config save notify callback
  wifiManager.setSaveConfigCallback(saveConfigCallback);

  //set static ip
  //wifiManager.setSTAStaticIPConfig(IPAddress(10,0,1,99), IPAddress(10,0,1,1), IPAddress(255,255,255,0));
  
  //add all your parameters here
  //wifiManager.addParameter(&custom_mqtt_server);
  //wifiManager.addParameter(&custom_mqtt_port);
  wifiManager.addParameter(&custom_blynk_token);

  //reset settings - for testing
  //wifiManager.resetSettings(); //borra usuario y contraseña cuando esta linea esta sin comentar al grabar.
  //set callback that gets called when connecting to previous WiFi fails, and enters Access Point mode
  wifiManager.setAPCallback(configModeCallback);
  //set minimu quality of signal so it ignores AP's under that quality
   //  defaults to 8%
  //wifiManager.setMinimumSignalQuality();
  
  //sets timeout until configuration portal gets turned off
  //useful to make it all retry or go to sleep
  //in seconds
  //wifiManager.setTimeout(120);

  //fetches ssid and pass and tries to connect
  //if it does not connect it starts an access point with the specified name
  //here  "AutoConnectAP"
  //and goes into a blocking loop awaiting configuration
  if (!wifiManager.autoConnect("NanoWifi", "12345678")) {
    Serial.println("failed to connect and hit timeout");
    delay(3000);
    //reset and try again, or maybe put it to deep sleep
    ESP.reset();
    delay(5000);
  }

  //if you get here you have connected to the WiFi
  Serial.println("connected...yeey :)");

  //read updated parameters
  //strcpy(mqtt_server, custom_mqtt_server.getValue());
  //strcpy(mqtt_port, custom_mqtt_port.getValue());
  strcpy(blynk_token, custom_blynk_token.getValue());

  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    //json["mqtt_server"] = mqtt_server;
   // json["mqtt_port"] = mqtt_port;
    json["blynk_token"] = blynk_token;

    File configFile = SPIFFS.open("/config.json", "w");
    if (!configFile) {
      Serial.println("failed to open config file for writing");
    }

    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
  }

 while (WiFi.status() != WL_CONNECTED) {
       int mytimeout = 5;
       delay(500);
       Serial.print(".");
       if((millis() / 1000) > mytimeout ){ // try for less than 6 seconds to connect to WiFi router
         Serial.println(" ");
          break;
          }
   }

  if(WiFi.status() == WL_CONNECTED){  
    //if you get here you have connected to the WiFi
   Serial.println(" ");
   Serial.println("connected to WiFi!! yay :)");
   Serial.println("IP address: ");
   Serial.println(WiFi.localIP()); 
  ticker.detach();
  //keep LED on
  digitalWrite(indicador, HIGH);
}
 
  Blynk.config(blynk_token);
  bool result = Blynk.connect();

  if (result != true)
  {
  Serial.println("BLYNK Connection Fail");
  Serial.println(blynk_token);
  wifiManager.resetSettings();  
  ESP.reset();
  delay (1000);
  }
    }
  
void loop()
{
  Blynk.run();
  timer.run(); // Initiates BlynkTimer  
}

Are you sure that it is Wifi connection failed or Blynk server connection ?

That’s a bit of a brute force solution.
A simple routine to check if your device is connected to the internet and the Blynk server is a much more appropriate process and there are plenty of examples of how to do this on the forum.
However, as @Blynk_Coeur has said, it may be better to work-out whether it’s a WiFi connection or Blynk server connection issue. I’ve seen situations where the culprit in this type of situation is actually the router and if that is the case then you may be better looking at the cause of the issue rather than a workaround.

Pete.

1 Like

thanks for replying @PeteKnight @Blynk_Coeur! I have 10 other devices working well without that problem with the same code … the equipment with the problem is not installed near where I am, the person who is in the place says that their wifi works perfectly almost without cuts or anything strange, I tried to simulate the “failure” that would be to disconnect the wifi and reconnect and the equipment reconnects without problems … I would like to have something planned for these situations, I know they are not common but when it happens it leaves me the equipment without working until I touch the reset button of the equipment. That is why it occurred to me to implement ESP.restart could be something more “intelligent” that would detect the disconnection wait a while when not reconnecting for example 30 minutes apply ESP.restart, total if there are no disconnections ESP.restart would not apply and when something happens it would work again as if one would touch the restet button of the wemos … what do you think … can you help me with an example to apply it? From already thank you very much

You seem fixated on restarting your device via ESP.restart

If you want to take that approach then I’m not going to assist.

I said before that…

Maybe you should start here…

Pete.