After rebooting the router, esp32 does not join back to the router

Добрый день всем. У меня такая же проблема. Я использую esp32 с локальным сервером Blynk. После перезагрузки маршрутизатора, esp32 не присоединяется обратно к маршрутизатору и соответственно не получает ip адрес до перезагрузки esp32. Вы не могли бы представить полный код с примером устранения этой проблемы ?! Заранее огромное спасибо. p.s. Прошу сильно не ругать, я совсем новенький в этом вопросе.

У меня такая же фигня была, где то нашел такой код:

> void reconnectBlynk() {
>   if (!Blynk.connected()) {
>     if(Blynk.connect()) {
>      BLYNK_LOG("Reconnected");
>     } else {
>       BLYNK_LOG("Not reconnected");
>     }
>   }
> }
> 
> 
> void loop(){
>  
>  if (Blynk.connected()) {
>     Blynk.run();
>}
timer.run();
>}

Вроди помогло, но не забываем в void setup() добавить строку:
timer.setInterval(30000L, reconnectBlynk);

Спасибо большое! Сейчас попробую протестировать.

Ситуация не поменялась… Если отключить маршрутизатор от питания, потом включить через 3 минуты, то esp32 больше не подсоединяется к маршрутизатору и не получает ip адрес (((((

Вот мой скетч:

#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <OneWire.h>
#include <DallasTemperature.h> 
#include <SimpleTimer.h>
SimpleTimer timer;
char auth[] = "**********************************";

char ssid[] = "***********";
char pass[] = "**********";


#define ONE_WIRE_BUS 13 // DS18B20 on arduino pin4 corresponds to GPI12 on physical board
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
float temp;
int numberofdevices;

void setup()
{
     
   Serial.begin(9600); 
   pinMode (15, OUTPUT);
   digitalWrite (15, HIGH);
//    pinMode (16, OUTPUT);
 //   digitalWrite (16, HIGH);
    pinMode (25, OUTPUT);
   digitalWrite (25, HIGH);
    pinMode (17, OUTPUT);
   digitalWrite (17, HIGH);
    pinMode (18, OUTPUT);
   digitalWrite (18, HIGH);
    pinMode (19, OUTPUT);
   digitalWrite (19, HIGH);
    pinMode (21, OUTPUT);
   digitalWrite (21, HIGH);
    pinMode (22, OUTPUT);
   digitalWrite (22, HIGH);
    pinMode (23, OUTPUT);
   digitalWrite (23, HIGH);
    
       Serial.println();
  timer.setInterval(30000L, reconnectBlynk);     
  //Blynk.begin(auth, ssid, pass);
  //Blynk.begin(auth, ssid, pass, "blynk-cloud.com", 80);
  Blynk.begin(auth, ssid, pass, IPAddress(192,168,100,154), 8080);

 
  DS18B20.begin();
  numberofdevices=DS18B20.getDeviceCount();
 Serial.println(numberofdevices); 
  Blynk.syncAll();
 }

void loop()

{
  DS18B20.requestTemperatures();
  numberofdevices=DS18B20.getDeviceCount();
  //Serial.println(numberofdevices); 
 for(int i=0;i<numberofdevices;i++)
 {
   temperatura(i);
  delay(200);
 }
  
  if (Blynk.connected()){ 
  Blynk.run();
  Blynk.syncAll();
 // digitalWrite (16, LOW); 
 }
 else{
// digitalWrite (16, HIGH);
 }
  timer.run();
 }

void temperatura(int dev) 
{
    //inicio SENSOR TEMPERATURA  
    
 DS18B20.requestTemperatures();
 temp = DS18B20.getTempCByIndex(dev);
 Serial.println("TEMPERATURA");
 Serial.println(temp);
 Blynk.virtualWrite(dev+10, temp);
}
void reconnectBlynk() {
if (!Blynk.connected()) {
if(Blynk.connect()) {
Serial.println ("Reconnected");
 //digitalWrite (16, LOW);
} else {
Serial.println ("Not reconnected");
//digitalWrite (16, HIGH);
}
}
}

Продолжение мучения по теме…
Сделал статический ip адрес:
Результат все тот же, при перезапуске маршрутизатора, esp32 больше к нему не подцепляется…((((
Люди HELP!!!

#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SimpleTimer.h>
SimpleTimer timer;
char auth[] = "***************";
char ssid[] = "***";
char pass[] = "************";



#define ONE_WIRE_BUS 13 // DS18B20 on arduino pin4 corresponds to GPI12 on physical board
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
float temp;
int numberofdevices;

void setup()
{
     // Удаляем предыдущие конфигурации WIFI сети
       WiFi.disconnect(); // обрываем WIFI соединения
       WiFi.softAPdisconnect(); // отключаем точку доступа(если она была
       WiFi.mode(WIFI_OFF); // отключаем WIFI
       delay(500);

       // присваиваем статический IP адрес
       WiFi.mode(WIFI_STA); // режим клиента
       WiFi.config(IPAddress(192,168,100,152),IPAddress(192,168,100,1),IPAddress(255,255,255,0),IPAddress(192,168,100,1));
       
  Serial.begin(9600);
  pinMode (15, OUTPUT);
  digitalWrite (15, HIGH);
  pinMode (25, OUTPUT);
  digitalWrite (25, HIGH);
  pinMode (17, OUTPUT);
  digitalWrite (17, HIGH);
  pinMode (18, OUTPUT);
  digitalWrite (18, HIGH);
  pinMode (19, OUTPUT);
  digitalWrite (19, HIGH);
  pinMode (21, OUTPUT);
  digitalWrite (21, HIGH);
  pinMode (22, OUTPUT);
  digitalWrite (22, HIGH);
  pinMode (23, OUTPUT);
  digitalWrite (23, HIGH);

  Serial.println();
  timer.setInterval(30000L, reconnectBlynk);
   Blynk.begin(auth, ssid, pass, IPAddress(192, 168, 100, 154), 8080);


  DS18B20.begin();
  numberofdevices = DS18B20.getDeviceCount();
  Serial.println(numberofdevices);
  Blynk.syncAll();
}

void loop()

{
  DS18B20.requestTemperatures();
  numberofdevices = DS18B20.getDeviceCount();
    for (int i = 0; i < numberofdevices; i++)
  {
    temperatura(i);
    delay(200);
  }

  if (Blynk.connected()) {
    Blynk.run();
    Blynk.syncAll();
     }
  else {
    }
  timer.run();
}

void temperatura(int dev)
{

  DS18B20.requestTemperatures();
  temp = DS18B20.getTempCByIndex(dev);
  Serial.println("TEMPERATURA");
  Serial.println(temp);
  Blynk.virtualWrite(dev + 10, temp);
}
void reconnectBlynk() {
  if (!Blynk.connected()) {
    if (Blynk.connect()) {
      Serial.println ("Reconnected");
          } else {
      Serial.println ("Not reconnected");
       }
  }
}

Из цикла я бы все лишнее убрал. И delay в цикле - это зло.

Все проблема решена!!! Всем спасибо кто помогал!
Проверяю уже в течении часа вот этот код, данный код решает проблему с повторным подключением для esp32:
Источник: https://github.com/espressif/arduino-esp32/issues/653

Код реально проверенный, рабочий на 100 %:

/****************************************
Include Libraries
****************************************/
#include <WiFi.h>

/****************************************
Define Constants
****************************************/
#define WIFISSID "==*******==" // Put your WifiSSID here
#define PASSWORD "==*********==" // Put your wifi password here
// constants won't change. Used here to set a pin number:
const int ledPin = 16;// the number of the LED pin

/****************************************
Define Variables
****************************************/
// Variables will change:
int ledState = LOW; // ledState used to set the LED

int interval = 100; // interval at which to blink (milliseconds)

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0; // will store last time LED was updated

/****************************************
Auxiliar Functions
****************************************/
void WIFI_Connect()
{
WiFi.disconnect();
Serial.println("Connecting to WiFi...");
WiFi.mode(WIFI_AP_STA);
WiFi.begin(WIFISSID, PASSWORD);

for (int i = 0; i < 60; i++)
{
if ( WiFi.status() != WL_CONNECTED )
{
delay ( 250 );
digitalWrite(ledPin, LOW);
Serial.print ( "." );
delay ( 250 );
digitalWrite(ledPin, HIGH);
}
}
if ( WiFi.status() == WL_CONNECTED )
{
Serial.println("");
Serial.println("WiFi Connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
digitalWrite(ledPin, 0);
}

/****************************************
Main Functions
****************************************/

void setup()
{
Serial.begin(115200);

// set the digital pin as output:
pinMode(ledPin, OUTPUT);
WIFI_Connect();
}

void loop()
{
unsigned long currentMillis = millis();

if (currentMillis - previousMillis >= interval)
{
if (WiFi.status() != WL_CONNECTED)
{
Serial.println("wifi disconnected ");
WIFI_Connect();
}
// save the last time you blinked the LED
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW)
{
ledState = HIGH;
interval = 100;
}
else
{
ledState = LOW;
interval = 2500;
}
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
}
}

А что вы имеете в веду под ЗЛОМ ??? Если можно укажите примером как этого можно избежать !?

Blynk в принципе с delay не очень дружит, разрабы часто об этом говорят и предлагают больше пользоватся SimpleTimer. Например из loop можно забрать часть кода и сделать так:

void DS(){
DS18B20.requestTemperatures();
numberofdevices=DS18B20.getDeviceCount();
[//Serial.println](https://serial.println/)(numberofdevices);
for(int i=0;i&lt;numberofdevices;i++)
{
temperatura(i);
}
}

и в void setup добавить строку:
timer.setInterval(1000L, DS);

Дело не в Blynk, а в подходе к разработке в сфере интернета вещей.

Для обычного МК запустить цикл который будет каждые 250мс мигать диодом - ок. Для коммуникации с вайфай модулем, роутером, и облачным сервером - флудить с такой частотой = зло. Также все эти рутины требуют своих таймеров, heartbeats и тд. Поэтому прерывать их delay(ф-ия блокируящая все процессы) - неверно.

Сорян, я всех тонкостей не знал, потому, что только учусь уже второй год и начал свою учебу в програмировании именно с Blynk.

Please properly format all posted code in this forum… makes it easier to read. Thanks.

Blynk%20-%20FTFC

Putting all you code in the void loop() may work for non-IoT uses, but can block the needed background communication for IoT uses. As per this Help Center Document…

http://help.blynk.cc/getting-started-library-auth-token-code-examples/blynk-basics/keep-your-void-loop-clean