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, поэтому я предполагаю, что он никогда больше не переходит в глубокий сон и снова не запускает код.

Кто-нибудь сталкивался с подобным или видел ошибку в моем коде?

, 👍0

Обсуждение

у вас 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


3 ответа


1

Вы оставили 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


2

Конечно, вам понадобится подключение 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


1

У меня была та же проблема, и я обнаружил, что мой контакт CH_PD и контакт RST были закорочены вместе, когда я подключал провод от RST к GPIO_16. На чипе вывод CH_PD находится рядом с GPIO_16, поэтому при их замыкании вывод RST всегда высокий, поэтому esp больше не может перезагружаться без внешнего заземления. Я исправил это, и теперь глубокий сон снова работает!

,