Перед тем как сделать сохранения текущих показаний на STM8L
This commit is contained in:
126
data/index.html
126
data/index.html
@ -35,7 +35,11 @@
|
|||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
padding-bottom: 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;
|
font-size:24px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -111,6 +115,15 @@ function delChild(obj)
|
|||||||
}
|
}
|
||||||
return false;
|
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(){
|
function loadData(){
|
||||||
let req = new XMLHttpRequest();
|
let req = new XMLHttpRequest();
|
||||||
req.onreadystatechange = function(req)
|
req.onreadystatechange = function(req)
|
||||||
@ -123,12 +136,17 @@ function loadData(){
|
|||||||
document.getElementById("ssid").value=obj.ssid;
|
document.getElementById("ssid").value=obj.ssid;
|
||||||
document.getElementById("pass").value=obj.pass;
|
document.getElementById("pass").value=obj.pass;
|
||||||
|
|
||||||
document.getElementById("mqtt").value=obj.mqtt;
|
|
||||||
document.getElementById("uuid").value=obj.uuid;
|
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();
|
updateSensors();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -147,15 +165,37 @@ function updateSensors(){
|
|||||||
{
|
{
|
||||||
let obj=JSON.parse(req.responseText);
|
let obj=JSON.parse(req.responseText);
|
||||||
g_ticks = obj.ticks;
|
g_ticks = obj.ticks;
|
||||||
document.getElementById("cold").innerHTML=obj.cold;
|
if(obj.cold!=null){ document.getElementById("cold").innerHTML=obj.cold; }else{
|
||||||
document.getElementById("hot").innerHTML=obj.hot;
|
document.getElementById("cold").innerHTML="___";
|
||||||
|
}
|
||||||
|
if(obj.hot!=null){ document.getElementById("hot").innerHTML=obj.hot; }else{
|
||||||
|
document.getElementById("hot").innerHTML="___";
|
||||||
|
}
|
||||||
|
|
||||||
if(obj.leak) {
|
if(obj.leak) {
|
||||||
document.getElementById("leak").innerHTML = "Протечка обнаружена";
|
document.getElementById("leak").innerHTML = "обнаружена";
|
||||||
document.getElementById("leak").style.color='red';
|
document.getElementById("leak").style.color='darkred';
|
||||||
}else {
|
}else {
|
||||||
document.getElementById("leak").innerHTML = "Протечка не обнаружена";
|
document.getElementById("leak").innerHTML = "не обнаружена";
|
||||||
document.getElementById("leak").style.color='black';
|
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");
|
let networks = document.getElementById("networks");
|
||||||
delChild(networks);
|
delChild(networks);
|
||||||
@ -199,12 +239,14 @@ function sendData() {
|
|||||||
formData.append("pass", document.getElementById("pass").value);
|
formData.append("pass", document.getElementById("pass").value);
|
||||||
formData.append("hot", document.getElementById("newhot").value);
|
formData.append("hot", document.getElementById("newhot").value);
|
||||||
formData.append("cold", document.getElementById("newcold").value);
|
formData.append("cold", document.getElementById("newcold").value);
|
||||||
|
//formData.append("uuid", document.getElementById("uuid").value);
|
||||||
formData.append("mqtt", document.getElementById("mqtt").value);
|
formData.append("mqtt_protocol", document.getElementById("mqtt_protocol").value);
|
||||||
formData.append("uuid", document.getElementById("uuid").value);
|
formData.append("mqtt_host", document.getElementById("mqtt_host").value);
|
||||||
formData.append("topic", document.getElementById("topic").value);
|
formData.append("mqtt_port", document.getElementById("mqtt_port").value);
|
||||||
formData.append("login", document.getElementById("login").value);
|
formData.append("mqtt_fingerprint", document.getElementById("mqtt_fingerprint").value);
|
||||||
formData.append("password", document.getElementById("password").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();
|
let xhr = new XMLHttpRequest();
|
||||||
xhr.open("POST","/save/");
|
xhr.open("POST","/save/");
|
||||||
@ -231,6 +273,9 @@ function sendData() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
window.onload = function () {
|
window.onload = function () {
|
||||||
|
|
||||||
|
document.getElementById("mqtt_protocol").onchange=updateFields;
|
||||||
|
|
||||||
loadData();
|
loadData();
|
||||||
setInterval(function () {
|
setInterval(function () {
|
||||||
if(g_ticks>0) {
|
if(g_ticks>0) {
|
||||||
@ -267,14 +312,14 @@ window.onload = function () {
|
|||||||
<h3>Точка доступа</h3>
|
<h3>Точка доступа</h3>
|
||||||
<input id="ssid" name="ssid" type="text" size="40">
|
<input id="ssid" name="ssid" type="text" size="40">
|
||||||
<h3>Пароль</h3>
|
<h3>Пароль</h3>
|
||||||
<input id="pass" name="pass" type="text" size="40">
|
<input id="pass" name="pass" type="password" size="40">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Для проверки работоспособности спустите не меньше 4х литров воды
|
Для проверки работоспособности спустите не меньше 4х литров воды
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h4>Текущее показание холодной воды</h4>
|
<h4>Текущее показание холодной воды</h4>
|
||||||
<h4 id="cold" style="color: #1655f5">___</h4>
|
<h4 id="cold" style="color: darkblue;">___</h4>
|
||||||
<h3>Новое показание холодной воды</h3>
|
<h3>Новое показание холодной воды</h3>
|
||||||
<table style="width: 100%;">
|
<table style="width: 100%;">
|
||||||
<tr>
|
<tr>
|
||||||
@ -289,7 +334,7 @@ window.onload = function () {
|
|||||||
|
|
||||||
|
|
||||||
<h4>Текущее показание горячей воды</h4>
|
<h4>Текущее показание горячей воды</h4>
|
||||||
<h4 id="hot" style="color: #f53410">___</h4>
|
<h4 id="hot" style="color: darkred;">___</h4>
|
||||||
|
|
||||||
<h3>Новое показание горячей воды</h3>
|
<h3>Новое показание горячей воды</h3>
|
||||||
<table style="width: 100%;">
|
<table style="width: 100%;">
|
||||||
@ -303,9 +348,11 @@ window.onload = function () {
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
<table style="width: 100%;">
|
||||||
|
<tr style="width: 100%;"><td style="text-align:left;">Протечка:</td><td id="leak" style="width: 50px;text-align:right;white-space: nowrap;">___</td></tr>
|
||||||
<h3 id="leak">Протечка не обнаружена</h3>
|
<tr id="volt_cnt" style="display: none;"><td style="text-align:left; width: 90%;">Заряд аккумулятора:</td><td id="volt" style="width: 50px;text-align:right;">___</td></tr>
|
||||||
|
<tr id="tmpr_cnt" style="display: none;"><td style="text-align:left; width: 90%;">Температура:</td><td id="tmpr" style="width: 50px;text-align:right;">___</td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<input id="chbox" name="chbox" style="width:20px;height:20px;" onclick="if(this.checked) document.getElementById('settings').style.display='block'; else document.getElementById('settings').style.display='none';" type="checkbox">
|
<input id="chbox" name="chbox" style="width:20px;height:20px;" onclick="if(this.checked) document.getElementById('settings').style.display='block'; else document.getElementById('settings').style.display='none';" type="checkbox">
|
||||||
@ -313,34 +360,43 @@ window.onload = function () {
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div id="settings" style="display: none;">
|
<div id="settings" style="display: none;">
|
||||||
|
|
||||||
<p>Адрес MQTT сервера(брокера)</p>
|
<p>Адрес MQTT сервера(брокера)</p>
|
||||||
<table style="width: 100%;">
|
<table>
|
||||||
|
<tr><td>соед.</td><td>хост</td><td>порт</td><td></td></tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td><select name="mqtt_protocol" id="mqtt_protocol" style="width:80px;"><option value="tcp">TCP</option><option value="tls">TCP(TLS)</option></select></td>
|
||||||
<input id="mqtt" name="mqtt" type="text" size="40" style="width: 100%;">
|
<td><input id="mqtt_host" name="mqtt_host" type="text" size="40"></td>
|
||||||
</td>
|
<td><input id="mqtt_port" name="mqtt_port" type="text" size="40" style="width:60px;"></td>
|
||||||
<td>
|
<td><div class="restore_box" onclick="document.getElementById('mqtt_protocol').value='tcp'; document.getElementById('mqtt_host').value='observer.kz'; document.getElementById('mqtt_port').value='1883'; updateFields(); "></div></td>
|
||||||
<div class="restore_box" onclick="document.getElementById('mqtt').value='ssl://observer.kz:8883';"></div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<p>Уникальный ID клиента</p>
|
|
||||||
<input id="uuid" name="uuid" type="text" size="40" disabled="disabled">
|
<div id="fingerprint" style="display: none;">
|
||||||
|
<p>Отпечаток сертификата</p>
|
||||||
|
<input id="mqtt_fingerprint" name="mqtt_fingerprint" type="text" size="61" value="">
|
||||||
|
</div>
|
||||||
|
|
||||||
<p>Топик</p>
|
<p>Топик</p>
|
||||||
<table style="width: 100%;">
|
<table style="width: 100%;">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<input id="topic" name="topic" type="text" size="40" value="neptune">
|
<input id="mqtt_topic" name="mqtt_topic" type="text" size="40" value="home/water/main">
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="restore_box" onclick="document.getElementById('topic').value='neptune';"></div>
|
<div class="restore_box" onclick="document.getElementById('mqtt_topic').value='home/water/main';"></div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p>Логин</p>
|
<p>Логин</p>
|
||||||
<input id="login" name="login" type="text" size="40" value="">
|
<input id="mqtt_user" name="mqtt_user" type="text" size="40" value="">
|
||||||
<p>Пароль</p>
|
<p>Пароль</p>
|
||||||
<input id="password" name="password" type="text" size="40" value="">
|
<input id="mqtt_pass" name="mqtt_pass" type="password" size="40" value="">
|
||||||
|
|
||||||
|
<p>Уникальный ID клиента</p>
|
||||||
|
<input id="uuid" name="uuid" type="text" size="40" disabled="disabled">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|||||||
@ -10,5 +10,7 @@ String getIMEI();
|
|||||||
String BeforeFirst(String& str,const char ch);
|
String BeforeFirst(String& str,const char ch);
|
||||||
String AfterFirst(String& str,const char ch);
|
String AfterFirst(String& str,const char ch);
|
||||||
String CutBeforeFirst(String& str,char ch,bool cutch);
|
String CutBeforeFirst(String& str,char ch,bool cutch);
|
||||||
|
bool checkCRC(String str);
|
||||||
|
String addCRC(String str);
|
||||||
|
|
||||||
#endif /* TOOLS_H_ */
|
#endif /* TOOLS_H_ */
|
||||||
169
src/main.cpp
169
src/main.cpp
@ -17,8 +17,6 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <ESP8266WiFi.h>
|
#include <ESP8266WiFi.h>
|
||||||
#include <ESP8266WebServer.h> // Include the WebServer library
|
#include <ESP8266WebServer.h> // Include the WebServer library
|
||||||
#include <DNSServer.h>
|
#include <DNSServer.h>
|
||||||
@ -53,7 +51,7 @@ DNSServer dnsServer;
|
|||||||
|
|
||||||
//Для входа и выхода из режима настройки WIFI
|
//Для входа и выхода из режима настройки WIFI
|
||||||
#define CNF_TIME 300; //Сколько секунд даётся для настройки оборудования (600=5минут)
|
#define CNF_TIME 300; //Сколько секунд даётся для настройки оборудования (600=5минут)
|
||||||
int ticks = -1; //Переменная для отсчёта секунд, как дойдёт до нуля то засыпаем
|
int g_ticks = CNF_TIME; //Переменная для отсчёта секунд, как дойдёт до нуля то засыпаем
|
||||||
Ticker blinker; //Для подсчёта времени до входа в спящий режим (предполагаю просыпание по кнопке ресет)
|
Ticker blinker; //Для подсчёта времени до входа в спящий режим (предполагаю просыпание по кнопке ресет)
|
||||||
|
|
||||||
String ssid="Node6";
|
String ssid="Node6";
|
||||||
@ -83,6 +81,7 @@ int g_tmpr = -100; //Температура на микроконтроллер
|
|||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
bool configWebServer();
|
bool configWebServer();
|
||||||
void setLampLight(int mode);
|
void setLampLight(int mode);
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
//Load settings from file system to local variables
|
//Load settings from file system to local variables
|
||||||
bool loadConfig()
|
bool loadConfig()
|
||||||
@ -133,15 +132,42 @@ bool saveConfigs()
|
|||||||
}
|
}
|
||||||
return true;
|
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() {
|
void handleNotFound() {
|
||||||
server.send(404, "text/plain", "FileNotFound");
|
server.send(404, "text/plain", "FileNotFound");
|
||||||
}
|
}
|
||||||
//=======================================================================
|
//----------------------------------------------------------------------------------------------------
|
||||||
//Отправляю показания датчиков при настройке нептуна
|
//Отправляю показания датчиков для режима настройки
|
||||||
void handleSensors() {
|
void handleSensors() {
|
||||||
|
|
||||||
|
callSensorsData(); //Запрашиваю новые данные датчиков с микроконтроллера
|
||||||
|
|
||||||
String json;
|
String json;
|
||||||
json.reserve(128);
|
json.reserve(500); //У меня дома около 500 символов было необходимо
|
||||||
|
|
||||||
//Видимые сети
|
//Видимые сети
|
||||||
json = "{\"networks\":[";
|
json = "{\"networks\":[";
|
||||||
@ -161,29 +187,36 @@ void handleSensors() {
|
|||||||
}
|
}
|
||||||
json += "],";
|
json += "],";
|
||||||
//Количество тиков до перехода в спящий режим
|
//Количество тиков до перехода в спящий режим
|
||||||
json += "\"ticks\":";
|
json += "\"ticks\":"+String(g_ticks);
|
||||||
json += ticks;
|
|
||||||
json += ",\"hot\":123";
|
if(g_cold<0) json += ",\"cold\":null"; else json += ",\"cold\":"+String(g_cold);
|
||||||
json += ",\"cold\":456";
|
if(g_hot<0) json += ",\"hot\":null"; else json += ",\"hot\":"+String(g_hot);
|
||||||
json += ",\"leak\":false";
|
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 += "}";
|
json += "}";
|
||||||
server.send(200, "application/json", json);
|
server.send(200, "application/json", json);
|
||||||
}
|
}
|
||||||
//=======================================================================
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
//Отправляем настройки сети (для режима настройки)
|
||||||
void handleData(){
|
void handleData(){
|
||||||
String json;
|
String json;
|
||||||
json.reserve(128);
|
json.reserve(128);
|
||||||
|
|
||||||
json = "{";
|
json = "{";
|
||||||
|
|
||||||
json += "\"ssid\":\"ssid\"";
|
json += "\"ssid\":\""+ssid+"\"";
|
||||||
json += ",\"pass\":\"pass\"";
|
json += ",\"pass\":\""+pass+"\"";
|
||||||
|
json += ",\"uuid\":\""+uuid+"\"";
|
||||||
|
|
||||||
json += ",\"mqtt\":\"mqtt\"";
|
json += ",\"mqtt_protocol\":\""+mqtt_protocol+"\"";
|
||||||
json += ",\"uuid\":\"uuid\"";
|
json += ",\"mqtt_host\":\""+mqtt_host+"\"";
|
||||||
json += ",\"topic\":\"topic\"";
|
json += ",\"mqtt_port\":\""+String(mqtt_port)+"\"";
|
||||||
json += ",\"login\":\"login\"";
|
json += ",\"mqtt_fingerprint\":\""+mqtt_fingerprint+"\"";
|
||||||
json += ",\"password\":\"password\"";
|
json += ",\"mqtt_topic\":\""+mqtt_topic+"\"";
|
||||||
|
json += ",\"mqtt_user\":\""+mqtt_user+"\"";
|
||||||
|
json += ",\"mqtt_pass\":\""+mqtt_pass+"\"";
|
||||||
|
|
||||||
json += "}";
|
json += "}";
|
||||||
|
|
||||||
@ -191,18 +224,38 @@ void handleData(){
|
|||||||
}
|
}
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void handleSave(){
|
void handleSave(){
|
||||||
|
//Serial.println("+++Save+++");
|
||||||
Serial.println("+++Save+++");
|
|
||||||
|
|
||||||
if(server.args()>0){
|
if(server.args()>0){
|
||||||
for(int i=0;i<server.args();i++){
|
for(int i=0;i<server.args();i++){
|
||||||
Serial.println("Nane = "+server.argName(i));
|
//Serial.println("Nane = "+server.argName(i));
|
||||||
Serial.println(server.arg(i));
|
//Serial.println(server.arg(i));
|
||||||
|
|
||||||
if(server.argName(i)=="ssid")
|
if(server.argName(i)=="ssid")
|
||||||
ssid=server.arg(i);
|
ssid=server.arg(i);
|
||||||
if(server.argName(i)=="pass")
|
if(server.argName(i)=="pass")
|
||||||
pass=server.arg(i);
|
pass=server.arg(i);
|
||||||
|
|
||||||
|
if(server.argName(i)=="cold" && server.arg(i)!=""){
|
||||||
|
g_cold=server.arg(i);
|
||||||
|
}
|
||||||
|
if(server.argName(i)=="hot" && server.arg(i)!=""){
|
||||||
|
g_hot=server.arg(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(server.argName(i)=="mqtt_protocol")
|
||||||
|
mqtt_protocol=server.arg(i);
|
||||||
|
if(server.argName(i)=="mqtt_host")
|
||||||
|
mqtt_host=server.arg(i);
|
||||||
|
if(server.argName(i)=="mqtt_port")
|
||||||
|
mqtt_port=server.arg(i).toInt();
|
||||||
|
if(server.argName(i)=="mqtt_fingerprint")
|
||||||
|
mqtt_fingerprint=server.arg(i);
|
||||||
|
if(server.argName(i)=="mqtt_topic")
|
||||||
|
mqtt_topic=server.arg(i);
|
||||||
|
if(server.argName(i)=="mqtt_user")
|
||||||
|
mqtt_user=server.arg(i);
|
||||||
|
if(server.argName(i)=="mqtt_pass")
|
||||||
|
mqtt_pass=server.arg(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
server.send(200, "text/html", "ok");
|
server.send(200, "text/html", "ok");
|
||||||
@ -260,7 +313,7 @@ bool createAP(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
Serial.print("Setting soft-AP ... ");
|
Serial.print("Setting soft-AP ... ");
|
||||||
boolean result = WiFi.softAP("Observer_V03");
|
boolean result = WiFi.softAP("NeptuneW01");
|
||||||
if(result == true)
|
if(result == true)
|
||||||
{
|
{
|
||||||
Serial.println("Ready");
|
Serial.println("Ready");
|
||||||
@ -295,32 +348,18 @@ bool deleteAP(){
|
|||||||
//Функция для подсчёта времени до перехода в спящий режим
|
//Функция для подсчёта времени до перехода в спящий режим
|
||||||
void tick_1s()
|
void tick_1s()
|
||||||
{
|
{
|
||||||
ticks--;
|
g_ticks--;
|
||||||
if(ticks==0){ //Переходим в спящий режим
|
if(g_ticks==0){ //Переходим в спящий режим
|
||||||
Serial.print("Deep sleep!");
|
Serial.print("Deep sleep!");
|
||||||
Serial.print("#0;!*"); //Отсылаю команду на STM8 чтобы он на CHIP_PU подал низский сигнал для отключения питания
|
Serial.print(addCRC("#d;!")); //Отсылаю команду на STM8 чтобы он на CHIP_PU подал низский сигнал для отключения питания
|
||||||
}
|
}
|
||||||
//Если в течении 2х минут не перешли в режим глубокого сна то переходим в обычный сон
|
//Если в течении 2х минут не перешли в режим глубокого сна то переходим в обычный сон
|
||||||
if(ticks==-600){
|
if(g_ticks==-600){
|
||||||
Serial.println("Sleep!");
|
Serial.println("Sleep!");
|
||||||
Serial.print("#0;!*"); //Повторно отсылаю команду на STM8 чтобы он на CHIP_PU подал низский сигнал для отключения питания
|
Serial.print(addCRC("#d;!")); //Повторно отсылаю команду на STM8 чтобы он на CHIP_PU подал низский сигнал для отключения питания
|
||||||
ESP.deepSleep(0);
|
ESP.deepSleep(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//=======================================================================
|
|
||||||
//Запрос на получение данных с микроконтроллера
|
|
||||||
//Для дебага написал тестовую программу клторая эиетирует STM8L по последовательному порту: O:\MyDocuments\projects\Workspace_C++Builder\NeptuneW01
|
|
||||||
bool getMode(){
|
|
||||||
|
|
||||||
Serial.println("#0;"); //Запрашиваю для какого режима работы включили WIFI
|
|
||||||
/*Serial.println("#1;"); //Запрашиваем '1'=холодная
|
|
||||||
Serial.println("#2;"); //Запрашиваем '2'=горячая
|
|
||||||
Serial.println("#3;"); //Запрашиваем '3'=протечки
|
|
||||||
Serial.println("#4;"); //Запрашиваем '4'=вольт на аккумуляторе
|
|
||||||
Serial.println("#5;"); //Запрашиваем '5'=температура на процессоре
|
|
||||||
*/
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
bool configWebServer(){
|
bool configWebServer(){
|
||||||
Serial.println("configWebServer()");
|
Serial.println("configWebServer()");
|
||||||
@ -388,9 +427,9 @@ void setup()
|
|||||||
uuid=readUUID(); //Загружаю уникальный идентификатор клиента
|
uuid=readUUID(); //Загружаю уникальный идентификатор клиента
|
||||||
|
|
||||||
loadConfig(); //Загружаю настройки в локальные переменные
|
loadConfig(); //Загружаю настройки в локальные переменные
|
||||||
/*
|
|
||||||
blinker.attach(1, tick_1s); //Инициализирую таймер для подсчёта секунд работы в режиме настройки
|
blinker.attach(1, tick_1s); //Инициализирую таймер для контроля времени работы ESP8266
|
||||||
*/
|
|
||||||
connectToWIFIPoint(); //Пытаюсь подключиться к настроенной точке доступа
|
connectToWIFIPoint(); //Пытаюсь подключиться к настроенной точке доступа
|
||||||
/*
|
/*
|
||||||
connectToMQTT(); //Пытаюсь опубликовать топик
|
connectToMQTT(); //Пытаюсь опубликовать топик
|
||||||
@ -403,27 +442,6 @@ void setup()
|
|||||||
|
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
//Проверяю правильный ли 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<data.length();i++){
|
|
||||||
crcD+=data[i];
|
|
||||||
}
|
|
||||||
if(crcD==crcS.toInt()) //CRC is OK
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
Serial.println("Incom CRC = "+crcS+" calc CRC = "+String(crcD));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//----------------------------------------------------------------------------------------------------
|
|
||||||
bool first=true;
|
bool first=true;
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
void loop(){
|
void loop(){
|
||||||
@ -465,7 +483,7 @@ void loop(){
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(ticks>0){
|
if(g_ticks>0){
|
||||||
//В режиме конфигурации каждые 500 миллисекунд меняем цвет зелёного светодиода
|
//В режиме конфигурации каждые 500 миллисекунд меняем цвет зелёного светодиода
|
||||||
if(millis()-blinkMSec>500){
|
if(millis()-blinkMSec>500){
|
||||||
blink=!blink;
|
blink=!blink;
|
||||||
@ -525,7 +543,7 @@ void loop(){
|
|||||||
Serial.println("Config mode");
|
Serial.println("Config mode");
|
||||||
if(disconnectFromWIFIPoint()){
|
if(disconnectFromWIFIPoint()){
|
||||||
if(createAP()){
|
if(createAP()){
|
||||||
ticks = CNF_TIME;
|
g_ticks = CNF_TIME;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -572,16 +590,18 @@ void loop(){
|
|||||||
data+="\"cold\":"+String(g_cold)+","; // Горячая
|
data+="\"cold\":"+String(g_cold)+","; // Горячая
|
||||||
data+="\"hot\":"+String(g_hot)+","; // Холодная
|
data+="\"hot\":"+String(g_hot)+","; // Холодная
|
||||||
data+="\"leak\":"+String(g_leak)+","; // Протечки
|
data+="\"leak\":"+String(g_leak)+","; // Протечки
|
||||||
data+="\"volt\":"+String(g_volt); // Вольт на акумуляторе
|
data+="\"volt\":"+String(g_volt/100.0f); // Вольт на акумуляторе
|
||||||
if(g_tmpr>-100)
|
if(g_tmpr>-100){
|
||||||
data+=",\"tmpr\":"+String(g_tmpr); // Температура
|
data+=",\"tmpr\":"+String(g_tmpr); // Температура
|
||||||
|
}
|
||||||
|
data+=",\"rssi\":"+String(WiFi.RSSI()); //Уровень WIFI сигнала
|
||||||
data+="}";
|
data+="}";
|
||||||
mqttClient.publish(mqtt_topic.c_str(), data.c_str(), true); //Отправляю данные в топик (С флагом RETAIN чтобы слушатели которые подключились поздно получили тек. состояние)
|
mqttClient.publish(mqtt_topic.c_str(), data.c_str(), true); //Отправляю данные в топик (С флагом RETAIN чтобы слушатели которые подключились поздно получили тек. состояние)
|
||||||
|
|
||||||
Serial.println(data);
|
Serial.println(data);
|
||||||
|
|
||||||
//Как отправили данные устанавливаю время ожидания входа в сон на 5 секунд чтобы ESP8266 заснул
|
//Как отправили данные устанавливаю время ожидания входа в сон на 5 секунд чтобы ESP8266 заснул
|
||||||
ticks=5;
|
g_ticks=5;
|
||||||
//Очищаю данные
|
//Очищаю данные
|
||||||
g_cold=-1;
|
g_cold=-1;
|
||||||
g_hot=-1;
|
g_hot=-1;
|
||||||
@ -589,5 +609,4 @@ void loop(){
|
|||||||
g_volt=-1;
|
g_volt=-1;
|
||||||
g_tmpr=-100;
|
g_tmpr=-100;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -80,3 +80,34 @@ String CutBeforeFirst(String& str,char ch,bool cutch=true)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
//Проверяю правильный ли 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<data.length();i++){
|
||||||
|
crcD+=data[i];
|
||||||
|
}
|
||||||
|
if(crcD==crcS.toInt()) //CRC is OK
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}else
|
||||||
|
{
|
||||||
|
Serial.println("Incom CRC = "+crcS+" calc CRC = "+String(crcD));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* Добавить CRC к строке данных
|
||||||
|
*/
|
||||||
|
String addCRC(String str){
|
||||||
|
unsigned char crcD=0;
|
||||||
|
for(unsigned int i=0;i<str.length();i++){
|
||||||
|
crcD+=str[i];
|
||||||
|
}
|
||||||
|
return str+String(crcD)+"*";
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user