ESP-01 Глубокий сон - не просыпается должным образом
У меня есть проект измерения температуры/влажности с использованием ESP-01 и DHT11. Я хочу иметь возможность перевести t в глубокий сон, чтобы продлить срок службы батареи. Я припаял провод от GPIO16 к RST.
#include <SimpleTimer.h> //https://github.com/jfturc или SimpleTimer
#include <ESP8266WiFi.h>
#include <PubSubClient.h> //https://github.com/knolleary/pubsubclient
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h> //https://github.com/esp8266/Arduino/tree/master/libraries/ArduinoOTA
#include "DHT.h"
// НАСТРОЙКА ПОЛЬЗОВАТЕЛЯ НАЧАЛО РАЗДЕЛА//
#define DHTPIN 2 // к какому цифровому выводу мы подключены
const char* ssid = "mySSID";
const char* password = "password";
const char* mqtt_server = "mqttserverip";
const int mqtt_port = 1883;
const char *mqtt_user = "usser";
const char *mqtt_pass = "pass";
const char *mqtt_client_name = "DryerMCU"; // Клиентские соединения не могут иметь одинаковое имя соединения
//КОНФИГУРИРОВАННЫЙ ПОЛЬЗОВАТЕЛЕМ РАЗДЕЛ КОНЕЦ//
// Раскомментируйте любой тип, который вы используете!
#define DHTTYPE DHT11 // DHT 11
//#определить DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#определить DHTTYPE DHT21 // DHT 21 (AM2301)
// Инициализировать датчик DHT.
// Обратите внимание, что более ранние версии этой библиотеки принимали необязательный третий параметр для
// настроить тайминги для более быстрых процессоров. Этот параметр больше не нужен
// поскольку текущий алгоритм чтения DHT настраивается для работы с более быстрыми процессами.
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
SimpleTimer timer;
bool boot = true;
int status = WL_IDLE_STATUS;
//Функции
void setup_wifi()
{
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void getTemperature()
{
// Чтение температуры или влажности занимает около 250 миллисекунд!
// Показания датчика также могут быть «старыми» до 2 секунд (это очень медленный датчик)
float h = dht.readHumidity();
// Чтение температуры в градусах Цельсия (по умолчанию)
float t = dht.readTemperature();
// Чтение температуры в градусах Фаренгейта (isFahrenheit = true)
float f = dht.readTemperature(true);
// Проверяем, не завершились ли какие-либо операции чтения, и выходим досрочно (чтобы повторить попытку).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Расчет теплового индекса в Фаренгейтах (по умолчанию)
float hif = dht.computeHeatIndex(f, h);
// Расчет теплового индекса в градусах Цельсия (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
char temperature[50];
char humidity[50];
// Обновить температуру и влажность
String temp_str = String(f);
temp_str.toCharArray(temperature, temp_str.length() + 1);
client.publish("dryer/temperature", temperature);
String hum_str = String(h);
hum_str.toCharArray(humidity, hum_str.length() + 1);
client.publish("dryer/humidity", humidity);
}
void setup() {
Serial.begin(38400);
delay(2000);
Serial.println("Booting");
dht.begin();
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
getTemperature();
Serial.println("Going to sleep");
ESP.deepSleep(10000000,RF_DEFAULT);
}
void loop() {
}
Когда я запускаю его, он выполняет одно измерение, переходит в спящий режим, а затем просыпается, но после пробуждения ничего не происходит. Последовательный вывод:
Booting
Connecting to SSID
......
WiFi connected
IP address:
mqttip
Humidity: 51.00 % Temperature: 20.00 *C 68.00 *F Heat index: 19.39 *C 66.90 *F
Going to sleep
ets Jan 8 2013,rst cause:5, boot mode:(3,7)
ets_main.c
@Brian, 👍1
Обсуждение2 ответа
Я предполагаю, что у вас есть состояние гонки между автоматическим подключением к WiFi с помощью Espressif SDK и вашим WiFi.begin(). У вас есть два варианта, как это решить.
1. option: Не используйте WiFi.begin в этом скетче. Используйте утилиты скетча, чтобы установить SSID и пароль, и SDK сохранит их во флэш-памяти. Затем он может быстро подключаться к WiFi, особенно при перезагрузке, потому что у него есть номер канала WiFi в памяти RTC, который не очищается при перезагрузке (только при отключении питания).
2. опция: включить запоминание SSID и пароля и автоматическое подключение при старте. Тогда esp8266 будет подключаться к WiFi только с вашим вызовом WiFi.begin
. Команды: WiFi.persistent(false)
и WiFi.setAutoConnect(false)
.
Вы также можете отключить SoftAP. По умолчанию он запускается автоматически. Команда WiFi.softAPdisconnect()
Я не думаю, что проблема связана с Wi-Fi вообще. Я полностью убрал код, чтобы он просто перешел в глубокий сон, и я получаю такое же поведение., @Brian
@ Брайан, попробуй setAutoConnect(false). автоматическое подключение начинается до скетча, @Juraj
В вопросе ОП сказал:
Я припаял провод от GPIO16 к RST.
Но я собираюсь опубликовать ответ для людей, которые нашли этот вопрос и нуждаются в инструкциях по модификации ESP-01, чтобы вывести модуль ESP-01 из глубокого сна:
ESP8266, установленный на плате ESP-01, не выйдет из режима глубокого сна, поскольку сигнал пробуждения ESP8266 не подключен к выводу сброса ESP8266 на плате ESP-01. Вам нужно добавить это соединение, что может быть сложно для большинства людей. Вы можете увидеть модификацию на этой картинке: ... который взят из эти инструкции.
Если это слишком сложно, рассмотрите возможность использования другой платы ESP8266, которая выводит эти контакты ESP8266 на краевые разъемы платы.
- Как читать и записывать EEPROM в ESP8266
- Как сделать выводы Tx и Rx на ESP-8266-01 в выводах GPIO?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Как заставить 5-вольтовое реле работать с NodeMCU
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
- ESP8266 не подключается к Wi-Fi
- AT-команда не отвечает на последовательный монитор
- Разница между этими двумя платами NodeMCU?
Я добавил Serial.println("проснулся"); сразу после ESP.DeepSleep, и он никогда не печатает эту строку. Кроме того, у меня сложилось впечатление, что метод setup() вызывается снова, когда он просыпается, как будто он только что был сброшен., @Brian
Это не помогло. Он по-прежнему ничего не делает после ESP.DeepSleep., @Brian
сократите свой код до минимума... пример кода находится здесь, в "базовом глубоком сне"... https://www.losant.com/blog/making-the-esp8266-low-powered-with-deep-sleep.. .. я был очень не прав, помещая код в цикл () ... похоже, что esp сбрасывается, когда он просыпается, @jsotola
Я попробовал самую базовую версию по вашей ссылке и все равно получаю тот же результат. Кажется, что он спит, но после пробуждения ничего не запускается. Что еще это может быть?, @Brian
Пожалуйста, опубликуйте изображение, на котором показан провод, который вы припаяли к схеме., @jsotola
Делал такой же проект. Используется ESP-Now вместо обычного протокола WIFI и 3 платы ESP8266 ESP-01 (1 для датчика и 2 для создания моста ESP-Now к WIFI). Я отказался от DHT11, так как у меня был один сбой в очень трудном месте, и я переключился на Si7021. Удаленный ESP-01, который переходит в спящий режим, необходимо модифицировать, чтобы встроенный таймер мог его разбудить. Бегает на улице уже больше 2-х месяцев. Следует действительно отправить этот код обратно на github. Добавьте комментарий, если вы хотите попробовать этот маршрут вместо обычного WIFI., @st2000
Я бы попробовал поставить
Serial.flush();
перед глубоким сном., @Gerben