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

Нужна помощь Почему не работает (nodemcu)

DanSV

New member
Всем доброго времени суток!
Сделал простую программу, не могу понять, почему контроллер зависает (пример коде ниже).
Подскажите, что я делаю не так.

Работаю с модулем nodemcu v3, Arduino IDE
Порт 9, 10, 14 не подключены.

Код:
unsigned long ontime_read= millis();;
unsigned long ontime_send=millis();
int flag=0;


void setup()
{
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(10, OUTPUT);
digitalWrite(10 , LOW);
pinMode(9, INPUT);
pinMode(14, OUTPUT);
digitalWrite(14 , LOW);

}

void loop() {
// put your main code here, to run repeatedly:

  Send_signal();
  Read_signal();
//Serial.println("123");
}

void Send_signal()
{
  if(millis() - ontime_send > 5000)
{
  digitalWrite(10 , HIGH);
  delay(200);
  digitalWrite(10 , LOW);
  ontime_send=millis();
  Serial.println("Send signal!!!");
  }
return;
}


void Read_signal()
{
  if (digitalRead(9) != flag)
  {
    flag = digitalRead(9);
    ontime_read= millis();
    Serial.println("The signal received");
  
  }
  else
  { if( millis() - ontime_read > 30000)
    {
     digitalWrite(14 ,HIGH);
     delay(200);
     digitalWrite(14 , LOW);
     ontime_read= millis();
     flag = 0;
     Serial.println("No signal timeout!!!");
    }
  }
  return;
}
 

Алексей.

Active member
DanSV, Вы вызываете статическую инициализацию глобальных переменных ontime_read и ontime_send вызывая millis() как говорится в "дырке" за мэйном, что можно вызывать пока не вызван void setup() а что нельзя я не знаю, но вызов millis() вешает возможно вешает выполнение, перенесите инициализацию в setup

Код:
unsigned long ontime_read = 0;
unsigned long ontime_send = 0;
int flag = 0;

void setup() {
  ontime_read = millis();
  ontime_send = millis();
 
Последнее редактирование:

DanSV

New member
DanSV, Вы вызываете статическую инициализацию глобальных переменных ontime_read и ontime_send вызывая millis() как говорится в "дырке" за мэйном, что можно вызывать пока не вызван void setup() а что нельзя я не знаю, но вызов millis() вешает выполнение, перенесите инициализацию в setup

Код:
unsigned long ontime_read = 0;
unsigned long ontime_send = 0;
int flag = 0;

void setup() {
  ontime_read = millis();
  ontime_send = millis();
Не помогло, в мониторе:
The signal received
Send signal!!!
Send signal!!!
Send signal!!!
Send signal!!!
Send signal!!!
⸮⸮⸮⸮⸮ - подвис контроллер
 

DanSV

New member
Не помогло, в мониторе:
The signal received
Send signal!!!
Send signal!!!
Send signal!!!
Send signal!!!
Send signal!!!
⸮⸮⸮⸮⸮ - подвис контроллер
Проблема в смене значений на портах 14 и 10, если комментирую эти строки все работает, порты менял все равно этот баг.
 

=AK=

New member
Проблема в смене значений на портах 14 и 10, если комментирую эти строки все работает, порты менял все равно этот баг.
Может, он у вас подвисает из-за входного порта 9, который никуда не подключен. Пока в порту 10 все тихо, оно еще работает кое-как, а когда начинаете его дергать, то наводка на висящий в воздухе соседний входной порт 9 подвешивает ESP.
 

Алексей.

Active member
У меня ничего не подключено, нодамсу в3
получаю The signal received и через таймаут получаю перезагрузку по wdt
 

DanSV

New member
Может, он у вас подвисает из-за входного порта 9, который никуда не подключен. Пока в порту 10 все тихо, оно еще работает кое-как, а когда начинаете его дергать, то наводка на висящий в воздухе соседний входной порт 9 подвешивает ESP.
Ну может и так, попробую их подтянуть через резистор на землю. Вообще думал что в nodemcu они уже подтянуты.
 

DanSV

New member
У меня ничего не подключено, нодамсу в3
получаю The signal received и через таймаут получаю перезагрузку по wdt
Да, именно в этом и проблема, не понятно почему wdt срабатывает, можно попробовать его отключить и посмотреть что получится.
Вечером проверю.
 

enjoynering

Well-known member
а не может здесь быть проблемы в этом

Код:
pinMode(10, OUTPUT);
digitalWrite(10 , LOW);
pinMode(9, INPUT);
pinMode(14, OUTPUT);
digitalWrite(14 , LOW);
вы начали использовать GPIO 10, 9 которые используются при работе внутренней флеш. ESP8266 не может прочитать данные из памяти и крашится.
 

Алексей.

Active member
enjoynering, да, действительно, у esp8266 нет встроенной флеши, для подключения используются gpio6-gpio11 выведенные на пины 9-14(esp-12), о чем и предупреждает ai-thinker
Note: The pins 9 to 14 are exclusively used for Quad-SPI communication with flash memory. They can't be used for application!
Так что можно и не пытаться переопределить функцию для gpio9, жаль, а так хотелось...
 

Вложения

DanSV

New member
Всем большое спасибо. Да... портов то негусто получается свободных (в моем проекте нужно больше). Похоже придется использовать комбинированное решение nodemcu + arduino pro mini по SPI.
Сразу появилась идея, помимо основных функций, сделать их WD друг для друга.
Вопрос: На порт RES nodemcu v3 можно подать сигнал (HIGH) для перезагрузки с другого контроллер или нужно будет делать обвязку по схеме подключения ESP8266?
 

enjoynering

Well-known member
можно приколхозить MCP23017 MCP23017 - Interface- Serial Peripherals
и рулить по i2c шине. главное не использовать глючный i2c драйвер (он же wire.h) от создателей фреймворка для esp8266 arduino.

вот этот получше будет, с ним ничего не виснет и не перегружается - GitHub - enjoyneering/ESP8266-I2C-Driver: Bug fixes of native Arduino ESP8266 core I2C Driver
 
Сверху Снизу