ESP-01 неправильно просыпается после глубокого сна
У меня есть ESP-01, с помощью которого я хочу измерять температуру в бассейне. Он отправит данные через MQTT брокеру.
Я подключил RST к GPIO16, чтобы использовать функцию глубокого сна. В настоящее время я тестирую отправку «hello world» брокеру MQTT, и все работает нормально при загрузке в первый раз, но кажется, что ESP никогда не просыпается правильно после первого глубокого сна.
Мой скрипт выглядит так:
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Установить режим АЦП
ADC_MODE(ADC_VCC);
// настройки Wi-Fi
const char* ssid = "Network";
const char* password = "Password";
IPAddress ip(192, 168, 0, 100);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
// настройки MQTT
const char* mqtt_server = "192.168.0.110";
const int mqtt_port = 1883;
const char* mqtt_user = "User";
const char* mqtt_pass = "Password";
const char* mqtt_client_name = "poolsensor";
const char* mqtt_topic = "pool";
// Провод данных подключен к D1 на ESP8266 ESP-01 — GPIO 5
#define ONE_WIRE_BUS 5
// Настройка экземпляра OneWire для связи с любым устройством
OneWire oneWire(ONE_WIRE_BUS);
// Передаем нашу ссылку OneWire на Dallas Temperature
DallasTemperature DS18B20(&oneWire);
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
delay(10);
// Объявить однократное соединение
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
// Настраиваем конфигурацию WiFi и подключаемся
WiFi.mode(WIFI_STA);
WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
}
void reconnect() {
// Цикл, пока мы не подключимся
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Попытка подключения
if (client.connect(mqtt_client_name, mqtt_user, mqtt_pass)) {
// Успех
Serial.println("connected");
} else {
// Неудача
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Подождите 5 секунд перед повторной попыткой
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
// Начать настройку Wi-Fi
setup_wifi();
// Установить MQTT-сервер
client.setServer(mqtt_server, mqtt_port);
// Установите разрешение на 0,25
DS18B20.setResolution(10);
// Стартовый датчик
DS18B20.begin();
}
void loop() {
if (!client.connected()) {
reconnect();
} else {
// Получить температуру
/*
DS18B20.requestTemperatures();
float temp = DS18B20.getTempCByIndex(0);
if ((temp > -20) && (temp < 60)) {
client.publish("pool/temperature", String(temp).c_str(), true);
}
*/
client.publish("pool/temperature", "hello world");
Serial.println("published temperature");
delay(1000);
// Спать
ESP.deepSleep(60 * 1000000);
delay(3000);
}
}
В последовательном мониторе все выглядит хорошо при компиляции и загрузке кода, так как код запускается в первый раз:
Connecting to Network
......
Connected, IP address: 192.168.0.100
Attempting MQTT connection...connected
published temperature
И я вижу в своем отладчике MQTT, что он получает hello world
. Примерно через 60 секунд в последовательном мониторе отображается следующее (много тарабарщины):
{l�l��|��d�|�d�b<����s�c$�#��ng�lgn���cxp��${$sd�s��'�c�ncp��
Это последнее сообщение, которое я когда-либо получал от ESP, поэтому я предполагаю, что он никогда больше не переходит в глубокий сон и снова не запускает код.
Кто-нибудь сталкивался с подобным или видел ошибку в моем коде?
@rebellion, 👍0
Обсуждение3 ответа
Вы оставили io 0 плавающим. Если io 0 не HIGH при загрузке, esp8266 переходит в режим прошивки.
Пробуждение от глубокого сна — это запуск загрузки. Таким образом, ваш код не запускается, если io 0 не вытягивается на высокий уровень. Добавьте подтягивание для io 0.
Если вы установите Serial Monitor на 74880 бод, вы увидите читаемый журнал загрузки. Он будет печатать 1 как первое значение в «режиме загрузки». Это значение устанавливается из состояний io 15, 2 и 0. 15 должно быть НИЗКИМ, а io 2 и io 0 ВЫСОКИМ для нормальной загрузки. 1
указывает, что только 2 является ВЫСОКИМ.
Спасибо за ваш ответ. Я не совсем уверен, понимаю ли я. Ни в одном руководстве, которое я читал, не говорится, что я должен тянуть 0 высоко. Я использую программатор для программирования, но у меня все еще возникает та же проблема, когда я отключаю программатор и просто подключаю VCC и GND к источнику питания., @rebellion
каждый хороший учебник esp-01 подключает EN и io 0 к VCC. Я бы использовал подтягивающий резистор, @Juraj
Вы понимаете, что состояние io 0 при загрузке определяет, загружается ли плата в приложение или в загрузчик?, @Juraj
Конечно, но раньше мне никогда не приходилось этого делать. Я использовал ESP-01 в нескольких проектах, но никогда с глубоким сном, так что это для меня в новинку., @rebellion
после загрузки запускается без перезагрузки, @Juraj
Между прочим, я обнаружил, что вам нужно подключить EN к VCC на ESP-01. но не на ESP-01S, если это проясняет ситуацию., @dandavis
да, у 01S есть подтягивания на борту, но чтобы потом прошить его ио 0 самому нужно подключить к земле, @Juraj
Хорошо, может быть, у меня на самом деле 01, а не 01S. Я проведу небольшое исследование по этому поводу., @rebellion
@ Ронни-АндреБендиксен, каков результат? ответ помог?, @Juraj
Конечно, вам понадобится подключение gpio 16 для сброса, чтобы это когда-либо работало, это сложно, но не невозможно. Почитайте здесь:
https://randomnerdtutorials.com/esp8266-deep-sleep-with-arduino-ide/
Я это сделал. Маленький медный провод от RST к GPIO16 на микросхеме., @rebellion
Извините, пропустил это. Из вашего кода выше он должен просыпаться, как и ожидалось. Как уже говорили другие, для нормальной загрузки требуется высокий уровень GPIO 0, GPIO 2 не требуется, но это хорошая практика для обеспечения стабильности. То, что вы, скорее всего, видите, и то, что я видел в прошлом, если у вас есть заземленный GPIO 0, то есть для программирования с помощью Arduino IDE, сразу после завершения программирования чип нормально перезагрузится и будет работать с заземленным GPIO 0, но только один раз. Если вы оставите GPIO 0 заземленным и снова перезагрузитесь (или чип выйдет из спящего режима), он не загрузится. Берите GPIO 0 high и должно работать., @user54057
У меня была та же проблема, и я обнаружил, что мой контакт CH_PD и контакт RST были закорочены вместе, когда я подключал провод от RST к GPIO_16. На чипе вывод CH_PD находится рядом с GPIO_16, поэтому при их замыкании вывод RST всегда высокий, поэтому esp больше не может перезагружаться без внешнего заземления. Я исправил это, и теперь глубокий сон снова работает!
- Как подключиться к MQTT брокеру с помощью TLS?
- Преобразование byte* в int в Arduino
- esp32-cam публикует изображение в mqtt
- ESP8266 глубокий сон и MQTT
- Приведение от 'char*' к 'char' теряет точность
- Публиковать данные json в mqtt
- Не удалось подключиться к брокеру MQTT через esp8266/32 и pub/sub client
- Wemos D1R2 - переход Onewire 2 DS18B20 на переменную
у вас io 0 LOW?, @Juraj
Как вы подключили что-нибудь к GPIO16 на ESP01? Кроме очень осторожного, конечно - и
D1
??? это фигня wemos/nodemcu (плюс ESP01 тоже не пробивается через gpio 5, @Jaromanda Xесли вы установите последовательный монитор на 74880 бод, то вы сможете прочитать тарабарщину, @Jaromanda X
@JaromandaX На самом деле темп. датчик еще не подключен, поэтому я закомментировал код. Я проложил тонкий медный провод от RST к нужному контакту микросхемы. Бод 74880 работал, и он читается следующим образом:
ets 8 января 2013, первая причина: 5, режим загрузки: (1,6) ets_main.c
, но только один раз и никогда больше. @Juraj нет, должен ли я использоватьpinMode (0, LOW);
?, @rebellionрежим загрузки: (1,6)
посмотрите на это, я думаю, вы находитесь в режиме "Загрузить код из UART" -должен ли я использовать pinMode(0, LOW);
нет или да, не делает разница, @Jaromanda Xрежим загрузки: (1,6)
определенно режим «Загрузить код из UART» - вам нужно убедиться, что GPIO0 (и GPIO2 - но это не кажется таким уж нестабильным на ESP01) ВЫСОКИЙ при загрузке - используйте подтягивающий резистор с GPIO0 на VCC, @Jaromanda X@dandavis, он ответил, что "я протянул тонкий медный провод от RST к нужному контакту на чипе", @Juraj
@JaromandaX У меня похожая проблема - после возвращения получаю много тарабарщины. Изменение бода на 74880 показало «режим загрузки: (3,7)». Означает ли это, что GPIO0 и GPIO2 высокие, как и должны, но что-то еще не так? DFRobot показывает на своей диаграмме, что подключен XPD, который закорочен на RESET., @Jens Munk
@JensMunk
режим загрузки: (3,?)
действительно означает, что 0 и 2 высокие, а 15 (MTDO) низкие, как и должно быть для «нормальной» загрузки - так что это не ваша проблема., @Jaromanda X