#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <EEPROM.h>
const char *ssid = "TP-LINK_123";
const char *password = "1234567890";
IPAddress ip(192,168,1,175); //Node static IP
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
ESP8266WebServer server ( 80 );
// входящие данные
byte a = 0;
byte b = 0;
byte c = 0;
byte d = 0; // проверочная сумма d = a+b+c <=255
String dopArg = "";
// исходящие данные
byte e = 0;
byte f = 0;
byte g = 0;
byte h = 0;
byte e1 = 0;
byte f1 = 0;
byte g1 = 0;
byte h1 = 0;
String dopOtv = "";
//внутренние переменные для работы
byte val = 0;
long val1 = 0;
void(* resetFunc) (void) = 0; // Функция перезагрузки ( переход на 0 адрес)
void handleAll() {
a = (byte(server.arg(0)[0])-48)*16 + (byte(server.arg(0)[1])-48);
b = (byte(server.arg(1)[0])-48)*16 + (byte(server.arg(1)[1])-48);
c = (byte(server.arg(2)[0])-48)*16 + (byte(server.arg(2)[1])-48);
d = (byte(server.arg(3)[0])-48)*16 + (byte(server.arg(3)[1])-48);
dopArg = server.arg(4);
if( d==byte(a+b+c)){ // проверка пройдена при передачи ничего не потерялось
if(a==0){ // проверка
e=254;f=0;g=0;
}
else if(a==106){ // управление счётчиком воды
f=0;
if(c==1){ // Устанавливаем значение счётчика в литрах из значения dopArg
EEPROM.begin(10);
EEPROM.write(1, (byte(dopArg.charAt(0))-48));
EEPROM.write(2, (byte(dopArg.charAt(1))-48));
EEPROM.write(3, (byte(dopArg.charAt(2))-48));
EEPROM.write(4, (byte(dopArg.charAt(3))-48));
EEPROM.write(5, (byte(dopArg.charAt(4))-48));
EEPROM.write(6, (byte(dopArg.charAt(5))-48));
EEPROM.write(7, (byte(dopArg.charAt(6))-48));
EEPROM.write(8, (byte(dopArg.charAt(7))-48));
EEPROM.write(9, (byte(dopArg.charAt(8))-48));
EEPROM.write(10, (byte(dopArg.charAt(9))-48));
EEPROM.end();
f=1; dopOtv="";
}
else if(c==2){ // Считываем значение счётчика и отправляем в dopOtv
EEPROM.begin(10);
dopOtv = String(char(EEPROM.read(1)+48)) +
String(char(EEPROM.read(2)+48)) +
String(char(EEPROM.read(3)+48)) +
String(char(EEPROM.read(4)+48)) +
String(char(EEPROM.read(5)+48)) +
String(char(EEPROM.read(6)+48)) +
String(char(EEPROM.read(7)+48)) +
String(char(EEPROM.read(8)+48)) +
String(char(EEPROM.read(9)+48)) +
String(char(EEPROM.read(10)+48));
EEPROM.end();
f=2;
}
e=254;g=0;}
else if(a==254){ // Вернуть полученный аргумент первым аргументом
e=254;f=c;g=254;
}
else{ //нет действия для команды =a
e=1;f=0;g=0;
}
}
else{e=0;f=0;g=0;} // если проверка не пройдена возвращаем нули
//Составление ответа
h = byte(e+f+g); // контрольная сумма
e1 = (e%16); e = ((e-e1)/16)+48; e1 = e1+48;
f1 = (f%16); f = ((f-f1)/16)+48; f1 = f1+48;
g1 = (g%16); g = ((g-g1)/16)+48; g1 = g1+48;
h1 = (h%16); h = ((h-h1)/16)+48; h1 = h1+48;
String message = "" + String(char(e)) + String(char(e1))
+ String(char(f)) + String(char(f1)) + String(char(g))
+ String(char(g1)) + String(char(h)) + String(char(h1))
+ dopOtv + "";
server.send ( 200, "text/plain", message );
a = 0; b = 0; c = 0; d = 0; dopArg = ""; // обнуляем переменные
}
void setup ( void ) {
WiFi.begin ( ssid, password );
WiFi.config(ip, gateway, subnet);
// Wait for connection
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
}
server.onNotFound(handleAll);
server.begin();
pinMode(4, INPUT);
}
void loop ( void ) {
server.handleClient();
if(digitalRead(4) == 0 && val == 1){ //Добавляем 10 литров
val = 0;
EEPROM.begin(10);
val1 = (long(EEPROM.read(1)) * 1000000000 +
long(EEPROM.read(2)) * 100000000 +
long(EEPROM.read(3)) * 10000000 +
long(EEPROM.read(4)) * 1000000 +
long(EEPROM.read(5)) * 100000 +
long(EEPROM.read(6)) * 10000 +
long(EEPROM.read(7)) * 1000 +
long(EEPROM.read(8)) * 100 +
long(EEPROM.read(9)) * 10 +
long(EEPROM.read(10)));
val1 = val1 + 10;
EEPROM.write(1, int(val1/1000000000));
val1 = val1%1000000000;
EEPROM.write(2, int(val1/100000000));
val1 = val1%100000000;
EEPROM.write(3, int(val1/10000000));
val1 = val1%10000000;
EEPROM.write(4, int(val1/1000000));
val1 = val1%1000000;
EEPROM.write(5, int(val1/100000));
val1 = val1%100000;
EEPROM.write(6, int(val1/10000));
val1 = val1%10000;
EEPROM.write(7, int(val1/1000));
val1 = val1%1000;
EEPROM.write(8, int(val1/100));
val1 = val1%100;
EEPROM.write(9, int(val1/10));
EEPROM.end();
delay(250);
}
else if(digitalRead(4) == 1 && val == 0){ //снова начинаем ждать когда пройдёт 10 литров
val = 1;
delay(250);
}
}
// ячейки памяти 1-10 используются для счётчика воды