Получение сброса wdt + перезагрузка каждые 5 секунд с помощью простого кода кнопки/реле

У меня есть код для Arduino, который я адаптировал из простого кода с двумя кнопками и двумя реле, который я нашел в Интернете. Я просто умножил все, чтобы у меня было 5 кнопок/5 реле. Для этого я использую NodeMCU (ESP-12E).

Я ничего не менял, и теперь пытаюсь загрузить его на другие платы, и на ту же существующую плату, которую я использовал раньше. Каждый раз одни и те же результаты.

Я убедился, что Arduino обновлен, ссылка на диспетчер платы актуальна, и проверил код. Драйвера переустанавливал. Я пробовал использовать разные платы, такие как nodemcu 0.9, универсальный модуль esp8266 и т. д. Код проверен, сообщений об ошибках при загрузке нет.

Но каждый раз, когда я снова и снова получаю эту ошибку в последовательном мониторе:


 ets Jan  8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x4010f000, len 1392, room 16 
tail 0
chksum 0xd0
csum 0xd0
v3d128e5c
~ld

А вот код, который я использую: (Но имейте в виду, что это РАБОТАЕТ и работало раньше)


 ets Jan  8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x4010f000, len 1392, room 16 
tail 0
chksum 0xd0
csum 0xd0
v3d128e5c
~ld

Если я погуглю эту ошибку, то получу множество результатов, которые до сих пор мне не помогли. Любая помощь или понимание того, как я могу лучше понять эту ошибку, с чего начать и что мне нужно сделать, чтобы этот «простой» скетч заработал, были бы потрясающими. Я в замешательстве, и все, что мне нужно, это простая рабочая панель освещения.

, 👍0

Обсуждение

это выглядит как сообщение о состоянии, а не сообщение об ошибке, @jsotola

Но при этом он перезагружается снова и снова и каждый раз показывает сообщение., @Coltography

это не означает, что это сообщение об ошибке .... это могут быть сообщения о статусе загрузки ... похоже, что чип находится в неправильном состоянии ... может быть что-то не так с вашей макетной платой, если вы ее используете ... , или сторожевой таймер установлен неправильно, @jsotola

Я думаю, что это коричневый, @Juraj

С 5 реле работало?, @orithena

@orithena да, это так. я изменил gpio9 на gpio2 и теперь он перестал перезагружаться каждые 10 секунд., @Coltography

io 9 используется QIO для флэш-памяти, @Juraj


3 ответа


Лучший ответ:

0

Для тех, у кого есть похожая проблема, я разобрался. GPIO 9 нельзя было использовать для реле/выхода по какой-либо причине. Хотел бы я знать, почему. Переключил на GPIO2 (D4) и перезагрузки прекратились.

,

Контакты 6–11 на большинстве NodeMCU используются для подключения встроенной флэш-памяти SPI и не рекомендуются для использования в качестве общих контактов ввода-вывода., @StarCat

@starcat Я понимаю это, но я просто нахожу странным, что пин 9 работал в прошлом, ничего не изменилось, а теперь волшебным образом не работает., @Coltography

@Coltography Нашел виновника. GPIO9 и GPIO10 нельзя использовать на платах, использующих доступ Quad-IO Flash SPI (для которого требуется 4 линии данных вместо 2 на Dual-IO Flash). Кажется, что некоторые платы NodeMCU действительно используют DIO, некоторые другие используют QIO — и на этих платах QIO возня с контактами Flash SPI, похоже, запускает сторожевой таймер, который затем перезагружает чип. Вот схемы с комментариями по GPIO9: https://www.esp8266.com/wiki/lib/exe/fetch.php?media=schematic_esp-12e.png — и вот проблема в ядре Arduino ESP8266: https:/ /github.com/esp8266/Arduino/issues/1446, @orithena


0

Первое, что вам нужно понять, это то, что установленный извне статус трех контактов GPIO определяют режим загрузки для ESP8266, используемого на вашем NodeMCU. Поэтому вы должны позаботиться о том, чтобы ваша внешняя проводка не мешала режиму загрузки:

  • GPIO15/D8 при загрузке должен иметь НИЗКИЙ уровень (т. е. нельзя подключать внешние подтягивающие резисторы между D8 и 3,3 В)
  • GPIO2/D4 должен быть ВЫСОКИМ при загрузке (т. е. между D4 и GND нельзя подключать внешние подтягивающие резисторы)
  • GPIO0/D3 не должен иметь подтягивающих/понижающих резисторов, чтобы чип USB-to-serial мог переключаться между режимами RUN и FLASH.

Кроме того, длительное удержание GPIO16/D0 в НИЗКОМ состоянии во время работы может привести к нежелательным побочным эффектам, например срабатыванию сторожевого таймера, особенно если производитель платы решил добавить резистор пробуждения глубокого сна между D0 и RST (скорее всего, у вас есть клон NodeMCU, так что это действительно возможно).

Поэтому вполне может быть, что вам нужно изменить логику кнопки на GPIO15/D8 (т.е. подключить кнопку между D8 и 3,3 В). Также может быть, что нумерация контактов на вашем NodeMCU сбивает с толку; лучше использовать константы D0-D10.

В зависимости от типа ваших реле они могут работать и как подтягивающий/понижающий резистор, что еще больше усугубляет путаницу.

Я бы попробовал этот скетч без каких-либо подключений (без кнопок, без реле), и когда он заработает, я бы добавил кнопки и реле одну за другой, пока вы не найдете виновника. Иногда может быть достаточно поменять местами реле и кнопку, иногда нужно поменять местами логику кнопки.

Я бы сказал, что использование любого ESP8266 с таким количеством линий ввода/вывода требует очень тщательного рассмотрения того, куда что подключать. Выводы GPIO на Arduino Nano не задействованы ни в режиме загрузки, ни в сторожевом таймере, так что, по крайней мере, здесь вы не получите никаких помех.

,

Здравствуйте, спасибо за подробный ответ. У меня ничего не подключено к nodemcu, так что, к сожалению, исключаются какие-либо проблемы с gpio. Чего я не понимаю, так это того, как этот точный код находится на другом nodemcu без проблем, но я загрузил его на 3+ другие платы и теперь получил этот постоянный цикл сбоя / загрузки., @Coltography


0

Согласно

,

Я собирался предложить добавить сон (1). великие умы думают одинаково..., @dandavis

AFAIK yield() подразумевается при каждом повторении цикла(), @StarCat

Но почему это должно работать на другом nodemcu без этого? И куда бы я поместил часть кода delay()?, @Coltography