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

Проблемы со стартом nodemcu и blynk

ac1d

New member
Добрый день, сделал небольшое устройство на базе nodemcu и Blynk, которое управляет реле для открытия/закрытия откатных ворот.
Система работает исправно, однако недавно обнаружил очень неприятный косяк - когда я перезагружаю устройство через автомат в щитке, оно не запускается. Чтобы его запустить, приходится втыкать usb в nodemcu и только потом подавать 5В на блок реле и датчик холла.
Логика подсказывает мне, что проблема где-то в питании, но если это так, то почему же проблема возникает только при старте устройства, а потом все стабильно работает ?

Питаю плату через Vin пин, подавая туда 5в, и параллельно к этому пину припаян блок реле и датчик хола.
Смотрел в сериал порт при запуске от сети, там сплошные крякозябры на любой скорости порта, при старте через usb все корректно.
Скетч:
C++:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include "uptime_formatter.h"
#include "string.h"


// AUTH

char auth[] = "xxxx"; //тут токен из e-mail
char ssid[] = "xxxx"; //Название WiFi-сети
char pass[] = "xxxx"; //Пароль


BlynkTimer timer;
long rssi;
WidgetLCD lcd(V3);




// ESP pins
#define PIN_RELAY1 D6 // Physiс pin to Relay to full open
#define PIN_RELAY2 D5   // Physic pin to Relay short open
#define PIN_MAGNET D4 // Physic pin to a3144 sensor

// virtual pins for BLYNK
#define BL_UPTIME V5
#define BL_RSSI V6
#define BL_RELAY1 V1 //  full open gate
#define BL_RELAY2 V2 // short open gate



BLYNK_READ(BL_UPTIME)
{

  // This command writes Arduino's uptime in seconds to Virtual BL (5)
  Blynk.virtualWrite(BL_UPTIME,  uptime_formatter::getUptime());
}





// relay

BLYNK_WRITE(BL_RELAY1) //функция, отслеживающая изменение виртуального пина
{
  int pinValue1 = param.asInt(); //переменная текущего состояния виртуального пина
  if (pinValue1 == 1){     
     digitalWrite(PIN_RELAY1, LOW);
     delay (500);
     digitalWrite(PIN_RELAY1, HIGH);
     //delay(200);
     Blynk.virtualWrite(BL_RELAY1, 0);
  }
  else
  {
    digitalWrite(PIN_RELAY1, HIGH);
  }
}

BLYNK_WRITE(BL_RELAY2) //функция, отслеживающая изменение виртуального пина
{
  int pinValue2 = param.asInt(); //переменная текущего состояния виртуального пина
  if (pinValue2 == 1){     
     digitalWrite(PIN_RELAY2, LOW);
     delay (500);
     digitalWrite(PIN_RELAY2, HIGH);
     Blynk.virtualWrite(BL_RELAY2, 0);
  }
  else
  {
    digitalWrite(PIN_RELAY2, HIGH);
  }
}

// Датчик холла

void garageMagSensor ()
{
  int garageSensorSW = digitalRead(PIN_MAGNET);
  if (garageSensorSW == !LOW)
  {
    lcd.print(1, 0, "Ворота открыты"); // LCD print, column 1, row 0.
  }
  else
  {
    lcd.print(1, 0, "Ворота закрыты"); // LCD print, column 1, row 0
  }
}




void setup() //основная функция, выполняется один раз при подаче питания на микроконтроллер
{
  Serial.begin(9600); //открываем серийный порт, чтобы видеть как проходит подключение к серверу blynk
  pinMode(PIN_RELAY1, OUTPUT); //объявляем D4 "выходным" пином
  pinMode(PIN_RELAY2, OUTPUT);
  pinMode(PIN_MAGNET, INPUT);
  digitalWrite(PIN_RELAY1, HIGH);
  digitalWrite(PIN_RELAY2, HIGH);
  Blynk.begin(auth, ssid, pass); //авторизируемся на сервере
// Setup a function with timer
  timer.setInterval(5000L, garageMagSensor);
  rssi=WiFi.RSSI();                                        // Functions to display RSSI and Ip address
  Serial.print(rssi);
}



void loop() //основная функция, которая выполняется постоянно по кругу
{

  Blynk.run(); //запускаем работу blynk. В этом примере - постоянную проверку виртуального пина 0
  garageMagSensor ();
}
К посту приложил схему подключения и скриншот сериал порта
 

Вложения

svs2007m

Active member
Тема питания здесь обсуждалась и не раз. (поиск в помощь :) ) Кабы какой 5v не всегда подойдет. Попробуйте зарядник для мобильников 5v на 2А.
 

ac1d

New member
Тема питания здесь обсуждалась и не раз. (поиск в помощь :) ) Кабы какой 5v не всегда подойдет. Попробуйте зарядник для мобильников 5v на 2А.
Использую зарядник для ipad на 1А, но правда китайский.. Пойду в поиск глядеть..
 

CodeNameHawk

Moderator
Команда форума
когда я перезагружаю устройство через автомат в щитке, оно не запускается.
Попробуйте так, отключите датчик от D4, потом подайте питание через автомат в щитке.

там сплошные крякозябры на любой скорости порта,
А на 74800 смотрели?
 
  • Like
Реакции: ac1d

ac1d

New member
Да и функцию garageMagSensor () дергаете через таймер и в loop() ???
Большое спасибо ! Не разобрался сразу с принципом работы таймера, теперь все поправил, работает как надо

Попробуйте так, отключите датчик от D4, потом подайте питание через автомат в щитке.


А на 74800 смотрели?
Дело в том, что устройство уже спаяно и находится в блоке автоматики откатных ворот. Я взял другую ESP, залил туда прошивку с другим токеном blynk и теперь занимаюсь отладкой.
Огромное спасибо за наводку, мне удалось сымитировать перезагрузку автоматом на отладочной плате и я получил тот же результат ! Как понимаю, я неудачно выбрал пин для приема цифрового сигнала ? Вопрос можно ли теперь исправить это в коде, или мне придется перепаивать пин ? С монитором порта вы тоже попали в цель, на 74880 там fatal error (Скрин приложил). Нашел ветку на github с похожими кодами ошибок - https://github.com/esp8266/Arduino/issues/3138
Говорят может помочь полное стирание памяти и отдельное питание для МК. Если со стиранием флэша все понятно, то вот роскошь в виде отдельного питания для nodemcu я себе вряд ли смогу позволить, хотя, если другого выхода нет, придется изобретать что-то.

В скетче добавлено :
  • исправлена работа таймера
  • Отправка push при открытых воротах более 2 минут
  • Arduino OTA (прошивка по воздуху)
  • Режим отладки, который автоматически подставляет нужный токен и изменяет имя хоста на gate_debug
C++:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include "uptime_formatter.h"
#include "string.h"
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>


#define DEBUG 1 // Set up debug mode 

// AUTH

#if (DEBUG == 1)
char auth[] = "XXX"; // Токен для отладки
char esp_hostname[] = "esp_gate_debug";
#else
char auth[] = "YYY"; // Боевой токен
char esp_hostname = "esp_gate";
#endif

char ssid[] = "ssid"; //Название WiFi-сети
char pass[] = "pass"; //Пароль


BlynkTimer timer; // timer for sending data to blynk


WidgetLCD lcd(V3);



// ESP pins
#define PIN_RELAY1 D6    // Physical  pin to Relay to full open
#define PIN_RELAY2 D5   // Physical  pin to Relay short open
#define PIN_MAGNET D4   // Physical  pin to a3144 sensor
#define garageSensorSW digitalRead(PIN_MAGNET)

// virtual pins for BLYNK
#define BL_UPTIME V5     // uptime pin
#define BL_RSSI V6      // signal strength pin
#define BL_RELAY1 V1    //  full open gate
#define BL_RELAY2 V2   // short open gate




// relay

BLYNK_WRITE(BL_RELAY1) //функция, отслеживающая изменение виртуального пина
{
  int pinValue1 = param.asInt(); //переменная текущего состояния виртуального пина
  if (pinValue1 == 1) {
    digitalWrite(PIN_RELAY1, LOW);
    delay (500);
    digitalWrite(PIN_RELAY1, HIGH);
    Blynk.virtualWrite(BL_RELAY1, 0);
  }
  else
  {
    digitalWrite(PIN_RELAY1, HIGH);
  }
}

BLYNK_WRITE(BL_RELAY2) //функция, отслеживающая изменение виртуального пина
{
  int pinValue2 = param.asInt(); //переменная текущего состояния виртуального пина
  if (pinValue2 == 1) {
    digitalWrite(PIN_RELAY2, LOW);
    delay (500);
    digitalWrite(PIN_RELAY2, HIGH);
    Blynk.virtualWrite(BL_RELAY2, 0);
  }
  else
  {
    digitalWrite(PIN_RELAY2, HIGH);
  }
}

// Датчик холла

void garageMagSensor ()
{
  //int garageSensorSW = digitalRead(PIN_MAGNET);
  lcd.clear();
  Serial.print("Hall sensor state: ");Serial.println(garageSensorSW);
  if (garageSensorSW == !LOW)
  {
    
    lcd.print(2, 0, "Ворота открыты"); // LCD print, column 2, row 0.
    
  }
  else
  {
    lcd.print(2, 0, "Ворота закрыты"); // LCD print, column 2, row 0
    
  }
}

void openNotify() 
{
  if (garageSensorSW == !LOW) 
  {
  Blynk.notify("ворота открыты более 2 минут");
  
  }
}

void sendUptime ()
{
  Blynk.virtualWrite(BL_UPTIME,  uptime_formatter::getUptime());
}



void setup() //основная функция, выполняется один раз при подаче питания на микроконтроллер
{

  Serial.begin(115200); //открываем серийный порт

  WiFi.mode(WIFI_STA); // режим клиента
  WiFi.hostname(esp_hostname); // 
  WiFi.begin(ssid, pass);

  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }


  

  ArduinoOTA.onError([](ota_error_t error) {
    ESP.restart();
  });
  ArduinoOTA.setHostname("esp_gate_debug");
  ArduinoOTA.begin();

  Blynk.begin(auth, ssid, pass);

  // Pin mode, bootstate
  pinMode(PIN_RELAY1, OUTPUT); //объявляем D4 "выходным" пином
  pinMode(PIN_RELAY2, OUTPUT);
  pinMode(PIN_MAGNET, INPUT);
  digitalWrite(PIN_RELAY1, HIGH);
  digitalWrite(PIN_RELAY2, HIGH);



  // Setup a function with timer
  timer.setInterval(5000L, garageMagSensor);
  timer.setInterval(30000L, sendUptime);
  timer.setTimer(120000, openNotify, 3);

  // Functions to display RSSI and Ip address
  Serial.print("WiFi signal strength: ");
  Serial.println(WiFi.RSSI());

  Blynk.virtualWrite(BL_RSSI, WiFi.RSSI());
}



void loop() //основная функция, которая выполняется постоянно по кругу
{
  timer.run();
  Blynk.run(); // lets start some magic
  ArduinoOTA.handle();
}
 

Вложения

CodeNameHawk

Moderator
Команда форума
Вопрос можно ли теперь исправить это в коде, или мне придется перепаивать пин ?
https://esp8266.ru/esp8266-podkluchenie-obnovlenie-proshivki/#full
Перепаять пин будет проще, программно не решается, только аппаратно.
Типа - выход датчика через резистор на пин есп и конденсатор на +3.3V, что бы на время старта есп, был нужный уровень.
Для медленного датчика может прокатить.

Если работает от вашего блока питания, менять ничего не надо.
Проверьте танталовый конденсатор, был инфа, что попадались плохие и можете увеличить емкость электролита.
У меня esp8266 с 2.4" LCD нормально работает от дешевого китайского блока питания 5В 0,7А, через стабилизатор на 3.3В.
 
  • Like
Реакции: ac1d

ac1d

New member
Всем огромное спасибо за помощь, особенно CodeNameHawk !
Это едва ли не первый раз, когда так оперативно помогли обнаружить и решить проблему.
Перепаялся на пин D7 и все стало загружаться без проблем.

Если кто-то наткнется на тему с похожей проблемой, почитайте вот это - http://www.forward.com.au/pfod/ESP8266/GPIOpins/index.html
Если коротко, лучше избегать GPIO 0, GPIO 2, (на nodemcu D3 и D4 соответственно), т.к. для корректной загрузки они должны быть в положении HIGH.

С модулем датчиком холла осталась небольшая проблема, на борту он имеет светодиод состояния (горит при срабатывании), так вот он сейчас все время горит, только при срабатывании ярче. Подозреваю, что это не нормальный режим работы, но не могу понять - это наводки ? Сигнал от датчика на nodemcu, видимо, приходит, т.к. в блинк информация отображается корректно.

И еще один момент, похоже nodemcu создает точку доступа, хотя его об этом никто не просил.
Случайно обнаружил новую wifi сеть с именем ESP_EFFC9B. Как я понимаю, все что после ESP_ - часть mac адреса. И эта часть никак не совпадает с mac адресом nodemcu, который я вижу в списке устройств роутера.
 
Сверху Снизу