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

, 👍1

Обсуждение

Я добавил 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


2 ответа


0

Я предполагаю, что у вас есть состояние гонки между автоматическим подключением к 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


1

В вопросе ОП сказал:

Я припаял провод от GPIO16 к RST.

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

ESP8266, установленный на плате ESP-01, не выйдет из режима глубокого сна, поскольку сигнал пробуждения ESP8266 не подключен к выводу сброса ESP8266 на плате ESP-01. Вам нужно добавить это соединение, что может быть сложно для большинства людей. Вы можете увидеть модификацию на этой картинке: ... который взят из эти инструкции.

Если это слишком сложно, рассмотрите возможность использования другой платы ESP8266, которая выводит эти контакты ESP8266 на краевые разъемы платы.

,