Сохранение на STM8
This commit is contained in:
@ -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>
|
||||
|
||||
@ -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
|
||||
|
||||
166
src/main.cpp
166
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,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){
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//Блок кода для общения с энергоэфективным микроконтроллером
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user