Сохранение на STM8

This commit is contained in:
2021-11-15 19:06:16 +06:00
parent 795313b680
commit bac2d94939
4 changed files with 127 additions and 58 deletions

View File

@ -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 () {
<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>
<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>
<!--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>

View File

@ -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

View File

@ -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;
}
return true;
if(g_hot_new){
Serial.println(addCRC("#h;"+String(g_hot_new)+";"));
g_hot_new=-1;
}
result=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,7 +211,7 @@ 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);
@ -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,31 +524,51 @@ void loop(){
/*
mqttClient.loop();
dnsServer.processNextRequest(); //DNS
server.handleClient(); //Обрабатываем запрос клиента (без этого не берётся IP адресс)
*/
if(g_ticks>0){
//В режиме конфигурации каждые 500 миллисекунд меняем цвет зелёного светодиода
//мигаем светодиодом в зависемости от режима работы
//Если в режиме конфигурации каждые 500 миллисекунд меняем цвет зелёного светодиода
if(g_ticks_cnf>0){
if(millis()-blinkMSec>500){
if(blinkEnbl){
blink=!blink;
digitalWrite(LED_BUILTIN,blink);
digitalWrite(PIN_LED,blink);
}else{
digitalWrite(PIN_LED, HIGH);
}
blinkMSec=millis();
}
}
//Если в режиме отправки каждые 100 миллисекунд меняем цвет зелёного светодиода
if(g_ticks_snd>0){
if(millis()-blinkMSec>100){
if(blinkEnbl){
blink=!blink;
digitalWrite(PIN_LED,blink);
}else{
//Если в нормальном режиме функционирования
//Проверяю соединение с MQTT и если не соединён то пытаюсь подключиться каждые 10 секунд
if(millis()-time5s>10000){
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);
}
}
//Блок кода для общения с энергоэфективным микроконтроллером
@ -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;