• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
 
Сверху Снизу