• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

BLYNK и OTA

iG2019

New member
Есть ESP8266 NODEMCU
заливаю такой скетч
Код:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS D3

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

BlynkTimer timer;

char auth[] = "***************"; //ваш токен  при регистрации в BLYNK
char ssid[] = "*****"; // ваш логин, название домашней сети wifi
char pass[] = "******"; // ваш пароль домашней сети wifi

void setup()
{
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  sensors.begin();
  sensor.setResolution(12);
  timer.setInterval(6000L, sendTemps); // установка времени в милисекундах
}

void sendTemps()
{
  sensors.requestTemperatures();
  float temp = sensors.getTempCByIndex(0);
   Serial.println(temp);
  Blynk.virtualWrite(V1, temp);
}

  void loop()
  {
    Blynk.run();
    timer.run();
  }
все нормально работает.
Как только изменяю код для возможности прошивки по воздуху
Код:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS D3

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

BlynkTimer timer;


const char* auth = "***"; //ваш токен  при регистрации в BLYNK
const char* ssid = "***";
const char* password = "***";

void setup() {
 
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  Serial.println("Booting");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }

  // Hostname defaults to esp8266-[ChipID]
  ArduinoOTA.setHostname("myesp8266");

   ArduinoOTA.onStart([]() {
    Serial.println("Start updating ");
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) {
      Serial.println("Auth Failed");
    } else if (error == OTA_BEGIN_ERROR) {
      Serial.println("Begin Failed");
    } else if (error == OTA_CONNECT_ERROR) {
      Serial.println("Connect Failed");
    } else if (error == OTA_RECEIVE_ERROR) {
      Serial.println("Receive Failed");
    } else if (error == OTA_END_ERROR) {
      Serial.println("End Failed");
    }
  });
  ArduinoOTA.begin();
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  Blynk.begin(auth, ssid, password);
  sensors.begin();
  sensors.setResolution(11);
  timer.setInterval(6000, sendTemps); // установка времени в милисекундах
}

void sendTemps()
{
  sensors.requestTemperatures();
  float temp = sensors.getTempCByIndex(0);
  Serial.println(temp);
  Blynk.virtualWrite(V1, temp);
  }

void loop() {
  ArduinoOTA.handle();
 
Blynk.run();
timer.run();
}
возникают проблемы с подключением к BLYNK. В консоли постоянно сыпятся сообщения что нет подключения. При этом прошивать по воздуху можно. Что я делаю не так?
 

iG2019

New member
поменял WiFi.mode(WIFI_STA); на WiFi.mode(WIFI_AP_STA); стало соединяться, но через некоторое время идут дисконнекты
 

svs2007m

Active member
Код:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS D3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
BlynkTimer timer;
char auth[] = "*******";   //ваш токен  при регистрации в BLYNK
char ssid[] = "*******";   // ваш логин, название домашней сети wifi
char pass[] = "*******";   // ваш пароль домашней сети wifi
void setup() {
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass);
  sensors.begin();
  sensors.setResolution(11);
  timer.setInterval(6000, sendTemps);              // установка времени в милисекундах
  timer.setInterval(30000L, reconnectBlynk);       // проверяем каждые 30 секунд, если подключение к серверу Bkynk
  ArduinoOTA.setHostname("My-Project");            //OTA Задаем имя сетевого порта
  ArduinoOTA.setPassword((const char *)"0001");    //OTA Задаем пароль доступа для удаленной прошивки
  ArduinoOTA.begin();                              //OTA Запуск
  Serial.println("Ready");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}
//------------------
void reconnectBlynk() {                    // функция проверяет соединение с сервером Блинк
  if (!Blynk.connected()) {                // если соединения нет то
    if (Blynk.connect())                   // конектимся
      BLYNK_LOG("Reconnected");            // выводим в лог
    else
      BLYNK_LOG("Not reconnected");        // выводим в лог
  }
} // end
//----------------
void sendTemps() {
  sensors.requestTemperatures();
  float temp = sensors.getTempCByIndex(0);
  Serial.println(temp);
  Blynk.virtualWrite(V1, temp);
}
void loop() {
  ArduinoOTA.handle();
  if (Blynk.connected()) Blynk.run();    // Запуск Blynk
  timer.run();
}
 
Последнее редактирование модератором:

iG2019

New member
Попробуй так !!!
И что это даст? Если я правильно понял просто идет проверка на соединение с Blynk? В случае его отсутствия идет переподключение? Но меня интересует вопрос почему с ОТА идут разрывы или вообще полное отсутствие соединения, а без него нет?
При старте ESP в случае отсутствия связи с blynk в порт сыпется :
Connecting to blynk-cloud.com:80
Login timeout

И Python настроен по уму ?
какие должны быть настройки? Я делал так как описано здесь и никаких настроек питона там не производится.
 

svs2007m

Active member
И что это даст? Если я правильно понял просто идет проверка на соединение с Blynk? В случае его отсутствия идет переподключение? Но меня интересует вопрос почему с ОТА идут разрывы или вообще полное отсутствие соединения, а без него нет?
При старте ESP в случае отсутствия связи с blynk в порт сыпется :
Connecting to blynk-cloud.com:80
Login timeout


какие должны быть настройки? Я делал так как описано здесь и никаких настроек питона там не производится.
  1. WiFi.mode(WIFI_STA);
  2. WiFi.begin(ssid, password);
  3. while (WiFi.waitForConnectResult() != WL_CONNECTED) {
  4. Serial.println("Connection Failed! Rebooting...");
  5. delay(5000);
  6. ESP.restart();
  7. }
Если подключаешься к Blynk, то строки выше зачем ?????????????? Blynk cам все сделает. Он настроит сеть, а подключится к серверу или нет дело второе. Просто настройки сети проходят у тебя дважды !

для прошивки через ОТА кабель от порта нужно отключить, ESP через внешнее питание. И не кабы какое.
 

iG2019

New member
Если подключаешься к Blynk, то строки выше зачем ??????????????
ну все это я делал на основе найденных в сети примеров. Ссылку на один их них привел выше. И сейчас с такими строчками ESP висит на улице и работает как часы, но без OTA !!! А с ОТА либо вообще не коннектится к Blynk либо через пару минут на смартфоне постоянно выскакивает "Сonnected" - " Disconnected", а в мониторе порта ESP или
Connecting to blynk-cloud.com:80
Login timeout
или
blynk heartbeat timeout.

Вот и интересует как ОТА влияет на стабильность соединения с сервером Blynk.

для прошивки через ОТА кабель от порта нужно отключить
с прошивкой по OTA как раз никаких проблем!!! После заливки через шнур вижу ip-шник, и сетевой порт. Дальше спокойно могу заливать прошивки через ОТА.

И Python настроен по уму ?
так все-таки что имеется ввиду под настройками Python???
 

nikolz

Well-known member
  1. WiFi.mode(WIFI_STA);
  2. WiFi.begin(ssid, password);
  3. while (WiFi.waitForConnectResult() != WL_CONNECTED) {
  4. Serial.println("Connection Failed! Rebooting...");
  5. delay(5000);
  6. ESP.restart();
  7. }
Если подключаешься к Blynk, то строки выше зачем ?????????????? Blynk cам все сделает. Он настроит сеть, а подключится к серверу или нет дело второе. Просто настройки сети проходят у тебя дважды !

для прошивки через ОТА кабель от порта нужно отключить, ESP через внешнее питание. И не кабы какое.
это есть очень плохо.
может дырка во флешке появиться
и зачем это цикл с рестартом
отслеживать подключение надо в колбеке Wifi
а режимы изменять по условию
например так:
if (wifi_get_opmode()!=STATION_MODE) wifi_set_opmode(STATION_MODE);
тоже самое:
if (wifi_get_opmode()!=1) wifi_set_opmode(1);
 

svs2007m

Active member
ну все это я делал на основе найденных в сети примеров. Ссылку на один их них привел выше. И сейчас с такими строчками ESP висит на улице и работает как часы, но без OTA !!! А с ОТА либо вообще не коннектится к Blynk либо через пару минут на смартфоне постоянно выскакивает "Сonnected" - " Disconnected", а в мониторе порта ESP или
Connecting to blynk-cloud.com:80
Login timeout
или
blynk heartbeat timeout.

Вот и интересует как ОТА влияет на стабильность соединения с сервером Blynk.


с прошивкой по OTA как раз никаких проблем!!! После заливки через шнур вижу ip-шник, и сетевой порт. Дальше спокойно могу заливать прошивки через ОТА.


так все-таки что имеется ввиду под настройками Python???
1. Дружище я уже ИСПРАВИЛ твой скетч (см. выше ) который на 99% работает. Проверил у себя на своем железе !!! Все шьется через ОТА и прекрасно работает. Второй раз и медленно .......... убери настройки WIFI !!!!!!!!! Они входят в конфликт с библиотеками Blynk.
 

iG2019

New member
Попробуй так !!!
Дружище я уже ИСПРАВИЛ твой скетч (см. выше ) который на 99% работает.
Залил ... та же ситуация. Gериодический дисконнект. В мониторе порта:
Heartbeat timeot
Connecting to blynk-cloud.com:80
Ready
и через пару секунд опять
Heartbeat timeot
Connecting to blynk-cloud.com:80
Ready

Все шьется через ОТА
так и у меня шьется с моим кодом. меня волнуют проблема нестабильного соединения с Blynk !!!! Есля и правильно понял сообщение "Heartbeat timeot" почему-то с ОТА резко возрастает пинг и сервер Blynk отваливается
 

svs2007m

Active member
То есть если подсоединиться через COM порт и закомментировать строки
в setup()
// ArduinoOTA.begin();
и в loop()
//ArduinoOTA.handle();
железо работает как надо ?
 

svs2007m

Active member
У Вас датчик температуры подключен на D3 это кажется GPIO0. Это мягко говоря не самое лучшее решение ! Может здесь засада.
 

iG2019

New member
Вряд ли. На этом пине резисторная подтяжка к "+". Если бы датчик мешал была бы проблема с прошивкой по шнуру, но никак не стабильность связи с сервером
 

CodeNameHawk

Moderator
Команда форума
Если не секрет КАКАЯ инфа во время прошивки через ОТА идет на СОМ порт ?
Выводит сообщения из этого
Код:
    ArduinoOTA.onStart([]()
    {
        Serial.println("Start");
    });
    ArduinoOTA.onEnd([]()
    {
        Serial.println("End");
    });
    ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
    {
        Serial.printf("Progress: %u%%\n", (progress / (total / 100)));
    });
    ArduinoOTA.onError([](ota_error_t error)
    {
        Serial.printf("Error[%u]: ", error);
        if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
        else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
        else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
        else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
        else if (error == OTA_END_ERROR) Serial.println("End Failed");
    });
Для того, что бы не долбила каждым процентом, немного изменил код
Код:
    ArduinoOTA.onStart([]()
    {
        Serial.println("OTA Update Start.");
    });
    ArduinoOTA.onEnd([]()
    {
        Serial.println("OTA Update End.");
    });
    ArduinoOTA.onProgress([](unsigned int progress, unsigned int total)
    {
        static unsigned int old_progress;
        unsigned int now_progress;

        now_progress = (progress / (total / 100));
        if (now_progress == 0) old_progress = 0;

        if (now_progress >= (old_progress + 10))
        {
            Serial.printf("Progress: %3u%%\r\n", now_progress);
            old_progress = now_progress;
        }
    });
    ArduinoOTA.onError([](ota_error_t error)
    {
        Serial.printf("Error[%u]: ", error);
        if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed.");
        else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed.");
        else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed.");
        else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed.");
        else if (error == OTA_END_ERROR) Serial.println("End Failed.");
    });
 

CodeNameHawk

Moderator
Команда форума
iG2019, включите в ардуиноиде вывод отладочной информации, помогает поймать моменты, когда теряется связь.
 
Сверху Снизу