diff --git a/data/index.html b/data/index.html index 0a0684d..b7b21c3 100644 --- a/data/index.html +++ b/data/index.html @@ -181,21 +181,19 @@ function updateSensors(){ } if(obj.volt!=null){ document.getElementById("volt_cnt").style.display='table-row'; - let p; - if(obj.volt==300) p=0; - else p=Math.round(((obj.volt-300)/(420-300))*100); + let p=(obj.volt-290)/130; //Преобразую в проценты где 2,9 это 0 % а 4.2 это 100% if(p<0) p=0; if(p>100) p=100; document.getElementById("volt").innerHTML=p+"%"; }else{ document.getElementById("volt_cnt").style.display='none'; } - if(obj.tmpr!=null){ + /*if(obj.tmpr!=null){ document.getElementById("tmpr_cnt").style.display='table-row'; document.getElementById("tmpr").innerHTML=obj.tmpr+"°C"; }else{ document.getElementById("tmpr_cnt").style.display='none'; - } + }*/ let networks = document.getElementById("networks"); delChild(networks); @@ -281,7 +279,8 @@ window.onload = function () { if(g_ticks>0) { updateSensors(); } - }, 5000); + }, 10000); + setInterval(function () { if(g_ticks>0) { if(g_ticks!=999) { @@ -351,7 +350,7 @@ window.onload = function () {
| Протечка: | ___ |
diff --git a/data/settings.txt b/data/settings.txt index 39ead40..4110f18 100644 --- a/data/settings.txt +++ b/data/settings.txt @@ -5,4 +5,4 @@ mqtt_port=1883 mqtt_fingerprint=32:95:81:45:9C:32:F3:BD:B3:09:63:58:D3:94:AC:19:78:45:3B:15 mqtt_user=xxxxxx mqtt_pass=xxxxxx -mqtt_topic=home/lights/main +mqtt_topic=home/water/main diff --git a/src/main.cpp b/src/main.cpp index 21d561f..5f7602c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -35,6 +35,7 @@ Bounce bounce = Bounce(); //Для избавления от дребезга к int blink=LOW; //Для мигания при настройке int blinkMSec=0; //Для мигания при настройке +bool blinkEnbl=true; //Разрешено ли гореть(мигать) светодиоду ESP8266WebServer server(80); // Set web server and port number to 80 WiFiClient wifiClient; @@ -51,9 +52,13 @@ DNSServer dnsServer; //Для входа и выхода из режима настройки WIFI #define CNF_TIME 300; //Сколько секунд даётся для настройки оборудования (600=5минут) -int g_ticks = CNF_TIME; //Переменная для отсчёта секунд, как дойдёт до нуля то засыпаем +int g_ticks_cnf = 0; //Переменная для отсчёта секунд, как дойдёт до нуля то засыпаем Ticker blinker; //Для подсчёта времени до входа в спящий режим (предполагаю просыпание по кнопке ресет) +//Сколько секунд для отправки данных на сервер (после получения показаний сокращаю время) +#define SND_TIME 100; +int g_ticks_snd = 0; + String ssid="Node6"; String pass="isecretk"; @@ -68,16 +73,18 @@ String mqtt_pass = ""; // Пароль для подключения к серв String mqtt_topic = "home/water/main"; /* 1=on, 0=off else toggle*/ #define LED_QOS 1 //0 - Без подтверждения 1 - С подтверждением 2 - С подтверждением и без возможности двойной отправки -int time5s=millis(); //Для реконекта каждые 5 секунд +int time5s=millis(); //Для реконекта к MQTT каждые 5 секунд String uuid=""; //Уникальный ID клиента (загружается из файловой системы) String g_data; //Для накопления данных с последовательного порта //---------------------------------------------------------------------------------------------------- -int g_cold = -1; //Показание холодной воды -int g_hot = -1; //Показание горячей воды -int g_leak = -1; //Протечка 0 нет 1 есть -int g_volt = -1; //Вольт на акамуляторе -int g_tmpr = -100; //Температура на микроконтроллере +int g_cold = -1; //Показание холодной воды c STM8L051 +int g_cold_new = -1; //Для записи в контроллер +int g_hot = -1; //Показание горячей воды c STM8L051 +int g_hot_new = -1; //Для записи в контроллер +int g_leak = -1; //Протечка 0 нет 1 есть c STM8L051 +int g_volt = -1; //Вольт на акамуляторе c STM8L051 +int g_tmpr = -100; //Температура на микроконтроллере (на текущем нет температуры) c STM8L051 //---------------------------------------------------------------------------------------------------- bool configWebServer(); void setLampLight(int mode); @@ -110,13 +117,17 @@ bool loadConfig() return true; } //---------------------------------------------------------------------------------------------------- -//Save settings from local variables to file system +//Save settings from local variables to file system and send to STM8L051 bool saveConfigs() { + bool result; File f = LittleFS.open("settings.txt", "w"); if (!f) { Serial.println("Count file open failed on update."); + result=false; } else { + Serial.println("MQTT HOST = "+mqtt_host); + f.println("ssid="+ssid); f.println("pass="+pass); @@ -129,14 +140,27 @@ bool saveConfigs() f.println("mqtt_pass="+mqtt_pass); f.close(); + + //Отправляю значения горячей и холодной на микроконтроллер + if(g_cold_new != -1){ + Serial.println(addCRC("#c;"+String(g_cold_new)+";")); + g_cold_new=-1; + } + if(g_hot_new){ + Serial.println(addCRC("#h;"+String(g_hot_new)+";")); + g_hot_new=-1; + } + + result=true; } - return true; + return result; } //---------------------------------------------------------------------------------------------------- -//Запрос на получение данных с микроконтроллера +//Запрос на получение данных с микроконтроллера, вызывается после пробуждения //Для дебага написал тестовую программу клторая эиетирует STM8L по последовательному порту: O:\MyDocuments\projects\Workspace_C++Builder\NeptuneW01 bool getMode(){ - Serial.println(addCRC("#0;")); //Запрашиваю для какого режима работы включили WIFI + Serial.println("REQQQQQQQ"); + Serial.println(addCRC("#0;")); //Запрашиваю для какого режима работы включили ESP8266 return true; } //---------------------------------------------------------------------------------------------------- @@ -146,7 +170,7 @@ bool callSensorsData(){ Serial.println(addCRC("#2;")); //Запрашиваем '2'=горячая Serial.println(addCRC("#3;")); //Запрашиваем '3'=протечки Serial.println(addCRC("#4;")); //Запрашиваем '4'=вольт на аккумуляторе - Serial.println(addCRC("#5;")); //Запрашиваем '5'=температура на процессоре + //Serial.println(addCRC("#5;")); //Запрашиваем '5'=температура на процессоре //Уровень WIFI сигнала берём на ESP8266 а не с STM8L051 return true; } @@ -187,12 +211,12 @@ void handleSensors() { } json += "],"; //Количество тиков до перехода в спящий режим - json += "\"ticks\":"+String(g_ticks); + json += "\"ticks\":"+String(g_ticks_cnf); if(g_cold<0) json += ",\"cold\":null"; else json += ",\"cold\":"+String(g_cold); if(g_hot<0) json += ",\"hot\":null"; else json += ",\"hot\":"+String(g_hot); if(g_leak==1) json += ",\"leak\":true"; else if(g_leak==0) json += ",\"leak\":false"; else json += ",\"leak\":null"; - if(g_volt<0) json += ",\"volt\":null"; else json += ",\"volt\":"+String(g_volt); + if(g_volt<0) json += ",\"volt\":null"; else json += ",\"volt\":"+String(g_volt); if(g_tmpr<=-100) json += ",\"tmpr\":null"; else json += ",\"tmpr\":"+String(g_tmpr); // Температура json += "}"; @@ -223,6 +247,7 @@ void handleData(){ server.send(200, "application/json", json); } //======================================================================= +// Обработка HTML запроса на сохранение настроек void handleSave(){ //Serial.println("+++Save+++"); if(server.args()>0){ @@ -236,10 +261,10 @@ void handleSave(){ pass=server.arg(i); if(server.argName(i)=="cold" && server.arg(i)!=""){ - g_cold=server.arg(i); + g_cold_new=server.arg(i).toInt(); } if(server.argName(i)=="hot" && server.arg(i)!=""){ - g_hot=server.arg(i); + g_hot_new=server.arg(i).toInt(); } if(server.argName(i)=="mqtt_protocol") @@ -257,6 +282,7 @@ void handleSave(){ if(server.argName(i)=="mqtt_pass") mqtt_pass=server.arg(i); } + saveConfigs(); } server.send(200, "text/html", "ok"); } @@ -272,7 +298,7 @@ void handleMain() { file.close(); } }else{ - Serial.println("File not exists!"); + Serial.println("File \"index.html\" not exists!"); } } //---------------------------------------------------------------------------------------------------- @@ -336,11 +362,11 @@ bool createAP(){ //---------------------------------------------------------------------------------------------------- //Отключить программную точку доступа bool deleteAP(){ - Serial.print("softAPdisconnect();"); + Serial.println("softAPdisconnect();"); dnsServer.stop(); bool result=WiFi.softAPdisconnect(true); //Гашу светодиод - digitalWrite(LED_BUILTIN,HIGH); //LOW + //digitalWrite(PIN_LED,HIGH); //LOW return result; } @@ -348,17 +374,36 @@ bool deleteAP(){ //Функция для подсчёта времени до перехода в спящий режим void tick_1s() { - g_ticks--; - if(g_ticks==0){ //Переходим в спящий режим - Serial.print("Deep sleep!"); - Serial.print(addCRC("#d;!")); //Отсылаю команду на STM8 чтобы он на CHIP_PU подал низский сигнал для отключения питания + Serial.println("t"); + + g_ticks_cnf--; + if(g_ticks_cnf==0){ //Переходим в спящий режим + Serial.print("Deep sleep 1 !"); + blinkEnbl=false; //Чтобы не мигал + digitalWrite(PIN_LED, HIGH); //Пытаюсь выключить светодтод чтобы он не светился при полном засыпании + Serial.print(addCRC("#d;")); //Отсылаю команду на STM8 чтобы он на CHIP_PU подал низский сигнал для отключения питания } - //Если в течении 2х минут не перешли в режим глубокого сна то переходим в обычный сон - if(g_ticks==-600){ + + g_ticks_snd--; + if(g_ticks_snd==0) //Начальное значение 0 то сюда не заходит, а заходит только после таймаута + { + Serial.print("Deep sleep 2 !"); + blinkEnbl=false; //Чтобы не мигал + digitalWrite(PIN_LED, HIGH); //Пытаюсь выключить светодтод чтобы он не светился при полном засыпании + Serial.print(addCRC("#d;")); //Отсылаю команду на STM8 чтобы он на CHIP_PU подал низский сигнал для отключения питания + } + + //Больше 20 секунд без данных не должно работать + //Если не перешли в режим глубокого сна то переходим в обычный сон + if(g_ticks_snd<=-20 && g_ticks_cnf<=-20) + { Serial.println("Sleep!"); - Serial.print(addCRC("#d;!")); //Повторно отсылаю команду на STM8 чтобы он на CHIP_PU подал низский сигнал для отключения питания + blinkEnbl=false; //Чтобы не мигал + digitalWrite(PIN_LED, HIGH); //Пытаюсь выключить светодтод чтобы он не светился при полном засыпании + Serial.print(addCRC("#d;")); //Повторно отсылаю команду на STM8 чтобы он на CHIP_PU подал низский сигнал для отключения питания ESP.deepSleep(0); } + } //---------------------------------------------------------------------------------------------------- bool configWebServer(){ @@ -406,6 +451,7 @@ bool connectToMQTT(){ } } } + //Serial.println("EXIT"); return true; } //---------------------------------------------------------------------------------------------------- @@ -416,7 +462,8 @@ void setup() Serial.println("Init led pin"); //Настраиваем светодиод на плате pinMode(PIN_LED, OUTPUT); - digitalWrite(PIN_LED, HIGH); // Выключаю светодиод + //digitalWrite(PIN_LED, HIGH); // Выключаю светодиод + digitalWrite(PIN_LED, LOW); //Включаю светодиод //Инициализирую файловую систему if(LittleFS.begin()) @@ -477,32 +524,52 @@ void loop(){ /* mqttClient.loop(); - dnsServer.processNextRequest(); //DNS - server.handleClient(); //Обрабатываем запрос клиента (без этого не берётся IP адресс) + server.handleClient(); //Обрабатываем запрос клиента (без этого не берётся IP адресс) +*/ - - - if(g_ticks>0){ - //В режиме конфигурации каждые 500 миллисекунд меняем цвет зелёного светодиода + //мигаем светодиодом в зависемости от режима работы + //Если в режиме конфигурации каждые 500 миллисекунд меняем цвет зелёного светодиода + if(g_ticks_cnf>0){ if(millis()-blinkMSec>500){ - blink=!blink; - digitalWrite(LED_BUILTIN,blink); + if(blinkEnbl){ + blink=!blink; + digitalWrite(PIN_LED,blink); + }else{ + digitalWrite(PIN_LED, HIGH); + } + blinkMSec=millis(); } - }else{ - //Если в нормальном режиме функционирования - //Проверяю соединение с MQTT и если не соединён то пытаюсь подключиться каждые 10 секунд - if(millis()-time5s>10000){ + } + //Если в режиме отправки каждые 100 миллисекунд меняем цвет зелёного светодиода + if(g_ticks_snd>0){ + if(millis()-blinkMSec>100){ + if(blinkEnbl){ + blink=!blink; + digitalWrite(PIN_LED,blink); + }else{ + digitalWrite(PIN_LED, HIGH); + } + blinkMSec=millis(); + } + //Проверяю соединение с MQTT и если не соединён то пытаюсь подключиться каждые 5 секунд + if(millis()-time5s>5000){ if(!mqttClient.connected()) { connectToMQTT(); } time5s=millis(); + } + } + //Если не известно в каком режиме то просто светим + if(g_ticks_snd < 0 && g_ticks_cnf < 0){ + if(blinkEnbl){ + digitalWrite(PIN_LED, LOW); //Включаю светодиод + }else{ + digitalWrite(PIN_LED, HIGH); } } -*/ - //Блок кода для общения с энергоэфективным микроконтроллером int inByte = 0; @@ -533,17 +600,20 @@ void loop(){ String value=CutBeforeFirst(g_data,'!',true); //Если 1 то отправлять данные на сервер если 0 то войти в режим настройки в качестве точки доступа Serial.print("value mode = "); Serial.println(value); - if(value=="1"){ //Если разбудили для того чтобы передать данные + if(value=="0"){ //Если разбудили для того чтобы передать данные Serial.println("Send data mode"); - if(deleteAP()){ - connectToWIFIPoint(); + deleteAP(); //На всякий случай + if(connectToWIFIPoint()){ + g_ticks_snd = SND_TIME; + connectToMQTT(); + callSensorsData(); //Запрашиваю новые данные датчиков с микроконтроллера } } - if(value=="0"){ //Если разбудили для того чтобы настроить оборудование + if(value=="1"){ //Если разбудили для того чтобы настроить оборудование Serial.println("Config mode"); if(disconnectFromWIFIPoint()){ if(createAP()){ - g_ticks = CNF_TIME; + g_ticks_cnf = CNF_TIME; } } } @@ -572,7 +642,7 @@ void loop(){ Serial.println(value); g_volt=value.toInt(); } - if(cmd=="#5;"){ //'5'=температура + if(cmd=="#5;"){ //'5'=температура (в текущем чипе её нет) String value=CutBeforeFirst(g_data,'!',true); Serial.print("value tmrt = "); Serial.println(value); @@ -584,7 +654,7 @@ void loop(){ } //Как все данные накопились отправляем их по MQTT на сервер - if(WiFi.status() == WL_CONNECTED && g_cold!=-1 && g_hot!=-1 && g_leak!=-1 && g_volt !=-1){ + if(WiFi.status() == WL_CONNECTED && mqttClient.connected() && g_cold!=-1 && g_hot!=-1 && g_leak!=-1 && g_volt !=-1){ String data="{"; data+="\"cold\":"+String(g_cold)+","; // Горячая @@ -601,7 +671,7 @@ void loop(){ Serial.println(data); //Как отправили данные устанавливаю время ожидания входа в сон на 5 секунд чтобы ESP8266 заснул - g_ticks=5; + g_ticks_snd=10; //Очищаю данные g_cold=-1; g_hot=-1; diff --git a/src/tools.cpp b/src/tools.cpp index 4cc0cf9..7ba1656 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -110,4 +110,4 @@ String addCRC(String str){ crcD+=str[i]; } return str+String(crcD)+"*"; -} \ No newline at end of file +}