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

Хочу посоветоваться по работе от аккумулятора.

Давно я мучаю свою метестанцию для дачи. Точнее все что касается работы в штатных условиях (при наличии 220В) уже давно все работает. А вот работа от аккумулятора никак не налажу.
Специально для этих целей купил на Алиэкспресс вот такой аккумулятор: 32700 Lifepo4 3.7V Емкость у него 19900mAh. Ну вроде должно хватить и не на один месяц. Почему взял Lifepo4, потому что предполагается работа и зимой, когда на даче никого нет. Ну типа стоит он там и раз в 3 часа кидает строчку в текстовый файл json. И все бы ничаво, но вот почему-то срабатывает программа несколько раз и молчек. Вот код.
Код:
void setup() {
/*Тут идет блок setup когда работает от розетки а далее то что выполняется от аккума*/
else {//если нет напряжения 220В
  //Инициируем SD-карту
  SD.begin(CS_PIN_SDC);
  hasSD = true;
  addToTest(0);

  //Работаем с внутренней памятью (пишем, что загрузка шла в режиме отсутствия питания
  EEPROM.begin(EEPROM_SIZE);// инициализируем EEPROM-память заданного ранее размера
  last_power_state = EEPROM.read(1);
  if (last_power_state == true) {
    EEPROM.write(1, false);
    EEPROM.write(0, false);
    EEPROM.commit();
  }
  addToTest(2);

  //Стартуем библиотеку Wire.h
  Wire_init();

  //Считываем данные времени
  timeS = GetTime();
  addToTest(3);

  //Запускаем датчик BME280
  bme280_init();

  addToTest(4);

  //Запускаем датчик AHT10 на 38
  AHT10_init();

  addToTest(5);

  //Запускаем датчик HDC1080
  HDC1080_init();

  addToTest(6);
 
  //----------------------------------------------------------------------------------
  //Собираем данные с датчиков
  Getpressure();
  GettIn1();
  Gethumidity1();
  GettIn2();
  Gethumidity2();
  GettIn3();
  Gethumidity3();

  addToTest(7);
 
  //Пишем данные в БД
  yyyymm = String(cyear) + String(cmonthnum / 10) + String(cmonthnum % 10);
  addToBD(yyyymm, temperatureString1, temperatureString2, temperatureString3, humidityString1, humidityString2, humidityString3, pressureString);
  addToTest(1);

 
  ESP.deepSleep(18e8); //30 минут
}
}

void addToTest(int poz){//Эта функция дописана временно, пока не работает, что бы понять на чем затыкается
  File fileToAppend = SD.open("log_test_off.log", FILE_WRITE);
  if (fileToAppend) {
    if (poz == 1) fileToAppend.println("Data; " + timeS + "; " + yyyymmdd + "; " + temperatureString1 + "; " + temperatureString2 + "; " + temperatureString3 + "; " + humidityString1 + "; " + humidityString2 + "; " + humidityString3 + "; " + pressureString);
    else if (poz == 2) fileToAppend.println("EEPROM");
    else if (poz == 3) fileToAppend.println("Wire and time");
    else if (poz == 4) fileToAppend.println("BMP280");
    else if (poz == 5) fileToAppend.println("AHT10");
    else if (poz == 6) fileToAppend.println("HDC1080");
    else fileToAppend.println("Data collected");
    fileToAppend.close();
  }
  fileToAppend.close();
}

//Запись в БД
byte addToBD(String & ft, char *ti1, char *ti2, char *ti3, char *hu1, char *hu2, char *hu3, char *pr) {
  byte result = false;
  String FN;
  char razdel[2] = ",";
  char startchar[7] = "{\"d\":[";
  char finchar[3] = "]}";
  char c_dayofmonth[3];
  sprintf(c_dayofmonth, "%u", cdayofmonth);
  char c_monthnum[3];
  sprintf(c_monthnum, "%u", cmonthnum);
  char c_year[3];
  sprintf(c_year, "%u", cyear - 2000);
  char c_hour[3];
  sprintf(c_hour, "%u", chour);
  char c_min[3];
  sprintf(c_min, "%u", (cmin/10)*10);
  char out[65] = "";
  strcat(out, startchar);
  strcat(out, c_dayofmonth);
  strcat(out, razdel);
  strcat(out, c_monthnum);
  strcat(out, razdel);
  strcat(out, c_year);
  strcat(out, razdel);
  strcat(out, c_hour);
  strcat(out, razdel);
  strcat(out, c_min);
  strcat(out, razdel);
  strcat(out, ti1);
  strcat(out, razdel);
  strcat(out, ti2);
  strcat(out, razdel);
  strcat(out, ti3);
  strcat(out, razdel);
  strcat(out, hu1);
  strcat(out, razdel);
  strcat(out, hu2);
  strcat(out, razdel);
  strcat(out, hu3);
  strcat(out, razdel);
  strcat(out, pr);
  strcat(out, finchar);
  strcat(out, razdel);
  FN = "/data_" + ft + ".txt";
  File testdataFile = SD.open(FN, FILE_WRITE);
  if(testdataFile){
    testdataFile.print(out);
    testdataFile.close();
    result = true;
  } else {result = false;}
  return result; 
}
Понятно тут не весь код, но все что касается работы в спящем режиме, то это все. Ошибок в коде я так понимаю нет, т.к. 5-6 раз отрабатывает (пока у меня стоит раз в 30 минут), а потом тишина. Питание на аккуме как положено, 3,2 В. В чем загвоздка - не пойму!
Схему блока управления (без индикации) прилагаю.
СхемаБУ_FIN2.jpg
Второй год мучаюсь. Думаю уже плюнуть и выкинуть аккумулятор. Пусть работает только при наличии 220В. Да и идея сама баловство. Ну кому какая разница, сколько там градусов зимой было. Ну посмотришь эти значения раз в год. Но пока как спортивный интерес остается. Может кто чего посоветует.
 

pvvx

Активный участник сообщества
Предположительно холодно ему, да и питание не 3.3В, а меньше. Вот и не хочет ESP.deepSleep(18e8).
 
Пока он в квартире в Москве. Температура +27.
В даташите написано
Operating Voltage 3.0~3.6V
Ниже 3В точно не падает напряжение. А так то 3,2 стабильно.
 

pvvx

Активный участник сообщества
Повтор: От напряжения и температуры зависит максимальное время сна, т.к используется RC генератор. Для нормальных условий оно до 3.5 часов. Так же зависит от экземпляра чипа. При других - фиг знает. При превышении периода просто не проснется.
 
Я же написал (да и в коде видно), что пока я тестирую на 30 минутах. До максимального времени пока не добрался. Оно вроде 71 минута. Но повторюсь, у меня 30 минут пока тестируется.
 

CodeNameHawk

Moderator
Команда форума
Я же написал (да и в коде видно), что пока я тестирую на 30 минутах.
Ну типа стоит он там и раз в 3 часа
Есть и про 30 мин, но кто там знает как на самом деле.
И все бы ничаво, но вот почему-то срабатывает программа несколько раз и молчек.
Не заряжая аккум, после сброса снова отработает несколько раз?

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

Протестируйте на на коротком отрезке времени. Протестируйте от блока питания вместо аккума.
 
Не заряжая аккум, после сброса снова отработает несколько раз?
Ну так ему и не от чего заряжаться, когда 220В нет. Я думал такой то емкости ему на долго хватит при потреблении 100мА за то время, что мой код отрабатывает.
Попробуйте вставить задержку перед сном, может чего не успело выполнится.
А я думал, что код на Sleep отрабатывает только после того, как всё отработает. Ну попробую. А задержку Delay или по другому как? С millis() например?
Протестируйте на на коротком отрезке времени.
Имеете ввиду поставить минут через десять что бы он просыпался? Ну это можно попробовать.
 

CodeNameHawk

Moderator
Команда форума
ему на долго хватит при потреблении 100мА
У левого акума может быть просадка напряжения, проверяли его характеристики?
Тут проще всего Delay.
Имеете ввиду поставить минут через десять что бы он просыпался?
Для отладки и минута подойдет.
 
Т.е. вы советуете когда питание идет от батареи, пускать напрямую с батареи на ногу 3,3В ESP-шки, а при питании от 220В через 1117 пускать? Суда по характеристикам 1117 вы правы. Попробую.
 

gromush

Member
вы советуете когда питание идет от батареи, пускать напрямую с батареи на ногу 3,3В ESP-шки
Не стоит. У полностью заряженной батареи на 3.7 вольт стартовый вольтаж доходит до 4.2 вольта. На 3.7 он выходит с течением времени.

Проблема не в батарее, а в 1117
1710748427066.png

У этого регулятора просадка напряжения при 100мА - 1.1в и выше.
Если батарея выдает 4.2в полностью заряженная вы получаете 3.1в на входе в esp, а когда у вас батарея выходит на рабочий режим, 3.7в то у вас 2.5в на выходе с 1117.
Вам надо заменять 1117 на LDO с потерей от 0.1 - 0.2в максимум.
У меня была та же ситуация, правда батарея была более мощная и дольше держала 3в поэтому какой-то период у меня работала 8266-я.
 

CodeNameHawk

Moderator
Команда форума
Если у вас переключается источник питания при помощи реле, то питание от аккума проще подавать на есп напрямую, иначе надо поставить диоды(кстати есп может замерить напряжение своего питания), чтобы аккум не заряжался от LM.
И не обращайте внимания, на того, кто читает невнимательно тему, а может просто не знает, что такое 32700 Lifepo4, а хочет что-то посоветовать.
 
И не обращайте внимания, на того, кто читает невнимательно тему, а может просто не знает, что такое 32700 Lifepo4, а хочет что-то посоветовать.
Уже прочитал и начал искать микросхему. Но вспомнил, что у LiFePo4 нет никаких 4,2В, а как раз 3,2 вольта. Так что придется переделывать подачу питания напрямую с батареи и через 1117 с блока питания от 220В.
 
Сверху Снизу