D1 mini не возобновляет работу, как ожидалось, после глубокого сна
Я пытаюсь заставить D1 mini возвращать работу после ESP.deepsleep()
. Приведенный ниже код компилируется и дает ожидаемый результат для первого запуска. Через пять секунд после объявления о том, что устройство переходит в спящий режим, на бортовом светодиоде происходит короткая вспышка, и я получаю строку мусора на последовательном мониторе. Будем признательны за идеи, которые можно попробовать.
// Тестирование глубокого сна d1 mini
// D0 и RST соединены
/* platformio.ini:
[env:d1_mini]
platform = espressif8266
board = d1_mini
framework = arduino
monitor_speed = 115200
*/
#include <Arduino.h>
void blink();
void setup() {
Serial.begin(115200);
pinMode(D0, WAKEUP_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
blink();
delay(1000);
Serial.println("Going for some deep sleep");
ESP.deepSleep(5e6); // 5e6 это 5 секунд
}
void blink() {
digitalWrite(LED_BUILTIN, LOW);
delay(500);
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
}
Как вы можете догадаться, я запускаю это на платформе. Вывод на серийный монитор:
stefan@Cameron ~/.../Projects/Deep sleep $ platformio device monitor --baud 115200
--- Miniterm on /dev/ttyUSB0 115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Going for some deep sleep
sl␀l��|␀�l�|␂␌␌␄�␄l�␌c|ǃ␃�␛�r�cd�c��gg�doo���␌cpp��$sd{d␛�{��o�c�gbx␀�
При первом запуске светодиод мигает, после кажущегося сброса тоже ничего.
@SEngstrom, 👍0
Обсуждение2 ответа
Попробуйте очистить всю память. Может быть, есть что-то, что портит его.
Я попробовал ваш код, и он у меня работает. У меня нет D1 mini, но я не вижу причин, чтобы он не работал. (по аппаратным причинам)
Я бы включил задержку, а затем выводил новую строку в настройках. Так как ваш цикл print пишется после информации о загрузке и теряется в конце строки.
Как я уже сказал, ваш код у меня сработал. Но я нахожу это более удобным для пользователя. https://raw.githubusercontent.com/wemos/D1_mini_Examples/ master/examples/02.Special/DeepSleep/Blink/Blink.ino
Проверьте еще раз свои соединения. (Я уверен, вы делали это десятки раз)
Спасибо. Сделал то, что я думаю, это сброс прошивки, подключив D3 к GND на 5 секунд. Добавлена задержка и Serial.println()
в setup()
. Те же результаты. Я наткнулся на ссылку, которую вы предложили ранее, но нет никакой разницы, если я поместил все это в setup()
.
Кажется, дело не только в том, что последовательная связь нарушена, blink()
все равно должно произойти, если код попадет туда (и он должен снова сбросить немного позже)., @SEngstrom
Ага. Как я уже сказал, ваш код работает. (хотя мне это не нравится) У вас есть другая плата, которую вы можете попробовать?, @Rudy
Я думаю, что @Rudy прав. Я только что попробовал код на D1 mini, и он отлично работает для меня. Вы можете полностью сбросить прошивку с помощью PlatformIO с помощью такой команды (возможно, вам потребуется изменить серийное имя устройства): ~/.platformio/packages/tool-esptool/esptool -vv -cd nodemcu -cb 115200 -cp /dev/ cu.usbserial-1430 -ce, @romkey
Спасибо, Джон - выполнение этого приводит к: stefan@Cameron ~ $ ~/.platformio/packages/tool-esptool/esptool -vv -cd nodemcu -cb 115200 -cp /dev/cu.usbserial-1430 -ce – esptool v0.4.13 - (c) 2014 гл. Клиппель <[email protected]> настройка платы на nodemcu установка скорости передачи от 115200 до 115200 установка порта с /dev/ttyUSB0 на /dev/cu.usbserial-1430 espcomm_erase_flash открытие порта /dev/cu.usbserial-1430 на 115200 ошибка: невозможно получить доступ к /dev/cu.usbserial-1430, @SEngstrom
кажется, был некоторый успех, но никаких изменений в поведении при запуске кода., @SEngstrom
@rudy - я попробовал другую ранее не использовавшуюся плату и тот же результат. Жаль, что вам не нравится мой код :), @SEngstrom
@SEngstrom ошибка при очистке флэш-памяти означает, что имя последовательного порта (/dev/ttycu.usbserial-1430) неверно - если вы хотите попробовать это еще раз, вам нужно найти правильный вариант для вашей системы. Платформио, вероятно, где-то его печатает. Вероятно, только часть «1430» будет другой., @romkey
@JohnRomkey еще раз спасибо - я выполнил эту команду esptool
, но не играл в кости., @SEngstrom
Это мусор из-за того, что ESP8266 выводит загрузочную информацию на 76800. Это должно включать причину загрузки и может помочь вам понять, почему код не работает должным образом.
Попробуйте изменить серийную скорость на 76800 в своем коде (чтобы ваши сообщения не превратились в тарабарщину), используйте 76800 на мониторе платформы, и вы сможете по крайней мере увидеть, что D1 говорит, что он делает.
Вы должны увидеть строку, которая заканчивается чем-то вроде:
первая причина: x, режим загрузки: (y, z)
x должен быть равен 1 ("Power reboot"), 2 ("Внешний сброс или выход из глубокого сна" - очевидно, что ты хочешь), 3 ("Software WDT" - сработал программный сторожевой таймер) или 4 ("аппаратный сброс WDT" - сработал аппаратный сторожевой таймер)
режим загрузки указывает, откуда был получен образ среды выполнения — y должно быть равно 3 ("Flash"); что-либо другое действительно маловероятно для вашей установки.
Подробнее об этом см. Причины сброса ESP8266. и обычный фатальный Причины исключения
Если попробуете, отпишитесь, как получилось! Я хотел бы услышать больше о том, что здесь происходит.
Большое спасибо! Скорость передачи в бодах подходит для захвата этого «мусора» — это результат после установки последовательной скорости на 76800 везде:
`
stefan@Cameron ~/.../Projects/Deep sleep $ platformio device monitor --baud 76800
--- Минитерм на /dev/ttyUSB0 76800,8,N,1 ---
--- Выход: Ctrl+C | Меню: Ctrl+T | Справка: Ctrl+T, затем Ctrl+H ---
Привет, я сейчас в настройке
Идти на глубокий сон
ets 8 января 2013, первая причина: 5, режим загрузки: (1,6)
ets_main.c`
, @SEngstrom
Не знаю, как форматировать код в комментариях..., @SEngstrom
Таким образом, причиной сброса было пробуждение из глубокого сна. Отклонение в режиме загрузки - это то, что мне придется покопаться завтра., @SEngstrom
Да, к сожалению, нет хорошего способа форматирования комментариев :( Меня все время кусает. Режим загрузки 1 должен означать, что он пытается загрузиться через UART (загрузить новый код), а не через флэш-память. У вас есть что-нибудь подключенное к D3 или D4? Если вы попытаетесь отключить их или попробовать подключить D3 к 3,3 В через резистор с высоким значением (скажем, 47K или более, значение не должно иметь большого значения). /esp8266/esp8266-wiki/wiki/Boot-Process#esp-boot-modes, @romkey
Таким образом, 1 в режиме загрузки (1,6), по-видимому, означает, что мой d1 mini ожидает загрузки кода из UART, как вы говорите: https://github.com/esp8266/esp8266-wiki/wiki/Boot-Process# esp-boot-режимы Это сообщение не имеет большого смысла для меня. Отправка кода по серийному номеру не похожа на то, что может запросить *правление*. В любом случае - немного разочарован этим - я ценю весь вклад людей, но пока глубокий сон ускользает от меня., @SEngstrom
@SEngstrom - да, плату можно принудительно перевести в режим, в котором она загружает код, предоставленный через последовательный порт, что здесь определенно бесполезно. Поэтому я и спрашивал о линиях D3 и D4 на плате - они куда-нибудь распаяны? Именно они контролируют режим загрузки. Если они ни к чему не подключены, попробуйте принудительно установить высокий уровень D3 и низкий уровень D4 — это должно перевести ESP8266 в режим, в котором он загружается из флэш-памяти SPI., @romkey
Когда у меня высокий уровень D3 и низкий уровень D4, встроенный светодиод загорается и продолжает гореть, и я больше не могу разговаривать с платой. Однако теперь у меня появляется режим загрузки: (3,6) вместо того, чтобы после выдергивания D3, D4 тянет, но все равно останавливается после сообщения о том, что после глубокого сна пробуждение., @SEngstrom
Похоже, между вашим D1mini и моим есть что-то другое. У меня почти нет идей, извините! Как сказал @Rudy, это должно работать (и я вижу, что это работает с той же настройкой). Я опубликую новый комментарий, если я смогу придумать что-нибудь еще, чтобы попробовать., @romkey
- ESP8266 — Отправка команды сброса программного обеспечения
- Nodemcu 1.0 и режим загрузки (1,6) после мягкого сброса
- Трассировка стека сброса ESP12E Soft WDT ведет к библиотекам
- ESP8266 сброшен из-за подключения реле / переменного тока
- ESP8266 всегда сбрасывается после 65 секунд работы
- Сброс глубокого сна с датчиком удара
- ESP8266-01 Сброс при работе двигателя постоянного тока
- Strip.clear() не очищает/отключает полосу NeoPixel после сброса ESP8266.
У меня такая же проблема после глубокого сна. Вот код ошибки @74880bps: epc1=0x40100000, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000 Фатальное исключение (0): но когда я вижу эту проблему, если я вручную нажимаю кнопку сброса или вручную подключаю RESET на GND, плата перезагружается и перезапускает мой код, как и ожидалось. Только пробуждение из глубокого сна вызывает эту проблему. Вы исправили свою проблему? Спасибо,, @gbetous