From 795313b680f33cb6335a2cd04f72fe1128c3b8b4 Mon Sep 17 00:00:00 2001 From: igor Date: Tue, 11 May 2021 23:06:16 +0600 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=20=D0=BA=D0=B0=D0=BA=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=82=D0=B5=D0=BA=D1=83=D1=89=D0=B8=D1=85=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D0=B0=D0=B7=D0=B0=D0=BD=D0=B8=D0=B9=20=D0=BD?= =?UTF-8?q?=D0=B0=20STM8L?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/index.html | 126 +++++++++++++++++++++++++---------- include/tools.h | 2 + src/main.cpp | 173 +++++++++++++++++++++++++++--------------------- src/tools.cpp | 33 ++++++++- 4 files changed, 221 insertions(+), 113 deletions(-) diff --git a/data/index.html b/data/index.html index 28d79df..0a0684d 100644 --- a/data/index.html +++ b/data/index.html @@ -35,7 +35,11 @@ padding-top: 5px; padding-bottom: 5px; } - input[type="text"],input[type="number"] + select{ + font-size:24px; + width: 100%; + } + input[type="text"],input[type="number"],input[type="password"] { font-size:24px; width: 100%; @@ -111,6 +115,15 @@ function delChild(obj) } return false; } + +function updateFields(){ + if(document.getElementById("mqtt_protocol").value=="tls") { + document.getElementById("fingerprint").style.display = "block"; + }else{ //tcp + document.getElementById("fingerprint").style.display = "none"; + } +} + function loadData(){ let req = new XMLHttpRequest(); req.onreadystatechange = function(req) @@ -123,12 +136,17 @@ function loadData(){ document.getElementById("ssid").value=obj.ssid; document.getElementById("pass").value=obj.pass; - document.getElementById("mqtt").value=obj.mqtt; document.getElementById("uuid").value=obj.uuid; - document.getElementById("topic").value=obj.topic; - document.getElementById("login").value=obj.login; - document.getElementById("password").value=obj.password; + document.getElementById("mqtt_protocol").value=obj.mqtt_protocol; + document.getElementById("mqtt_host").value=obj.mqtt_host; + document.getElementById("mqtt_port").value=obj.mqtt_port; + document.getElementById("mqtt_fingerprint").value=obj.mqtt_fingerprint; + document.getElementById("mqtt_topic").value=obj.mqtt_topic; + document.getElementById("mqtt_user").value=obj.mqtt_user; + document.getElementById("mqtt_pass").value=obj.mqtt_pass; + + updateFields(); updateSensors(); } } @@ -147,15 +165,37 @@ function updateSensors(){ { let obj=JSON.parse(req.responseText); g_ticks = obj.ticks; - document.getElementById("cold").innerHTML=obj.cold; - document.getElementById("hot").innerHTML=obj.hot; + if(obj.cold!=null){ document.getElementById("cold").innerHTML=obj.cold; }else{ + document.getElementById("cold").innerHTML="___"; + } + if(obj.hot!=null){ document.getElementById("hot").innerHTML=obj.hot; }else{ + document.getElementById("hot").innerHTML="___"; + } + if(obj.leak) { - document.getElementById("leak").innerHTML = "Протечка обнаружена"; - document.getElementById("leak").style.color='red'; + document.getElementById("leak").innerHTML = "обнаружена"; + document.getElementById("leak").style.color='darkred'; }else { - document.getElementById("leak").innerHTML = "Протечка не обнаружена"; + document.getElementById("leak").innerHTML = "не обнаружена"; document.getElementById("leak").style.color='black'; } + 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); + 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){ + 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); @@ -199,12 +239,14 @@ function sendData() { formData.append("pass", document.getElementById("pass").value); formData.append("hot", document.getElementById("newhot").value); formData.append("cold", document.getElementById("newcold").value); - - formData.append("mqtt", document.getElementById("mqtt").value); - formData.append("uuid", document.getElementById("uuid").value); - formData.append("topic", document.getElementById("topic").value); - formData.append("login", document.getElementById("login").value); - formData.append("password", document.getElementById("password").value); + //formData.append("uuid", document.getElementById("uuid").value); + formData.append("mqtt_protocol", document.getElementById("mqtt_protocol").value); + formData.append("mqtt_host", document.getElementById("mqtt_host").value); + formData.append("mqtt_port", document.getElementById("mqtt_port").value); + formData.append("mqtt_fingerprint", document.getElementById("mqtt_fingerprint").value); + formData.append("mqtt_topic", document.getElementById("mqtt_topic").value); + formData.append("mqtt_user", document.getElementById("mqtt_user").value); + formData.append("mqtt_pass", document.getElementById("mqtt_pass").value); let xhr = new XMLHttpRequest(); xhr.open("POST","/save/"); @@ -231,6 +273,9 @@ function sendData() { } window.onload = function () { + + document.getElementById("mqtt_protocol").onchange=updateFields; + loadData(); setInterval(function () { if(g_ticks>0) { @@ -267,14 +312,14 @@ window.onload = function () {

Точка доступа

Пароль

- +

Для проверки работоспособности спустите не меньше 4х литров воды

Текущее показание холодной воды

-

___

+

___

Новое показание холодной воды

@@ -289,7 +334,7 @@ window.onload = function () {

Текущее показание горячей воды

-

___

+

___

Новое показание горячей воды

@@ -303,9 +348,11 @@ window.onload = function () {
- - -

Протечка не обнаружена

+ + + + +
Протечка:___

@@ -313,34 +360,43 @@ window.onload = function () {


diff --git a/include/tools.h b/include/tools.h index d09a211..633874d 100644 --- a/include/tools.h +++ b/include/tools.h @@ -10,5 +10,7 @@ String getIMEI(); String BeforeFirst(String& str,const char ch); String AfterFirst(String& str,const char ch); String CutBeforeFirst(String& str,char ch,bool cutch); +bool checkCRC(String str); +String addCRC(String str); #endif /* TOOLS_H_ */ \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e86f7bb..21d561f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,8 +17,6 @@ #include #include - - #include #include // Include the WebServer library #include @@ -53,7 +51,7 @@ DNSServer dnsServer; //Для входа и выхода из режима настройки WIFI #define CNF_TIME 300; //Сколько секунд даётся для настройки оборудования (600=5минут) -int ticks = -1; //Переменная для отсчёта секунд, как дойдёт до нуля то засыпаем +int g_ticks = CNF_TIME; //Переменная для отсчёта секунд, как дойдёт до нуля то засыпаем Ticker blinker; //Для подсчёта времени до входа в спящий режим (предполагаю просыпание по кнопке ресет) String ssid="Node6"; @@ -83,6 +81,7 @@ int g_tmpr = -100; //Температура на микроконтроллер //---------------------------------------------------------------------------------------------------- bool configWebServer(); void setLampLight(int mode); + //---------------------------------------------------------------------------------------------------- //Load settings from file system to local variables bool loadConfig() @@ -133,15 +132,42 @@ bool saveConfigs() } return true; } -//======================================================================= +//---------------------------------------------------------------------------------------------------- +//Запрос на получение данных с микроконтроллера +//Для дебага написал тестовую программу клторая эиетирует STM8L по последовательному порту: O:\MyDocuments\projects\Workspace_C++Builder\NeptuneW01 +bool getMode(){ + Serial.println(addCRC("#0;")); //Запрашиваю для какого режима работы включили WIFI + return true; +} +//---------------------------------------------------------------------------------------------------- +// Запрашиваю данные с датчиков +bool callSensorsData(){ + Serial.println(addCRC("#1;")); //Запрашиваем '1'=холодная + Serial.println(addCRC("#2;")); //Запрашиваем '2'=горячая + Serial.println(addCRC("#3;")); //Запрашиваем '3'=протечки + Serial.println(addCRC("#4;")); //Запрашиваем '4'=вольт на аккумуляторе + Serial.println(addCRC("#5;")); //Запрашиваем '5'=температура на процессоре + //Уровень WIFI сигнала берём на ESP8266 а не с STM8L051 + return true; +} +//---------------------------------------------------------------------------------------------------- +// Отправляю данные на STM8L для сохранения +bool saveToProc(){ + // + return true; +} +//---------------------------------------------------------------------------------------------------- void handleNotFound() { server.send(404, "text/plain", "FileNotFound"); } -//======================================================================= -//Отправляю показания датчиков при настройке нептуна +//---------------------------------------------------------------------------------------------------- +//Отправляю показания датчиков для режима настройки void handleSensors() { + + callSensorsData(); //Запрашиваю новые данные датчиков с микроконтроллера + String json; - json.reserve(128); + json.reserve(500); //У меня дома около 500 символов было необходимо //Видимые сети json = "{\"networks\":["; @@ -161,29 +187,36 @@ void handleSensors() { } json += "],"; //Количество тиков до перехода в спящий режим - json += "\"ticks\":"; - json += ticks; - json += ",\"hot\":123"; - json += ",\"cold\":456"; - json += ",\"leak\":false"; + json += "\"ticks\":"+String(g_ticks); + + 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_tmpr<=-100) json += ",\"tmpr\":null"; else json += ",\"tmpr\":"+String(g_tmpr); // Температура + json += "}"; server.send(200, "application/json", json); } -//======================================================================= +//---------------------------------------------------------------------------------------------------- +//Отправляем настройки сети (для режима настройки) void handleData(){ String json; json.reserve(128); json = "{"; - - json += "\"ssid\":\"ssid\""; - json += ",\"pass\":\"pass\""; - - json += ",\"mqtt\":\"mqtt\""; - json += ",\"uuid\":\"uuid\""; - json += ",\"topic\":\"topic\""; - json += ",\"login\":\"login\""; - json += ",\"password\":\"password\""; + + json += "\"ssid\":\""+ssid+"\""; + json += ",\"pass\":\""+pass+"\""; + json += ",\"uuid\":\""+uuid+"\""; + + json += ",\"mqtt_protocol\":\""+mqtt_protocol+"\""; + json += ",\"mqtt_host\":\""+mqtt_host+"\""; + json += ",\"mqtt_port\":\""+String(mqtt_port)+"\""; + json += ",\"mqtt_fingerprint\":\""+mqtt_fingerprint+"\""; + json += ",\"mqtt_topic\":\""+mqtt_topic+"\""; + json += ",\"mqtt_user\":\""+mqtt_user+"\""; + json += ",\"mqtt_pass\":\""+mqtt_pass+"\""; json += "}"; @@ -191,18 +224,38 @@ void handleData(){ } //======================================================================= void handleSave(){ - - Serial.println("+++Save+++"); - + //Serial.println("+++Save+++"); if(server.args()>0){ for(int i=0;i-100) + data+="\"volt\":"+String(g_volt/100.0f); // Вольт на акумуляторе + if(g_tmpr>-100){ data+=",\"tmpr\":"+String(g_tmpr); // Температура + } + data+=",\"rssi\":"+String(WiFi.RSSI()); //Уровень WIFI сигнала data+="}"; mqttClient.publish(mqtt_topic.c_str(), data.c_str(), true); //Отправляю данные в топик (С флагом RETAIN чтобы слушатели которые подключились поздно получили тек. состояние) Serial.println(data); //Как отправили данные устанавливаю время ожидания входа в сон на 5 секунд чтобы ESP8266 заснул - ticks=5; + g_ticks=5; //Очищаю данные g_cold=-1; g_hot=-1; @@ -589,5 +609,4 @@ void loop(){ g_volt=-1; g_tmpr=-100; } - } diff --git a/src/tools.cpp b/src/tools.cpp index 4d0e652..4cc0cf9 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -79,4 +79,35 @@ String CutBeforeFirst(String& str,char ch,bool cutch=true) } return result; } -//---------------------------------------------------------------------------------------------------- \ No newline at end of file +//---------------------------------------------------------------------------------------------------- +//Проверяю правильный ли CRC в строке +bool checkCRC(String str){ + + String data=CutBeforeFirst(str,'!',false); + String crcS=CutBeforeFirst(str,'*',true); + + //Подсчитываю CRC и проверяю с тем что передалось + unsigned char crcD=0; + for(unsigned int i=0;i