Смартфон Android версия прошивки - 2.20.0
Локальный сервер - версия 0.33.2.
Версия библиотеки - 0.5.1
Версия ядра esp8266 - 2.4.1
Устройства основаны на Wemos d1 mini pro.
Суть проблемы:
У меня на локальном сервере крутится около 5ти устройств. После перехода на новую версию библиотеки а именно 0.5.1 и 0.5.0 два устройства стали перезагружаться с разной периодичностью. Более нагруженное в программном смысле устройство раз в 5мин. Другое 1-2 раза в день. Такое ощущение что срабатывает WDT. Отследить что летит в сериал монитор проблематично. При откате библиотеки до 0.4.10 проблема уходит. Понимаю, что вопрос звучит очень размыто, но возможно кто-то сталкивался с подобной проблемой? Также где-то читал на форуме что это возможно связано с новым ядром и библиотекой DHT, Заранее спасибо.
Скетч:
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TimeLib.h>
#include <WidgetRTC.h>
#include <UTFT.h>
#include <SimpleDHT.h>
#include <Encoder.h>
#include <ArduinoOTA.h>
SimpleDHT22 dht22;
BlynkTimer timer;
WidgetRTC rtc;
WidgetTerminal terminal(V5); // виртуальный пин для терминала на телефоне
WidgetBridge homet(V8); // мост для отправки температуру в топочную
Encoder myEnc(5, 4); // подключаем єнкодер к пинам D1 D2
char auth[] = "-";
char ssid[] = "-";
char pass[] = "-";
String currentTime = "--:--"; // переменная хранит время
String currentDate = "--.--.----"; // переменная хранит дату
String minutenorm; // переменная для преобразования минут в нормальный формат
String hournorm; // переменная для преобразования часов в нормальный формат
String daynorm; // переменная для преобразования дней в нормальный формат
String monthnorm; // переменная для преобразования месяцев в нормальный формат
char *week = "--";
float ylicat; // переменная хранит температуру на улице
float ylicah; // переменная хранит температуру на улице
float ylicam; // переменная хранит давление на улице
float domt; // переменная хранит температуру на улице
float domh; // переменная хранит температуру на улице
float fakttemprec, fakttempgvs, fakttemppodacha, fakttempobratka, fakttemptverd; // переменная хранит значение датчиков
int buttonV16; // кнопка ГАЗ/ТВЕРД
int buttonV18; // кнопка рециркуляции
int buttonV17; // кнопка ГВС
boolean firststart; //переменная хранящая значение первый ли это старт, чтобы при старте устройства не писалось сообщение о подключении к облаку.
boolean sostoyaniezima = false; // текущее состояние РЕЖИМА ЗИМА/ЛЕТО
boolean alarmzaryad = false; //хранит состояние аварии по АККУМУЛЯТОРУ
boolean alarmtk = false; //хранит состояние аварии по ТВЕРДОТОПУ
boolean alarmzagtk = false; //хранит состояние аварии по загрузке ТВЕРДОТОПА
boolean alarmgaz = false; //хранит состояние аварии датчика ГАЗА/ДЫМА
int temprec; //переменная хранит заданную пользователем температуру рециркуляции
int tempgvs; //переменная хранит заданную пользователем температуру ГВС
int tempzl; //переменная хранит заданную пользователем температуру ЗИМА/ЛЕТО
int tempavar; //переменная хранит заданную пользователем температуру аварии ТВЕРДОТОПливного котла
int tempzagtverd; //переменная хранит температуру загрузки твердотопа
extern uint8_t SmallRusFont[]; // Объявляем шрифт
extern uint8_t BigRusFont[];
extern uint8_t SevenSegNumFontPlusPlus[];
long oldPosition = -999; // переменная хранит старое положение энкодера
long newPosition; // переменна хранит новое положение єнкодера
int menu = 0; // переменная хранит номер меню
int menupos = 0; //переменная хранит положение єнкодера при переключении меню
float temphome = 20; // переменная хранит выставленную температуру, 20 градусов начальная температура
boolean granica = false;
boolean butterm = false; // переменная хранит состояние, если пользователь зашел в меню термостата true, вышел - false
//Переменные ЗОНЫ 1
long startTimeV1 = 0; // начало задания в секундах, зона 1
long stopTimeV1 = 0; // конец задания в секундах, зона 1
boolean weekV1[8]; // день недели, зона 1
boolean sostoyanieV1 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 1
//Переменные ЗОНЫ 2
long startTimeV2 = 0; // начало задания в секундах, зона 2
long stopTimeV2 = 0; // конец задания в секундах, зона 2
boolean weekV2[8]; // день недели, зона 2
boolean sostoyanieV2 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 2
//Переменные ЗОНЫ 3
long startTimeV3 = 0; // начало задания в секундах, зона 3
long stopTimeV3 = 0; // конец задания в секундах, зона 3
boolean weekV3[8]; // день недели, зона 3
boolean sostoyanieV3 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 3
//Переменные ЗОНЫ 4
long startTimeV4 = 0; // начало задания в секундах, зона 4
long stopTimeV4 = 0; // конец задания в секундах, зона 4
boolean weekV4[8]; // день недели, зона 4
boolean sostoyanieV4 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 4
//Переменные ЗОНЫ 5
long startTimeV5 = 0; // начало задания в секундах, зона 5
long stopTimeV5 = 0; // конец задания в секундах, зона 5
boolean weekV5[8]; // день недели, зона 5
boolean sostoyanieV5 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 5
//Переменные ЗОНЫ 6
long startTimeV6 = 0; // начало задания в секундах, зона 6
long stopTimeV6 = 0; // конец задания в секундах, зона 6
boolean weekV6[8]; // день недели, зона 6
boolean sostoyanieV6 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 6
//Переменные ЗОНЫ 7
long startTimeV7 = 0; // начало задания в секундах, зона 7
long stopTimeV7 = 0; // конец задания в секундах, зона 7
boolean weekV7[8]; // день недели, зона 7
boolean sostoyanieV7 = false; //текущее состояние зоны ВКЛ. или ВЫКЛ., зона 7
int buttonV0; // кнопка автополива
int buttonV19; // кнопка пуш уведомлений
boolean sostoyaniemanual = false; // текующее состояние ручного полива
UTFT tft ( ILI9341_S5P, 13, 14, 15, 2, 12 ); // подключаем экран SDI (MOSI), SCK, CS, RESET, D/C - D7, D5, D8, D4, D6
const uint8_t utf8_rus_charmap[] PROGMEM = {'A',128,'B',129,130,'E',131,132,133,134,135,'K',136,'M','H','O',137,'P','C','T',138,139,'X',140,141,
142,143,144,145,146,147,148,149,'a',150,151,152,153,'e',154,155,156,157,158,159,160,161,162,'o',163,'p','c',164,'y',165,'x',166,167,168,169,170,
171,172,173,174,175};
BLYNK_CONNECTED() {
homet.setAuthToken("-"); // авторизуемся с топочной
if (firststart == true) {
terminal.println(String(currentTime) + " " + currentDate + " Подключение к облаку!"); // сообщение о подключении к облаку
terminal.flush(); // отправляет данные из устройства в терминал
}
Blynk.syncAll();// синхронизируем выходы, после потерия связи.
}
BLYNK_WRITE(V1) { // данные с автополива, метео
ylicat = param[0].asFloat(); //сохраняем в переменную уличную температуру
ylicah = param[1].asFloat(); //сохраняем в переменную уличную влажность
ylicam = param[2].asFloat(); //сохраняем в переменную уличное давление
}
BLYNK_WRITE(V2) { // данные с топочной
fakttemprec = param[0].asFloat(); // температура рециркуляции
fakttempgvs = param[1].asFloat(); // температура гвс
fakttemppodacha = param[2].asFloat(); // температура подачи
fakttempobratka = param[3].asFloat(); // температура обратки
fakttemptverd = param[4].asFloat(); // температура ТК
sostoyaniezima = param[5].asInt(); // текущее состояние РЕЖИМА ЗИМА/ЛЕТО
buttonV16 = param[6].asInt(); // кнопка ГАЗ/ТВЕРД
alarmzaryad = param[7].asInt(); //хранит состояние аварии по АККУМУЛЯТОРУ
alarmtk = param[8].asInt(); //хранит состояние аварии по ТВЕРДОТОПУ
alarmzagtk = param[9].asInt(); //хранит состояние аварии по загрузке ТВЕРДОТОПА
alarmgaz = param[10].asInt(); //хранит состояние аварии датчика ГАЗА/ДЫМА
temprec = param[11].asInt(); //переменная хранит заданную пользователем температуру рециркуляции
tempgvs = param[12].asInt(); //переменная хранит заданную пользователем температуру ГВС
tempzl = param[13].asInt(); //переменная хранит заданную пользователем температуру ЗИМА/ЛЕТО
tempavar = param[14].asInt(); //переменная хранит заданную пользователем температуру аварии ТВЕРДОТОПливного котла
tempzagtverd = param[15].asInt(); //переменная хранит температуру загрузки твердотопа
buttonV18 = param[16].asInt(); // кнопка рециркуляции
buttonV17 = param[17].asInt(); // кнопка ГВС
}
BLYNK_WRITE(V7) { // данные с автополива
startTimeV1 = param[0].asInt();
stopTimeV1 = param[1].asInt();
weekV1[weekday()] = param[2].asInt();
sostoyanieV1 = param[3].asInt();
startTimeV2 = param[4].asInt();
stopTimeV2 = param[5].asInt();
weekV2[weekday()] = param[6].asInt();
sostoyanieV2 = param[7].asInt();
startTimeV3 = param[8].asInt();
stopTimeV3 = param[9].asInt();
weekV3[weekday()] = param[10].asInt();
sostoyanieV3 = param[11].asInt();
startTimeV4 = param[12].asInt();
stopTimeV4 = param[13].asInt();
weekV4[weekday()] = param[14].asInt();
sostoyanieV4 = param[15].asInt();
startTimeV5 = param[16].asInt();
stopTimeV5 = param[17].asInt();
weekV5[weekday()] = param[18].asInt();
sostoyanieV5 = param[19].asInt();
startTimeV6 = param[20].asInt();
stopTimeV6 = param[21].asInt();
weekV6[weekday()] = param[22].asInt();
sostoyanieV6 = param[23].asInt();
startTimeV7 = param[24].asInt();
stopTimeV7 = param[25].asInt();
weekV7[weekday()] = param[26].asInt();
sostoyanieV7 = param[27].asInt();
buttonV0 = param[28].asInt();
buttonV19 = param[29].asInt();
sostoyaniemanual = param[30].asInt();
}
BLYNK_WRITE(V6) {
if(param.asFloat() != temphome){
temphome = param.asFloat(); //сохраняем в переменную установленную температуру в приложении
terminal.println(String(currentTime) + " " + currentDate + " Темп. в доме: " + temphome + "*С");
terminal.flush(); // отправляет данные из устройства в терминал
}
}
void printRus(UTFT rus,char *st, int x, int y, int deg){ // функция для написания руского текста в библиотеке UTFT
int stl, i;
stl = strlen(st);
if (rus.orient==PORTRAIT){
if (x==RIGHT) x=(rus.disp_x_size+1)-(stl*rus.cfont.x_size);
if (x==CENTER) x=((rus.disp_x_size+1)-(stl*rus.cfont.x_size))/2;
} else {
if (x==RIGHT) x=(rus.disp_y_size+1)-(stl*rus.cfont.x_size);
if (x==CENTER) x=((rus.disp_y_size+1)-(stl*rus.cfont.x_size))/2;
}
uint8_t utf_high_byte = 0;
uint8_t ch, ch_pos = 0;
for (i = 0; i < stl; i++) {
ch = st[i];
if ( ch >= 128) {
if ( utf_high_byte == 0 && (ch ==0xD0 || ch == 0xD1)) {
utf_high_byte = ch;
continue;
} else {
if ( utf_high_byte == 0xD0) {
if (ch == 0x81) { //Ё
ch = 6;
} else {
if(ch <= 0x95) {
ch -= 0x90;
} else if( ch < 0xB6){
ch -= (0x90 - 1);
} else {
ch -= (0x90 - 2);
}}
ch = pgm_read_byte(utf8_rus_charmap + ch);
} else if (utf_high_byte == 0xD1) {
if (ch == 0x91) {//ё
ch = 39;
} else {
ch -= 0x80;
ch += 50;
}
ch = pgm_read_byte(utf8_rus_charmap + ch);
}
utf_high_byte = 0;
}
} else {
utf_high_byte = 0;
}
if (deg==0) {rus.printChar(ch, x + (ch_pos * (rus.cfont.x_size)), y);} else {
rus.rotateChar(ch, x, y, ch_pos, deg);
}
++ch_pos;
}
};
void autoplay() {
// МЕНЮ
switch (menu) {
case 1: // меню метеостанции
tft.setFont(BigRusFont);
tft.setColor(VGA_LIME);
tft.printNumF ( ylicat, 1, 50, 80 ); // выводим температура улица
tft.printNumF ( ylicah, 1, 50, 165 ); // выводим влажность улица
tft.printNumF ( domt, 1, 175, 80 ); // выводим температура дом
tft.printNumF ( domh, 1, 210, 165 ); // выводим влажность дом
tft.printNumF ( ylicam * 0.00750062, 1, 200 , 213 ); // выводим влажность улица
tft.setColor(VGA_YELLOW);
tft.printNumF ( temphome, 1, 245, 80 ); // выводим температура дом
tft.setColor(VGA_WHITE);
tft.print ( currentTime, 5, 6 ); // выводим ВРЕМЯ
tft.print ( currentDate, 110, 6 ); // выводим ДАТУ
printRus(tft, week, 280, 6, 0); // выводим ДЕНЬ НЕДЕЛИ
tft.setFont(SmallRusFont);
printRus(tft,"ТЕМПЕРАТУРА НА", 25, 40, 0);
printRus(tft,"УЛИЦЕ, *С:", 45, 55, 0);
printRus(tft,"ТЕМПЕРАТУРА В", 190, 40, 0);
printRus(tft,"ДОМЕ, *С:", 210, 55, 0);
printRus(tft,"ВЛАЖНОСТЬ НА", 35, 125, 0);
printRus(tft,"УЛИЦЕ, %:", 50, 140, 0);
printRus(tft,"ВЛАЖНОСТЬ В", 200, 125, 0);
printRus(tft,"ДОМЕ, %:", 215, 140, 0);
printRus(tft,"ДАВЛЕНИЕ, ММ.ВОД.СТ:", 30, 215, 0);
tft.drawLine ( 0, 30, 319, 30 ); // горизонтальная линия под временем
tft.drawLine ( 0, 115, 319, 115 ); // горизонтальная линия посередине
tft.drawLine ( 159, 30, 159, 200 ); // вертикальная линия
tft.drawLine ( 0, 200, 319, 200 ); // горизонтальная линия над давлением
if (Blynk.connected() == true) {tft.setColor(VGA_LIME); tft.print ( "\xB5", 300, 215 );} else {tft.setColor(VGA_RED); tft.print ( "\xB5", 300, 215 );} // проверяем подключение к серверу
break;
case 2: // меню топочной
tft.setColor(VGA_WHITE);
tft.setFont(BigRusFont);
tft.print ( currentTime, 5, 6 ); // выводим ВРЕМЯ
tft.print ( currentDate, 110, 6 ); // выводим ДАТУ
printRus(tft, week, 280, 6, 0); // вывідим ДЕНЬ НЕДЕЛИ
tft.drawLine ( 0, 30, 319, 30 ); // горизонтальная линия под временем
tft.setFont(SmallRusFont);
printRus(tft,"ТЕМПЕРАТУРА РЕЦИРКУЛЯЦИИ:", 5, 40, 0);
printRus(tft,"ТЕМПЕРАТУРА ГВС:", 5, 58, 0);
printRus(tft,"ТЕМПЕРАТУРА НА УЛИЦЕ:", 5, 76, 0);
printRus(tft,"ТЕМПЕРАТУРА В ДОМЕ:", 5, 94, 0);
printRus(tft,"РЕЖИМ ГАЗОВОГО КОТЛА:", 5, 112, 0);
printRus(tft,"ТЕМПЕРАТУРА ПОДАЧА:", 5, 130, 0);
printRus(tft,"ТЕМПЕРАТУРА ОБРАТКА:", 5, 148, 0);
printRus(tft,"ТЕМПЕРАТУРА ТВЕРДОТОП:", 5, 166, 0);
printRus(tft,"РЕЖИМ ТОПОЧНОЙ:", 5, 184, 0);
printRus(tft,"АВАРИЯ:", 5, 202, 0);
tft.print ( "WI-FI dBm:", 5, 220 );
tft.setColor(VGA_LIME);
tft.printNumF ( fakttemprec, 1, 210, 40 ); // выводим температура рециркуляции
tft.printNumF ( fakttempgvs, 1, 210, 58 ); // выводим температура ГВС
tft.printNumF ( ylicat, 1, 210, 76 ); // выводим температура на улице
tft.printNumF ( domt, 1, 210, 94 ); // выводим температура дом
if (sostoyaniezima == false) { printRus(tft,"ЛЕТО", 210, 112, 0); } else { printRus(tft,"ЗИМА", 210, 112, 0); } // выводим режим газового котла
tft.printNumF ( fakttemppodacha, 1, 210, 130 ); // выводим температура подачи
tft.printNumF ( fakttempobratka, 1, 210, 148 ); // выводим температура обратки
tft.printNumF ( fakttemptverd, 1, 210, 166 ); // выводим температура ТК
if (buttonV16 == 1) { printRus(tft,"ГАЗОВЫЙ КОТЕЛ ", 130, 184, 0); } else { printRus(tft,"ТВЕРДОТОПЛИВНЫЙ КОТЕЛ", 130, 184, 0); } // выводим режим топочной
if ((alarmzaryad == false) && (alarmtk == false) && (alarmzagtk == false) && (alarmgaz == false)) { printRus(tft,"НЕТ ", 65, 202, 0); } // если нет аварий
tft.printNumI ( WiFi.RSSI(), 90, 220 ); // выводим уровень связи Wi-Fi
tft.setColor(VGA_YELLOW);
tft.printNumI ( temprec, 250, 40 ); // выводим установленную температуру рециркуляции
if (buttonV18 == 1) { printRus(tft,"АВТО", 275, 40, 0); } else { printRus(tft,"ВЫКЛ", 275, 40, 0); } // режим рециркуляции АВТО/ВЫКЛ
tft.printNumI ( tempgvs, 250, 58 ); // выводим установленную температуру ГВС
if (buttonV17 == 1) { printRus(tft,"АВТО", 275, 58, 0); } else { printRus(tft,"ВЫКЛ", 275, 58, 0); } // режим ГВС АВТО/ВЫКЛ
tft.printNumI ( tempzl, 250, 76 ); // выводим установленную температуру ЗИМА/ЛЕТО
tft.printNumF ( temphome, 1, 250, 94 ); // выводим установленную температуру в доме
tft.printNumI ( tempavar, 250, 166 ); // выводим установленную температуру аварии ТК
tft.printNumI ( tempzagtverd, 275, 166 ); // выводим установленную температуру загрузки ТК
tft.setColor(VGA_RED);
if (alarmzaryad == true) { printRus(tft,"НИЗКИЙ ЗАРЯД АККУМУЛЯТОРА!", 65, 202, 0); } // авария аккумулятор
if (alarmtk == true) { printRus(tft,"ПЕРЕГРЕВ ТК! ", 65, 202, 0); } // авария ТК
if (alarmzagtk == true) { printRus(tft,"ЗАГРУЗИТЬ ТК ТОПЛИВОМ! ", 65, 202, 0); } // авария загрузить топливом ТК
if (alarmgaz == true) { printRus(tft,"ОБНАРУЖЕН ГАЗ! ", 65, 202, 0); } // авария ГАЗ
if (Blynk.connected() == true) {tft.setColor(VGA_LIME); tft.print ( "\xB5", 300, 215 );} else {tft.setColor(VGA_RED); tft.print ( "\xB5", 300, 215 );} // проверяем подключение к серверу
break;
case 3: // меню автополива
tft.setColor(VGA_WHITE);
tft.setFont(BigRusFont);
tft.print ( currentTime, 5, 6 ); // выводим ВРЕМЯ
tft.print ( currentDate, 110, 6 ); // выводим ДАТУ
printRus(tft, week, 280, 6, 0); // выводим ДЕНЬ НЕДЕЛИ
tft.drawLine ( 0, 30, 319, 30 ); // горизонтальная линия под временем
tft.setFont(SmallRusFont);
printRus(tft,"КАПЕЛЬНЫЙ ЮГ:", 5, 40, 0);
printRus(tft,"ГАЗОН ЮГ 2:", 5, 60, 0);
printRus(tft,"ГАЗОН ЮГ 3:", 5, 80, 0);
printRus(tft,"ЗАБОР СМУ:", 5, 100, 0);
printRus(tft,"СЕВЕР 2:", 5, 120, 0);
printRus(tft,"КАПЕЛЬНЫЙ СЕВЕР:", 5, 140, 0);
printRus(tft,"ГАЗОН СЕВЕР:", 5, 160, 0);
printRus(tft,"УВЕДОМЛЕНИЯ:", 5, 180, 0);
printRus(tft,"АВТОПОЛИВ:", 5, 200, 0);
printRus(tft,"РУЧНОЙ ПОЛИВ:", 5, 220, 0);
poliv(startTimeV1, stopTimeV1, 150, 40, weekV1[weekday()], sostoyanieV1);
poliv(startTimeV2, stopTimeV2, 150, 60, weekV2[weekday()], sostoyanieV2);
poliv(startTimeV3, stopTimeV3, 150, 80, weekV3[weekday()], sostoyanieV3);
poliv(startTimeV4, stopTimeV4, 150, 100, weekV4[weekday()], sostoyanieV4);
poliv(startTimeV5, stopTimeV5, 150, 120, weekV5[weekday()], sostoyanieV5);
poliv(startTimeV6, stopTimeV6, 150, 140, weekV6[weekday()], sostoyanieV6);
poliv(startTimeV7, stopTimeV7, 150, 160, weekV7[weekday()], sostoyanieV7);
tft.setColor(VGA_LIME);
if (buttonV19 == 1) { printRus(tft,"ВКЛ ", 150, 180, 0); } else { printRus(tft,"ВЫКЛ", 150, 180, 0); } // уведомления АВТО/ВЫКЛ
if (buttonV0 == 1) { printRus(tft,"ВКЛ ", 150, 200, 0); } else { printRus(tft,"ВЫКЛ", 150, 200, 0); } // режим автополива АВТО/ВЫКЛ
if (sostoyaniemanual == true) { printRus(tft,"ВКЛ ", 150, 220, 0); } else { printRus(tft,"ВЫКЛ", 150, 220, 0); } // режим автополива АВТО/ВЫКЛ
if (Blynk.connected() == true) {tft.setColor(VGA_LIME); tft.print ( "\xB5", 300, 215 );} else {tft.setColor(VGA_RED); tft.print ( "\xB5", 300, 215 );} // проверяем подключение к серверу
break;
case 4: // меню термостата
tft.setColor(VGA_WHITE);
tft.setFont(BigRusFont);
tft.print ( currentTime, 5, 6 ); // выводим ВРЕМЯ
tft.print ( currentDate, 110, 6 ); // выводим ДАТУ
printRus(tft, week, 280, 6, 0); // выводим ДЕНЬ НЕДЕЛИ
tft.drawLine ( 0, 30, 319, 30 ); // горизонтальная линия под временем
tft.drawCircle (160, 135, 85);
tft.drawCircle (160, 135, 90);
tft.setFont(SmallRusFont);
if (Blynk.connected() == true) {tft.setColor(VGA_LIME); tft.print ( "\xB5", 300, 215 );} else {tft.setColor(VGA_RED); tft.print ( "\xB5", 300, 215 );} // проверяем подключение к серверу
tft.setFont(SevenSegNumFontPlusPlus);
if (temphome <= 18) { tft.setColor(VGA_AQUA); }
else if (temphome >= 25) { tft.setColor(VGA_RED); }
else { tft.setColor(VGA_LIME); }
tft.printNumF ( temphome, 1, 95, 110 );
break;
}
}
void button() { // функция выполняется при нажатии кнопки
if(digitalRead(0) == LOW){
butterm = !butterm; // меняем значение на противоположное
if (butterm == true) { menu = 4; } //заходим/выходим в/из меню термостата
else {
menu = 1;
menupos = 1;
Blynk.virtualWrite(V6, temphome); //отправляем из термостата в приложение установленную температуру
terminal.println(String(currentTime) + " " + currentDate + " Темп. в доме: " + temphome + "*С");
terminal.flush(); // отправляет данные из устройства в терминал
}
tft.clrScr(); // Заливаем экран черным
autoplay();
}
}
void termostat() { // отправляем данные в приложение и отвечает за часы
if (minute() < 10) {minutenorm = String("0") + minute();} // необходимо для преобразования минут в формат 00 - 59
else {minutenorm = minute();}
if (hour() < 10) {hournorm = String("0") + hour();} // необходимо для преобразования часов в формат 00 - 24
else {hournorm = hour();}
currentTime = String(hournorm) + ":" + minutenorm; //записываем в переменную время
switch (weekday()) {
case 1:
week = "ВС";
break;
case 2:
week = "ПН";
break;
case 3:
week = "ВТ";
break;
case 4:
week = "СР";
break;
case 5:
week = "ЧТ";
break;
case 6:
week = "ПТ";
break;
case 7:
week = "СБ";
break;
}
if (day() < 10) {daynorm = String("0") + day();} // необходимо для преобразования дней в формат 01 - 31
else {daynorm = day();}
if (month() < 10) {monthnorm = String("0") + month();} // необходимо для преобразования месяцев в формат 01 - 12
else {monthnorm = month();}
currentDate = String(daynorm) + "." + monthnorm + "." + year(); //записываем в переменную дату
dht22.read2(16, &domt, &domh, NULL); // считываем данные термостата
Blynk.virtualWrite(V3, domt); // температура
Blynk.virtualWrite(V4, domh); // влажность
Blynk.virtualWrite(V0, WiFi.RSSI()); // уровень WI-FI
homet.virtualWrite(V33, domt, temphome); // Отправляем данные в топочную
}
void poliv (long startzone, long stopzone, int x, int y, boolean week, boolean sost) { // функция приводит время начала и остановки полива в нужный формат и выводит на экран
String mstartnorm;
String mstopnorm;
String hstartnorm;
String hstopnorm;
int hstart = floor(startzone / 3600);
int mstart = (startzone - hstart*3600)/60;
if (hstart < 10) {hstartnorm = String("0") + hstart;} else {hstartnorm = hstart;}
if (mstart < 10) {mstartnorm = String("0") + mstart;} else {mstartnorm = mstart;}
int hstop = floor(stopzone / 3600);
int mstop = (stopzone - hstop*3600)/60;
if (hstop < 10) {hstopnorm = String("0") + hstop;} else {hstopnorm = hstop;}
if (mstop < 10) {mstopnorm = String("0") + mstop;} else {mstopnorm = mstop;}
if (week == true) { tft.setColor(VGA_LIME); } else { tft.setColor(VGA_RED); }
tft.print (String(hstartnorm) + ":" + mstartnorm + " - " + hstopnorm + ":" + mstopnorm, x, y);
if (sost == true) { tft.setColor(VGA_LIME); } else { tft.setColor(VGA_RED); }
tft.fillCircle (x+125, y+6, 6);
}
void setup() {
pinMode(0, INPUT); // перевод пина D3 в режим входа - кнопка энкодера
Blynk.begin(auth, ssid, pass, IPAddress(192,168,0,105), 8080);
while (Blynk.connect() == false) {
// Ждем пока не подключится к серверу
}
rtc.begin(); // синхронизируем часы
terminal.println("Успешный старт!"); // пишем что все ОК
terminal.print("- Уровень сигнала, dBm: ");
terminal.println(WiFi.RSSI()); // уровень сигнала
terminal.print("- IP адресс: ");
terminal.println(WiFi.localIP()); // IP адресс выданный в сети
terminal.print("- MAC адресс: ");
terminal.println(WiFi.macAddress()); // MAC адресс выданный в сети
terminal.flush(); // отправляет данные из устройства в терминал
firststart = true; // первое подключение к облаку.
tft.InitLCD(); // Запускаем экран
timer.setInterval(60000L, termostat); // вызываем цикл каждые 60 секунд - отправка данных в приложение и часы
timer.setInterval(20000L, autoplay); // вызываем цикл каждые 20 секунд - обновляем данные на экране
timer.setInterval(200L, button); // вызываем цикл каждые 200мс - контролируем нажатие на энкодер
ArduinoOTA.setPassword((const char *)"-"); // пароль для обновления по воздуху
ArduinoOTA.begin(); //обновление по воздуху
}
void loop() {
Blynk.run();
timer.run();
newPosition = myEnc.read()/2;
if (newPosition != oldPosition) {
// ПРОЛИСТІВАЕМ МЕНЮ
if ((newPosition > oldPosition) && (butterm == false)) { // если крутим в право вне меню термостата
menupos += 1;
if (menupos > 11) {menupos = 11; granica = true;} else {granica = false;} // если значение больше максимума приравниваем его максимуму, также недаем очищаться экрану и выполнять функцию автоплей
}
if ((newPosition < oldPosition) && (butterm == false)) { // если крутим в лево вне меню термостата
menupos -= 1;
if (menupos < 1) {menupos = 1; granica = true;} else {granica = false;} // если значение меньше минимума приравниваем его минимуму, также недаем очищаться экрану и выполнять функцию автоплей
}
// МЕНЯЕМ ТЕМПЕРАТУРУ В МЕНЮ ТЕРМОСТАТА
if ((newPosition > oldPosition) && (butterm == true)) { // если крутим в право в меню термостата
temphome += 0.2;
if (temphome > 30) { temphome = 30; } // если значение температуры больше максимума, выставляем максимум
}
if ((newPosition < oldPosition) && (butterm == true)) { // если крутим в лево в меню термостата
temphome -= 0.2;
if (temphome < 10) { temphome = 10; } // если значение температуры меньше минимума, выставляем минимум
}
oldPosition = newPosition;
if ((granica == false) && (butterm == false)) { // если мы находимся в пределах границы и не в меню термостата
switch (menupos) { // если значение достигло необходимого для данного номера меню
case 1:
menu = 1;
tft.clrScr(); // Заливаем экран черным
autoplay();
break;
case 6:
menu = 2;
tft.clrScr(); // Заливаем экран черным
autoplay();
break;
case 11:
menu = 3;
tft.clrScr(); // Заливаем экран черным
autoplay();
break;
}
}
if (butterm == true) { // если мы в меню термостата
if (temphome <= 18) { tft.setColor(VGA_AQUA); }
else if (temphome >= 25) { tft.setColor(VGA_RED); }
else { tft.setColor(VGA_LIME); }
tft.printNumF ( temphome, 1, 95, 110 ); // необходимо, чтобы в меню термостата при повороте энкоде менялась температура
}
}
ArduinoOTA.handle();
}