esp 01s после пробуждения зависает.

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
За один день перестали работать 3 шт. ESP-01s. Обкатывал код автономный термометр на Narodmon, всё работало прекрасно. Потом стало так: При первом включении данные отправляются (при работе 70 мА), уходит модуль в сон (20 мкА), просыпается 30мА и всё ничего не происходит. Беру другой модуль прошиваю работает как надо через несколько часов та же поломка, ну и третий также помер в работе. Перемычка стоит, питание везде одинаково, сейчас стоит последний модуль с тем же кодом всё работает. Что произошло? Вроде как бы полурабочие модули. Или всё на выброс?
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Хотя бы код показали, может там ограниченное число передачи показаний, да и режим отладки не помешает включить и смотреть что происходит
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
На этих ESP все коды работают одинаково. Что на Narodmon, что на Blynk. Первый раз отправляют, после просыпания висят. И даже если взять код без сна, всё равно первый раз отправят и висят.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
@S_Sergey_G, выключи авто запоминания ssid WiFi.persistent(false) и WiFi.setAutoConnect(false)
 
Изменено:

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
@Normalek,
void wificonect() { // процедура подключения к Wifi.
if (DHCP) WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS);
WiFi.begin(ssid, password, chanal, macAP, false);
void setup() {
WiFi.setAutoConnect(false);
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
@IamNikolay,
Этот код работает с другой ESP прекрасно.
Я хотел узнать это по железу, что то вылетело и просто выкинуть ESP. Или это программно можно исправить каким ни будь кодом? Пробовал 0x00000_blank1m.bin с narodmon прошить не помогло.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Этот код работает с другой ESP прекрасно
У "другой есп" - может быть другой размер памяти.
Сама прошивка собирается под конкретную конфигурацию есп.
Что в коде указано и как собирали - так и не показываете, так как вам помочь?!
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
Вот с этим кодом работали эти ESPшки, пока вдруг перестали работать.
C++:
// https://community.alexgyver.ru/threads/meteostancija-narodnogo-monitoringa.3529/
// p-a-h-a пост 11
#include <ESP8266WiFi.h>
#define debug false // вывод отладочных сообщений
#define postingInterval  330e6 // интервал между отправками данных в секундах (330 сек=5,5 минут)
#define ONE_WIRE_BUS 2 // GPIO к которому подключен DS18B20
#define TEMPERATURE_PRECISION 12 // точность бит.DS18B20 Если глючит или врет, уменьшить до 9
#define TEMPERATURE_MEASURE_TIME 750 // время на преобразование температуры. 9бит-94мс, 10-188,11-375,12-750
#define DS18b20_VCC 0 //Нога питания датчика температуры

#define ssid  "***"
#define password  "***"

#define DHCP true
IPAddress local_IP(192, 168, 8, 103); // меняем при переносе на другой роутер
IPAddress gateway(192, 168, 8, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(192, 168, 8, 1);
IPAddress secondaryDNS(8, 8, 4, 4);
#define chanal 5 //канал wifi
byte macAP[6] = {0x94, 0x37, 0xF7, 0x03, 0x48, 0x7E}; //mac роутера 30:74:96:CD:FB:D7 - Telenor
// 0x94, 0x37, 0xF7, 0x03, 0x48, 0x7E - Huawei

unsigned long mill[2], startmillisDS18B20;// переменные для установки времени на измерение 18B20

#include <DallasTemperature.h>
#include <Wire.h>
ADC_MODE(ADC_VCC);// Будем измерять напряжение на VCC внутри МК
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
byte NumberOfDevices; //сколько датчиков найдем.
int VCC; //Напряжение батареи
String Hostname; //имя железки - выглядит как ESPAABBCCDDEEFF т.е. ESP+mac адрес.

void wificonect() { // процедура подключения к Wifi.
  if (DHCP)  WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS);
  WiFi.begin(ssid, password, chanal, macAP, true);

  while (WiFi.status() != WL_CONNECTED) {
    int i;
    if (debug) if (!(i % 100))Serial.print(".");
    delay(1);
    i++; if (i > 15000)  ESP.deepSleep(60e6);//СПИМ 1 МИНУТу
  }
  if (debug) Serial.println("connected...");
  Hostname = "ESP" + WiFi.macAddress();
  Hostname.replace(":", "");// удаляем из названия двоеточия
  // WiFi.hostname(Hostname); // Название станции внутри локальной вайфай сети

  if (debug){ Serial.println(); Serial.print (millis()); Serial.println (" Подключено к wifi");}
}

void setup() {
  WiFi.setAutoConnect(true);
  WiFi.setAutoReconnect(true);
  pinMode(DS18b20_VCC, OUTPUT);
  digitalWrite(DS18b20_VCC, HIGH);
  Measure();// Запуск измерения

  Serial.begin(115200);
}

void loop() {
  SendToNarodmon();
  if (debug) Serial.print (millis());
  digitalWrite(DS18b20_VCC, LOW);// отключаем питание датчиков

  if (VCC > 4600) {
    delay((postingInterval));
    digitalWrite(DS18b20_VCC, HIGH);// включаем питание
    Measure();
  } else {
    ESP.deepSleep(postingInterval);
  }
}

void Measure() { // Запуск измерения датчиков
  VCC = ESP.getVcc();//- 350; // почему то показывает на 350 мв меньше.
  if (VCC < 3050) {
    ESP.deepSleep(86400e6); // спим сутки при низком питании
  }

  //DS18B20
  DeviceAddress tempDeviceAddress;
  sensors.begin(); //ds18b20
  NumberOfDevices = sensors.getDeviceCount(); //поищем.
  for (int i = 0; i < NumberOfDevices; i++) {
    if (sensors.getAddress(tempDeviceAddress, i)) sensors.setResolution(tempDeviceAddress, TEMPERATURE_PRECISION);  //настроим.
  }
  startmillisDS18B20=millis();
  sensors.requestTemperatures(); //Начали измерение ds18b20
}

bool SendToNarodmon() { // Собственно формирование пакета и отправка.

  DeviceAddress tempDeviceAddress;

  wificonect();// подключаемся к сети
  if (debug) {
    Serial.println(WiFi.localIP()); Serial.println(WiFi.macAddress()); Serial.print("Narodmon ID: "); Serial.println(Hostname);
  }
  WiFiClient client;

  String buf;
buf = "#" + Hostname + "\n"; //mac адрес для авторизации датчика
// }

  client.connect("narodmon.ru", 8283);   // подключение

  if (debug) Serial.print(buf);


  //Данные от ESP ( Напряжение питания,уровень wifi
  buf = buf + "#VCC#" + String(VCC) + "#Напряжение батареи\n"; //показания температуры
  buf = buf + "#WIFI#"  + String(WiFi.RSSI()) + "#Уровень WI-FI " + String(WiFi.SSID()) + "\n"; // уровень WIFI сигнала
  if (debug) Serial.print(buf);

  //DS18B20 в самом конце чтоб было время на измерения

  if ((millis() < TEMPERATURE_MEASURE_TIME + startmillisDS18B20) && NumberOfDevices){// если 18b20 подключен(ы) и время на измерение менее 750мс то
    delay (TEMPERATURE_MEASURE_TIME + startmillisDS18B20 - millis()); // ждем до 750 мс для преобразования данных
  }
  for (int i = 0; i < NumberOfDevices; i++)  { //перечисляем датчики 18b20 и их показания
    mill[i] = millis();
    sensors.getAddress(tempDeviceAddress, i);
    buf = buf + "#";
    for (uint8_t i = 0; i < 8; i++) {
      if (tempDeviceAddress[i] < 16) buf = buf + "0";  // адрес датчика
      buf = buf  + String(tempDeviceAddress[i], HEX);
    }
    buf = buf + "#" + String(sensors.getTempCByIndex(i)) + "#DS18B20 №" + String(i + 1) + "\n"; //и температура
  }

  String worcktime = String(millis());
  float WTime = worcktime.toInt(); WTime /= 1000;
  buf = buf + "#WORKTIME#"  + String(WTime) + "#Время передачи данных" + "\n"; // уровень WIFI сигнала
  buf = buf + "##\n"; //окончание передачи

  client.print(buf); // и отправляем данные
  if (debug) {
    Serial.print(buf);
    for (int i = 0; i < NumberOfDevices; i++)  { //время отведенное на измерение 18b20 18b20 и их показания
      Serial.print  ("Время на измерения DS18B20№" + String(i) + " " + String(mill[i] - startmillisDS18B20) + "мс");
    }
  }

  delay(10);// сделать 100 если нужен ответ или 10 если не нужен . Время активности увеличивается в 2 раза
  while (client.available()) {
    String line = client.readStringUntil('\r'); // если что-то в ответ будет - все в Serial
    if (debug) {
      Serial.println(line);
    }
  }
  return true; //ушло
}
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
@S_Sergey_G,
Напряжение питания модуля, составляет 3,3 вольта. Условие всегда будет ложное. Есп в сон уходит.
VCC = ESP.getVcc();
if (VCC > 4600) {
............
} else {
ESP.deepSleep(postingInterval);
}
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
Ну это когда напряжение зарядки от солнечной батареи превысит заданное.
Ну вот другой код. Поведение такое же.
C++:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <OneWire.h>
#include <DallasTemperature.h>

//Set up the sensors
#define ONE_WIRE_BUS 2 // GPIO куда подключен DS18B20
#define PIN_POWER_DS 0 // GPIO куда подключено питание DS18B20
OneWire oneWire(ONE_WIRE_BUS);        // Setup a oneWire instance to communicate with DS18B20
DallasTemperature sensors(&oneWire);  // Pass our oneWire reference to Dallas Temperature

DeviceAddress tempSensor; // Hard-coded address of Temperature Probe #1
//DeviceAddress tempSensor2 = { 0x28, 0x4D, 0xA3, 0xBC, 0x04, 0x00, 0x00, 0x41 };        // Hard-coded address of Temperature Probe #2

// Pass our oneWire reference to Dallas Temperature.
//DallasTemperature DS18B20(&oneWire);

int VCC=0.0; //Напряжение батареи
ADC_MODE (ADC_VCC) ; // Будем измерять напряжение на VCC внутри МК
float Vbat,V_min = 3.05; // напряжение батарейки, и минимальный порог напряжения для разрешения работы

// Set up the WiFi credentials
const char *ssid = "***";
const char *pass = "***";

// Set up the  network details - Only needed if you want to have a static IP address. If not used then delete the 'WiFi.config(device_ip, dns, gateway, subnet);' line from void WiFi_Connect()
#define DHCP true
IPAddress device_ip               (192,168,8,90);                      // Static IP Address for the device
IPAddress dns                     (192,168,8,1);                        // Normally the IP address of your router
IPAddress gateway                 (192,168,8,1);                        // The IP address of your router
IPAddress subnet                  (255,255,255,0);                      // The subnet used by your network
#define chanal 1 //канал wifi
byte macAP[6] = {0x94, 0x37, 0xF7, 0x03, 0x48, 0x7E}; //mac роутера 30:74:96:CD:FB:D7 - Telenor
// 0x94, 0x37, 0xF7, 0x03, 0x48, 0x7E - Huawei

// Set up the Blynk parameters
const char auth[] =            "***";   // Your Blynk auth code
const char blynk_server [] =   "blynk-cloud.com"; // new variable to hold the name of the Blynk server
const int blynk_port =         8080;              // new variable to hold the port used by the Blynk server

// Declare variables
float temperature;
//float temperature2;
int wifi_connect_count = 0;          // Переменная, чтобы отслеживать, сколько раз мы пытались подключиться к Wi-Fi.
int wifi_connect_max_retries = 20;   // Попытки соеденения с WiFi
float sleep_time_minutes =      15;   // Время сна

void sendSensors()
{
  sensors.requestTemperatures();
  temperature = sensors.getTempCByIndex(0);
  //temperature2 = sensors.getTempC(tempSensor2);
 
  Blynk.virtualWrite(V4, temperature); 
  //Blynk.virtualWrite(V2, temperature2);

  Serial.print("Temp: ");
  Serial.println(temperature);
 // Serial.print("Temp2: ");
 // Serial.println(temperature2);
}


void WiFi_Connect() // Handle the connection to the Wi-Fi network
{
  Serial.println(F("Connecting to Wi-Fi"));
  WiFi.config(device_ip, dns, gateway, subnet); // Not needed if you just want to have a DHCP assigned IP address. If you don't use this then delete the device_ip, dns, gateway & subnet declarations
    
  if (WiFi.status() != WL_CONNECTED)
  {
      WiFi.begin(ssid, pass, chanal, macAP, true); // connect to the network
  }
  while (WiFi.status() != WL_CONNECTED  && wifi_connect_count < wifi_connect_max_retries) // Loop until we've connected, or reached the maximum number of attempts allowed
  {
    delay(500);
    wifi_connect_count++;   
    Serial.print(F("Wi-Fi connection - attempt number "));
    Serial.print(wifi_connect_count);
    Serial.print(" of ");
    Serial.println(wifi_connect_max_retries); 
  }
 
  if (WiFi.status() == WL_CONNECTED)
  {
    WiFi.mode(WIFI_STA);
    Serial.println(F("Wi-Fi CONNECTED"));
    Serial.println();
  }
} // End of void WiFi_Connect



void setup()
{
  Serial.begin(115200);
  Vbat =  ESP.getVcc();         // читаем напряжение на ноге VCC модуля ESP8266
  Vbat =  Vbat / 1023;         
  if (Vbat < V_min ) // (засыпаю на...")
  ESP.deepSleep(86400e6); //(86400e6) сутки, (3600*1000000)-60мин.
 
  pinMode (PIN_POWER_DS, OUTPUT);
  digitalWrite(PIN_POWER_DS, HIGH);

  // 1) Attempt to connect to Wi-Fi a few times (how many times we try is specified by the 'wifi_connect_max_retries' variable)
  // 2) If we successfully connected to Wi-Fi then attempt to connect to Blynk in a non-blocking way. If we aren't connected to Wi-Fi then go to sleep
  // 3) If we connected to Blynk then run the rest of the code as normal. If we aren't connected to Blynk then go to sleep
 
    Blynk.begin(auth, ssid, pass);//starts wifi and Blynk - Not used in the new code as it's a blocking function
  WiFi_Connect(); // Attempt to connect to Wi-Fi

  if (WiFi.status() == WL_CONNECTED)               // If we managed to connect to Wi-Fi then try to connect to Blynk, else go to sleep
  {
    Blynk.config(auth, blynk_server, blynk_port);  // Initialise the Blynk connection settings
    Blynk.connect();                               // Attempt to connect to Blynk
  }
  else
  {
    Serial.println ("Wi-Fi connection failed - going to sleep");
    sleep_time_minutes = sleep_time_minutes * 1; // If you enable this line of code the it will make the device go to sleep for twice as long before trying again. Changing to 0.5 would make it try again sooner than normal
    //Deep_Sleep_Now();
  }
 
  if (Blynk.connected())                          // If we managed to connect to Blynk then carry-on as normal, else go to sleep
  { 
    Serial.println ("Connected to Blynk");
    // If you wanted to retrieve data stored against a virtual pin from the Blynk server the you'd call Blynk.syncVirtual(VPin) here. This would trigger the corresponding BLYNK_WRIRE(VPin) callback
  }
  else
  { 
    // If you enable the following line of code the it will make the device go to sleep for twice as long before trying again. Changing to 0.5 would make it try again sooner than normal, you can adjust to suit your needs
    //sleep_time_minutes = sleep_time_minutes * 2;
    Serial.println("Blynk connection failed - going to sleep");
    Deep_Sleep_Now();
  }

  sensors.begin();
  sensors.setResolution(tempSensor, 10);
  //sensors.setResolution(tempSensor2, 10);

  Blynk.run(); // Give Blynk some processor time

  sendSensors();  // Take the temperature readings and upload to Blynk

  float wake_time = (float)millis()/float(1000); // Find out how long since the ESP rebooted
  Blynk.virtualWrite(V3, wake_time);
  Blynk.virtualWrite(V5, Vbat); // виртуальный порт напряжения
  Serial.print("Wake Time = ");
  Serial.print(wake_time);
  Serial.println(" seconds");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Blynk.run(); // Needed to ensure that the Wake Time value is always uploaded to Blynk before going to sleep
  delay(100);  // Give Blynk time to do its thing before going to sleep
  Deep_Sleep_Now();
}


void Deep_Sleep_Now()
{
  Serial.print(">>>>>>> Going to sleep for ");
  Serial.print(sleep_time_minutes); 
  Serial.println(" minutes");   
  Serial.println();
  digitalWrite(PIN_POWER_DS, LOW);
  ESP.deepSleep(sleep_time_minutes * 60000000);  // Deep Sleep time is specified in micros
  delay(2000);
}

void loop()
{
  // voud loop is empty, but can't be deleted
}
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Ну это когда напряжение зарядки от солнечной батареи превысит заданное.
Откуда там солнечная батарея?! функция измеряет напряжение ЕСП.

Ну вот другой код
несколько раз вызывается подключение, затем настройки...

int VCC=0.0; //Напряжение батареи
переменной инт присваивать значение флоат - бесполезно

float wake_time = (float)millis()/float(1000);
тоже абсолютно бесполезно и такого полно
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
Я не спорю про грамотность кода, это отдельная тема будет. Но этот код работает уже 3 месяца автономно на тестовой ESP.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
@bort707,
Ну почему уж совсем безграмотный, работают же два устройства на этом коде. Автономно один 3 месяца другой 1 месяца. И эти модули тоже работали на этом коде неделю, пока по неизвестной причине вдруг отказали.
Если код совсем плох можете поправить его до приличного состояния?
 

Sergey_C

✩✩✩✩✩✩✩
23 Фев 2024
11
3
Здравствуйте.
Столкнулся с такой же проблемой, что и автор топика.
ESP-01s, после пробуждения из режима глубокого сна зависает, потребление также около 30mA.
Выходит из зависания только после повторной кратковременной подачи на пин RST низкого уровня. Если не дожидаться окончания времени сна и вручную кратковременно подать на пин RST низкий уровень зависает точно также. Выходит из зависания повторной подачей низкого уровня.
Не совсем понимаю, почему в предыдущих ответах пытались искать причину в безграмотном коде. Поэтому привожу свой код, проще уже вроде бы некуда.
C++:
#include <ESP8266WiFi.h>

const char* mySSID = "*****";
const char* mySSIDpass = "*******";

WiFiClient client;
int n = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  WiFi.begin(mySSID, mySSIDpass);
  while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");  
    }
  Serial.println("Connect");
}

void loop() {
  n++;
  Serial.println(n);
  delay(1000);
  if (n > 10)
  {  
    ESP.deepSleep(15e6);      
  }
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
А пин ресета соединен с выходом D0 ? Для есп-01 надо припаиваться к ноги микросхемы.
Так уж она работает, что после сна полностью сбрасывает контроллер и начинается все с setup , и теоретически loop можно вообще не использовать.
 

Sergey_C

✩✩✩✩✩✩✩
23 Фев 2024
11
3
@Старик Похабыч,
К Reset припаян пин GPIO16
Убрал все из цикла loop, результат такой же.
Из сна (зависания) выходит только двухкратной подачей низкого сигнала на Reset
 

S_Sergey_G

✩✩✩✩✩✩✩
23 Фев 2021
165
3
@Sergey_C Я так и не разобрался в этой проблеме. Пометил их как "не автономные" И собираю другие проекты на них. Например брокер для MQTT в локальной сети работает отлично.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Да, GPIO16, он же WAKE, он же D0
У меня вот прямо сейчас крутится аналогичный проект но на WEMOS и работает уже наверное неделю без перерыва.
Разница только во времени сна, у меня 1 минута. но это тут ни причем.
Можно попробовать повесить светодиод на пин WAKE и посмотреть есть ли сигнал с него. Может ошибка в пайке.
Вывод в монитор порта идет ? если да, то в какой момент идет зависание ? Рекомендую поставить скорость 74880
 

Sergey_C

✩✩✩✩✩✩✩
23 Фев 2024
11
3
@Старик Похабыч,
На NodeMCU у меня уже месяц все работает отлично.
На ESP-01s импульс в момент пробуждения идет, светодиод на плате кратко моргает. У меня подозрение, что длительности этого импульса не хватает. Сейчас уже отпаял провод от GPIO16. Пытаюсь будить плату в ручном режиме, подаваю землю на Reset. Результат тот же - после первой подачи земли плата вроде как просыпается, светодиод моргает, потребление тока возрастает до 30mA, но плата при этом висит, в последовательный порт выводится мусор. После повторной подачи земли, плата отвисает и начинает нормально работать до следующего засыпания. На иностранных форумах нашел сообщения о такой же проблеме именно с платами ESP-01s, но без решения