Добрый день всем. У меня такая же проблема. Я использую 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<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.
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…