Delphin911
Member
Давно я мучаю свою метестанцию для дачи. Точнее все что касается работы в штатных условиях (при наличии 220В) уже давно все работает. А вот работа от аккумулятора никак не налажу.
Специально для этих целей купил на Алиэкспресс вот такой аккумулятор: 32700 Lifepo4 3.7V Емкость у него 19900mAh. Ну вроде должно хватить и не на один месяц. Почему взял Lifepo4, потому что предполагается работа и зимой, когда на даче никого нет. Ну типа стоит он там и раз в 3 часа кидает строчку в текстовый файл json. И все бы ничаво, но вот почему-то срабатывает программа несколько раз и молчек. Вот код.
Понятно тут не весь код, но все что касается работы в спящем режиме, то это все. Ошибок в коде я так понимаю нет, т.к. 5-6 раз отрабатывает (пока у меня стоит раз в 30 минут), а потом тишина. Питание на аккуме как положено, 3,2 В. В чем загвоздка - не пойму!
Схему блока управления (без индикации) прилагаю.
Второй год мучаюсь. Думаю уже плюнуть и выкинуть аккумулятор. Пусть работает только при наличии 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;
}
Схему блока управления (без индикации) прилагаю.
Второй год мучаюсь. Думаю уже плюнуть и выкинуть аккумулятор. Пусть работает только при наличии 220В. Да и идея сама баловство. Ну кому какая разница, сколько там градусов зимой было. Ну посмотришь эти значения раз в год. Но пока как спортивный интерес остается. Может кто чего посоветует.