• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Высокий ток в режиме сна на ESP8266-01

ArDi

New member
Доброго времени суток всем.
Есть проблема: в режиме DeepSleep модуль ESP8266-01 потребляет примерно 30мА, хотя вроде должен в пределах микроампер. Во время работы потребление вроде адекватное, в районе 100мА.
Проект - отправка данных с DHT-22 датчика на свой веб-сервер раз в 10 минут. Поэтому нужен DeepSleep, дабы не разряжать аккумулятор.
Для пробуждения из сна пропаял Wake ногу МК к Reset пину.
В попытках снизить потребление выпаял оба светодиода, результата никакого не дало.

Можеть есть у кого идеи, откуда такое высокое потребление во сне?
Код:
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <ESP8266HTTPClient.h>
#include <DHTesp.h>

#define DEBUG_MODE 0
#define DHT_PIN 0
#define SLEEP_TIME 10 * 1e6

ADC_MODE(ADC_VCC);
DHTesp dht;

void setup() {
    #ifdef DEBUG_MODE
        Serial.begin(115200);
    #endif
    WiFiManager wifiManager;
    wifiManager.autoConnect("WeatherSensor");

    #ifdef DEBUG_MODE
        Serial.println(ESP.getVcc());
        Serial.println("WiFi connected...");
        Serial.println();
        Serial.println("Status\tHumidity (%)\tTemperature (C)\tHeatIndex (C)");
    #endif

    dht.setup(DHT_PIN, DHTesp::DHT22);

    float humidity = NAN;
    float temperature = NAN;
    int attempts = 5;
    do
    {
        delay(2000);
        humidity = dht.getHumidity();
        temperature = dht.getTemperature();
        attempts--;
    } while (isnan(temperature) && attempts);
   
    #ifdef DEBUG_MODE
        Serial.print(dht.getStatusString());
        Serial.print("\t");
        Serial.print(humidity, 1);
        Serial.print("\t\t");
        Serial.print(temperature, 1);
        Serial.print("\t\t");
        Serial.print(dht.computeHeatIndex(temperature, humidity, false), 1);
    #endif
   
    if (!isnan(temperature)) {
        HTTPClient http;
        http.begin("<URL>");
        http.addHeader("Content-Type", "application/json");
        http.POST(String(String("{\"temp\": ") + temperature + String(", \"hum\":") + humidity + String("}")));
        http.writeToStream(&Serial);
        http.end();
    }

    delay(2000);
   
    ESP.deepSleep(SLEEP_TIME);
}

void loop()
{
}
 

nikolz

Well-known member
возможно у вас программа виснет в цикле и не доходит до deepsleep
 

enjoynering

Well-known member
nikoloz прав

возможно у вас программа виснет в цикле и не доходит до deepsleep
у вас весь код в setup :). esp спит одни раз (потому что setup запускается один раз при старте), а потом молотит без остановки пустой главный цилк loop()
 

ArDi

New member
nikoloz прав



у вас весь код в setup :). esp спит одни раз (потому что setup запускается один раз при старте), а потом молотит без остановки пустой главный цилк loop()
Вроде во всех примерах со Sleep'ом он находится в setup'e. После Sleep'a он дергает ногу Wake, которая в свою очередь дергает Reset и МК перезагружается. Это работает, т.к. код отправки данных из setup'а срабатывает также с каждый пробуждением (в данном случае каждые 10 секунд)
 

CodeNameHawk

Moderator
Команда форума
у вас весь код в setup :). esp спит одни раз (потому что setup запускается один раз при старте), а потом молотит без остановки пустой главный цилк loop()
Это не при чем, выход из сна через ресет.
А вот, то что минимальное время работы 4 секунды, а если датчик не ответит то целых 12 секунд.
 

CodeNameHawk

Moderator
Команда форума
Это работает, т.к. код отправки данных из setup'а срабатывает также с каждый пробуждением (в данном случае каждые 10 секунд)
Проверьте, увеличив время сна до минуты, а то и время для подключения к сети бывает долгим.
 

CodeNameHawk

Moderator
Команда форума
Не ясно куда он должен подключиться
Код:
 http.begin("<URL>");
Попробуйте выкиньте из программы
Код:
   if (!isnan(temperature)) {
        HTTPClient http;
        http.begin("<URL>");
        http.addHeader("Content-Type", "application/json");
        http.POST(String(String("{\"temp\": ") + temperature + String(", \"hum\":") + humidity + String("}")));
        http.writeToStream(&Serial);
        http.end();
    }
И покажите, что выводит есп в сом порт.
 

alexlaw

Member
Тоже попробовал поэксперементировать с таким esp.
Получилась странная вещь.
С амперметром esp не стартует, без амперметра все нормально.
Не стартует - т.е. в монитор порта ничего не выводится, точки доступа нет.
 

Вложения

alexlaw

Member
Код:
//arduino 1.8.2
//Generic ESP8266 Module
//Flash Size  1M(64K SPIFFS)
#include <ESP8266WiFi.h>        //Содержится в пакете
#include <ESP8266WebServer.h>   //Содержится в пакете
#include <OneWire.h>            // Подключаем библиотеку Wire
#include <DallasTemperature.h>  // Подключаем библиотеку DallasTemperature
//#include <ESP8266WiFiMulti.h>
#define ONE_WIRE_BUS 2                                  // Указываем, к какому выводу подключена датчик
#define SLEEP_TIME 60 * 1e6
ADC_MODE (ADC_VCC);
float voltag;
int v;
//ESP8266WiFiMulti wifiMulti;
IPAddress apIP(192, 168, 4, 1);

// Web интерфейс для устройства
ESP8266WebServer HTTP(80);
const int analogInPin = A0;
int Value = 0;
String _ssidAP = "LAW_ESP8266";   // SSID AP точки доступа
String _passwordAP = "30272609"; // пароль точки доступа
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
void setup() {
Serial.begin(9600);
delay(10);                                            // Пауза 10 мкс
Serial.println("Step 1-DS18B20 begin");
DS18B20.begin();                                      // Инициализация DS18B20

//Serial.println("");
Serial.println("Step 2-WIFIinit");
//Запускаем WIFI
WIFIinit();
//Настраиваем и запускаем HTTP интерфейс
HTTP_init();
Serial.println("Step 3 - WebServer");
}

void loop() {
HTTP.handleClient();
delay(1);
}

Код:
void HTTP_init(void) {
HTTP.onNotFound(handleNotFound); // Сообщение если нет страницы.
HTTP.on("/", handleRoot); // Главная страница http://192.168.4.1/
HTTP.on("/restart", handle_Restart); // Перезагрузка модуля по запросу вида http://192.168.4.1/restart?device=ok
HTTP.on("/sleep0", handle_Sleep0);
HTTP.on("/sleep1", handle_Sleep1);
HTTP.on("/sleep2", handle_Sleep2);
HTTP.on("/analog", handle_Analog);
// Запускаем HTTP сервер
HTTP.begin();
}

// Ответ если страница не найдена
void handleNotFound(){
String message = "File Not Found\n\n";
message += "URI: ";
message += HTTP.uri();
message += "\nMethod: ";
message += (HTTP.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += HTTP.args();
message += "\n";
for (uint8_t i=0; i<HTTP.args(); i++){
   message += " " + HTTP.argName(i) + ": " + HTTP.arg(i) + "\n";
}
HTTP.send(404, "text/plain", message);
}
void handle_Analog() {
//Value = analogRead(analogInPin);
v=ESP.getVcc ()/10;
voltag=v/100;
//String message = "analogValue = ";
//message += Value;
String message = "Power = ";
message += voltag;
message += " B";    
HTTP.send(200, "text/plain", message);
}
// Ответ при обращении к основной странице
void handleRoot() {
      DS18B20.requestTemperatures();                   // Запрос на считывание температуры
String message = "Temp = ";
message += DS18B20.getTempCByIndex(0); 
message += " *C";   
HTTP.send(200, "text/plain", message);
v=ESP.getVcc ()/10;
voltag=v/100;
message += " Power = ";
message += voltag;
message += " B";
Serial.println(message);
}

// Перезагрузка модуля по запросу вида http://192.168.4.1/restart?device=ok
void handle_Restart() {
String restart = HTTP.arg("device");
if (restart == "ok") ESP.restart();
HTTP.send(200, "text/plain", "OK");
}

void handle_Sleep0() {
HTTP.send(200, "text/plain", "Sleep0");
//1,000,000=1 second
ESP.deepSleep(0);  
}

void handle_Sleep1() {
HTTP.send(200, "text/plain", "Sleep1 60e6");
//1,000,000=1 second
ESP.deepSleep(60e6); //1 min  
}

void handle_Sleep2() {
HTTP.send(200, "text/plain", "SLEEP_TIME 60 * 1e6");
//1,000,000=1 second
ESP.deepSleep(SLEEP_TIME);  
}

Код:
void WIFIinit() {
// Отключаем WIFI
  WiFi.disconnect();
  //WiFi.setOutputPower(100);  
  // Меняем режим на режим точки доступа
  WiFi.mode(WIFI_STA);
  // Задаем настройки сети
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  // Включаем WIFI в режиме точки доступа с именем и паролем
  // хронящихся в переменных _ssidAP _passwordAP
  WiFi.softAP(_ssidAP.c_str(), _passwordAP.c_str());
  //wifiMulti.addAP(_ssidAP.c_str(), _passwordAP.c_str());
}
 

ArDi

New member
Не ясно куда он должен подключиться
Код:
 http.begin("<URL>");
Попробуйте выкиньте из программы
Код:
   if (!isnan(temperature)) {
        HTTPClient http;
        http.begin("<URL>");
        http.addHeader("Content-Type", "application/json");
        http.POST(String(String("{\"temp\": ") + temperature + String(", \"hum\":") + humidity + String("}")));
        http.writeToStream(&Serial);
        http.end();
    }
И покажите, что выводит есп в сом порт.
Я в этом коде вырезал свой URL просто, чтоб сюда его не постить.

Пробовал вообще код с без каких либо библиотек, просто вывод в Serial порт строки и последующего сна, результат был тот же.
Кусок программы не вырезал, но вот вывод полной версии:
Код:
␀;l␀d��|␀�$�|␂␄␌␄�␌d�␌c<��␃�␛�{�c�␌#��og�lgo���␌c␜p��${$sdp�g�␐␂␄␌�␄l␄��␄␌␄c␌n�|␃$�␄␌�c��g'�␀l��d`␃�␒␛og␄l ␃␇␃o;���g␄␌c␌�␇l␇{ۓo␌␄#␌�␎d�␃�␃ld�␓�l ␃��g�␃*WM:
*WM: AutoConnect
*WM: Connecting as wifi client...
*WM: Using last saved values, should be faster
*WM: Connection result:
*WM: 3
*WM: IP Address:
*WM: 192.168.1.65
3500
WiFi connected...

Status  Humidity (%)    Temperature (C) HeatIndex (C)
OK      31.1            22.4            21.5sd␀$ܟ<␀�l�<␃␌␄␄�␄l�␄c|��␃�␓�;�c�␄c��gn�dog���␄c␜8��lrl;l8�o�␐␃␌␄�␄$␌��␄␄␌b␌'�|␂d�␄␄�b��og�␀l��l ␃�␛␓og␄l ␃␏␂n{���g␄␌c␄�␇l␇s��'␌␌c␌�␇d�␃�␃ll�␒�l`␃��o�␃*WM:
*WM: AutoConnect
*WM: Connecting as wifi client...
*WM: Using last saved values, should be faster
*WM: Connection result:
*WM: 3
*WM: IP Address:
*WM: 192.168.1.65
3499
WiFi connected...

Status  Humidity (%)    Temperature (C) HeatIndex (C)
OK      31.1            22.5            21.6;l␀d��|␀�d�|␂␄␌␌�␌d�␌c<��␃�␛�{�c�␌#��ng�lgn���␌c␜p��${$sdp�'�␘␃␄␌�␌l␄��␌␌␄c␄o�<␃l�␌␌�c��gn�␀d��d`␃�␓␛gn␌d`␂␇␃gs�ۓn␌␄#␌�␎d␎;��g␄␌c␄�␏l�␃�␂d$�␛�d`␂��'�␃*WM:
*WM: AutoConnect
*WM: Connecting as wifi client...
*WM: Using last saved values, should be faster
*WM: Connection result:
*WM: 3
*WM: IP Address:
*WM: 192.168.1.65
3424
WiFi connected...

Status  Humidity (%)    Temperature (C) HeatIndex (C)
OK      31.1            22.7            21.8
 

CodeNameHawk

Moderator
Команда форума
Какой используете переходник на Serial.
Какие поставили резисторы подтяжки.
Подайте на ресет низкий уровень и померьте ток потребления схемы.
 
Сверху Снизу