• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
Какие поставили резисторы подтяжки.
Подайте на ресет низкий уровень и померьте ток потребления схемы.
 
Сверху Снизу