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 () {
+
Адрес MQTT сервера(брокера)
-
+
- Уникальный ID клиента
-
+
+
+
Отпечаток сертификата
+
+
+
Топик
+
Логин
-
+
Пароль
-
+
+
+ Уникальный ID клиента
+
+
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