diff --git a/WebSocket3Aqva/BTimer.ino b/WebSocket3Aqva/BTimer.ino new file mode 100644 index 0000000..51c7a36 --- /dev/null +++ b/WebSocket3Aqva/BTimer.ino @@ -0,0 +1,208 @@ +void btime() +{ + // bool lastate; + current_time = hour1 * 60 + min1; + Serial.println(current_time); + // state1 = main_log(BTimer1, state1); //______________________Обработка каналов управления суточных таймеров реального времени (каналы 1 - 3) + Serial.print("BTimer1 [0]:"); + Serial.println(BTimer1 [0]); + Serial.print("BTimer2 [0]:"); + Serial.println(BTimer2 [0]); + Serial.print("BTimer3 [0]:"); + Serial.println(BTimer3 [0]); + //*******************************3************************************************************ + switch (BTimer3[0]) { + case 0: + state3=0; + if(gpioTimer3[0]==1) + {digitalWrite(4, 0); + gpio[0]=0; + } + if(gpioTimer3[1]==1) + {digitalWrite(26, 0); + gpio[1]=0; + } + if(gpioTimer3[2]==1) + {digitalWrite(27, 0); + gpio[2]=0; + } + break; + case 1: + state3=1; + if(gpioTimer3[0]==1) + {digitalWrite(4, 1); + gpio[0]=1; + } + if(gpioTimer3[1]==1) + {digitalWrite(26, 1); + gpio[1]=1; + } + if(gpioTimer3[2]==1) + {digitalWrite(27, 1); + gpio[2]=1; + } + break; + case 2: + state3 = main_log(BTimer3, state3); + if(gpioTimer3[0]==1) + {digitalWrite(4, state3); + gpio[0]=state3; + } + if(gpioTimer3[1]==1) + {digitalWrite(26, state3); + gpio[1]=state3; + } + if(gpioTimer3[2]==1) + {digitalWrite(27, state3); + gpio[2]=state3; + } + break; + case 3: + break; + } + + //****************************2*************************************************************** + + switch (BTimer2[0]) { + case 0: + state2=0; + if(gpioTimer2[0]==1) + {digitalWrite(4, 0); + gpio[0]=0; + } + if(gpioTimer2[1]==1) + {digitalWrite(26, 0); + gpio[1]=0; + } + if(gpioTimer2[2]==1) + {digitalWrite(27, 0); + gpio[2]=0; + } + break; + case 1: + state2=1; + if(gpioTimer2[0]==1) + {digitalWrite(4, 1); + gpio[0]=1; + } + if(gpioTimer2[1]==1) + {digitalWrite(26, 1); + gpio[1]=1; + } + if(gpioTimer2[2]==1) + {digitalWrite(27, 1); + gpio[2]=1; + } + break; + case 2: + state2 = main_log(BTimer2, state2); + if(gpioTimer2[0]==1) + {digitalWrite(4, state2); + gpio[0]=state2; + } + if(gpioTimer2[1]==1) + {digitalWrite(26, state2); + gpio[1]=state2; + } + if(gpioTimer2[2]==1) + {digitalWrite(27, state2); + gpio[2]=state2; + } + break; + case 3: + break; + } + //******************************1-приоритет**************************************************************** + + switch (BTimer1 [0]) { + case 0: + state1=0; + if(gpioTimer1 [0]==1) + {digitalWrite(4, 0); + gpio[0]=0; + } + if(gpioTimer1 [1]==1) + {digitalWrite(26, 0); + gpio[1]=0; + } + if(gpioTimer1 [2]==1) + {digitalWrite(27, 0); + gpio[2]=0; + } + break; + case 1: + state1=1; + if(gpioTimer1 [0]==1) + {digitalWrite(4, 1); + gpio[0]=1; + } + if(gpioTimer1 [1]==1) + {digitalWrite(26, 1); + gpio[1]=1; + } + if(gpioTimer1 [2]==1) + {digitalWrite(27, 1); + gpio[2]=1; + } + break; + case 2: + // lastate=state1; + state1 = main_log(BTimer1, state1); + if(gpioTimer1[0]==1) + {digitalWrite(4, state1); + gpio[0]=state1; + } + if(gpioTimer1[1]==1) + {digitalWrite(26, state1); + gpio[1]=state1; + } + if(gpioTimer1[2]==1) + {digitalWrite(27, state1); + gpio[2]=state1; + } + + break; + case 3: + break; + } + + Serial.print("Timer1:"); + Serial.println(state1); + Serial.print("Timer2:"); + Serial.println(state2); + Serial.print("Timer3:"); + Serial.println(state3); + Serial.print("Gpio4:"); + Serial.println(digitalRead(4)); + Serial.print("Gpio26:"); + Serial.println(digitalRead(26)); + Serial.print("Gpio27:"); + Serial.println(digitalRead(27)); + writepin(); + JSstringOut();//преобразуем состояние выходов gpio[3] в JSON + webSocket.textAll(jsonStringout);// выводим всем клиентам w/s + +} + +bool main_log (uint16_t* timeMassive, bool cur_state) { // Основная фунция расчета состояния каналов суточных таймеров реального времени + uint16_t j = 1440; + uint8_t i = 0; + uint8_t n = 0; + for ( i = 1; i < 11; i++) { //___________________________Ищем в массиве таймеров элемент соответсвующий текущему времени c значением не равным 1440 (означает неактивно, отображается "--:--") + if ((timeMassive [i] == current_time) && (timeMassive [i] != 1440)) { + j = timeMassive [i]; + } + } + if (j == 1440)return (cur_state); //_______________________Если не нашли оставляем состояние канала без изменений + i = 0; + for ( i = 1; i < 11; i++) { + if ((j == timeMassive [i]) && (timeMassive [i] != 1440)) { + n = i; + } + } + i = 0; + if ((n % 2) == 0) { //____________________________________Четные таймеры выключают (LOW) + return (LOW); + } + else return (HIGH); //____________________________________Нечетные таймеры включают (HIGH) +} diff --git a/WebSocket3Aqva/JSON.ino b/WebSocket3Aqva/JSON.ino new file mode 100644 index 0000000..53bd490 --- /dev/null +++ b/WebSocket3Aqva/JSON.ino @@ -0,0 +1,128 @@ +void JSstringK() +{ delay(0); +String id2="2"; + board2["id"] =id2; + board2["tkom1"] = tkom1; + board2["hkom1"] = hkom1; + board2["batkom1"] = batkom1; + board2["timekom1"] = timekom1; + board2["tkom2"] = tkom2; + board2["hkom2"] = hkom2; + board2["batkom2"] = batkom2; + board2["timekom2"] = timekom2; + board2["tkor"] = tkor; + board2["hkor"] = hkor; + board2["batkor"] = batkor; + board2["timekor"] = timekor; + board2["tbal"] = tbal; + board2["hbal"] = hbal; + board2["batbal"] = batbal; + board2["timebal"] = timebal; + board2["tul1"] = tul1; + board2["hul1"] = hul1; + board2["osv1"] = osv1; + board2["timeul1"] = timeul1; +jsonString2 = JSON.stringify(board2); + Serial.println (jsonString2); +} + + +void JSstringU() +{delay(0); +String id0="0"; + board["id"] =id0; + +if(flread==0) +{ + board["temperature"] =ts; +// t1 = incomingReadings.temp; + board["humidity"] =hs; //значение считаное с SD + board["tim2"] = tim2; + +} + else + {//float t1=12.456787; + board["temperature"] =t1; + // board["temperature"] =incomingReadings.temp; +//float h1=77.456787; + board["humidity"] =h1;//принятое значение +// board["humidity"] =incomingReadings.hum; + if(min1<10) + { + board["tim2"] = String(hour1)+":0"+String(min1); + } + else + { + board["tim2"] =String(hour1)+":"+String(min1); + } + } + //******************** + board["batz"] = batz; + board["tim3"] = tim3; + //***************** + board["dataserv"] = dataserv; + board["timeserv"] = timeserv; + Serial.println("timeJS"); + Serial.println(EpochTime); + + board["munthserv"] = munthserv; + board["weekserv"] = weekserv; + board["timev"] = timev; + board["EpochTime"] = EpochTime; + + // jsonString = JSON.stringify(board); + jsonString = JSON.stringify(board);//{"id":"2","temperature":9.6733450317382812,"humidity":50.41815185546875,"tim2":"12:02","dataserv":"12","timeserv":"15:30","munthserv":"январь",weekserv:"среда"} + // events.send(jsonString.c_str(), "new_readings", millis());//обновление веба текущая температура + Serial.println (jsonString); +} + +void JSstringAkva()// 0-выкл 1-вкл gpio[3]={0,0,0} +{if(akva==1) +{ String id="akva"; + board5["id"] =id; + board5["tempakv1"] =takva1; + board5["light1"] =String(lightakv); + board5["timakv1"] =timeakva; + if(fanak1==0) + {fan1="OFF"; + } + else + { + fan1="ON"; + } + board5["fan1"] =fan1; + board5["tempakv2"] =takva2; + board5["light2"] =String(lightakv); + board5["timakv2"] =timeakva; + if(fanak2==0) + {fan2="OFF"; + } + else + { + fan2="ON"; + } + board5["fan2"] =fan2; + board5["tempakv3"] =takva3; + board5["light3"] =String(lightakv); + board5["timakv3"] =timeakva; + if(fanak3==0) + {fan3="OFF"; + } + else + { + fan3="ON"; + } + board5["fan3"] =fan3; + + jsonStringakva = JSON.stringify(board5); +} + //jsonStringakva="{\"id\":\"akva\",\"tempakv1\":\"20,1\",\"light1\":\"80 %\",\"timakv1\":\"12.31\",\"fan1\":\"OFF\",\"tempakv2\":\"20,2\",\"light2\":\"82 %\",\"timakv2\":\"12.32\",\"fan2\":\"OFF\",\"tempakv3\":\"20,3\",\"light3\":\"83 %\",\"timakv3\":\"12.33\",\"fan3\":\"OFF\"}"; + Serial.println(jsonStringakva); +} +void JSstringOut()// 0-выкл 1-вкл gpio[3]={0,0,0} +{String id="out"; + board4["id"] =id; + board4["out1"] = String(gpio[0])+String(gpio[1])+String(gpio[2])+String(gpio[3]); + jsonStringout = JSON.stringify(board4);//jsonStringout= "{"id":"out","out1":"1011"}"; + Serial.println(jsonStringout); +} diff --git a/WebSocket3Aqva/SD.ino b/WebSocket3Aqva/SD.ino new file mode 100644 index 0000000..8a5bc0b --- /dev/null +++ b/WebSocket3Aqva/SD.ino @@ -0,0 +1,183 @@ +void sdlist() +{ + //listDir(SD, "/", 0); + //listDir(SD, "/", 0); + //delay(100); +// createDir(SD, "/mydir");//создать директорию (папку) +// delay(100); +// listDir(SD, "/", 0); +// delay(100); +// removeDir(SD, "/mydir"); + //delay(100); +// listDir(SD, "/", 2); +// delay(100); +// writeFile(SD, "/hello.txt", "Hello "); +// delay(100); +// appendFile(SD, "/hello.txt", "World!\n"); +// delay(100); +// readFile(SD, "/hello.txt"); + // deleteFile(SD, "/foo.txt"); +// renameFile(SD, "/hello.txt", "/foo.txt"); + // readFile(SD, "/foo.txt"); +// testFileIO(SD, "/test.txt"); + // Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024)); + // Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024)); +} + + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ + Serial.printf("Listing directory: %s\n", dirname); + + File root = fs.open(dirname); + if(!root){ + Serial.println("Failed to open directory"); + return; + } + if(!root.isDirectory()){ + Serial.println("Not a directory"); + return; + } + + File file = root.openNextFile(); + while(file){ + if(file.isDirectory()){ + Serial.print(" DIR : "); + Serial.println(file.name()); + if(levels){ + listDir(fs, file.name(), levels -1); + } + } else { + Serial.print(" FILE: "); + Serial.print(file.name()); + Serial.print(" SIZE: "); + Serial.println(file.size()); + } + file = root.openNextFile(); + } +} + +void createDir(fs::FS &fs, const char * path){ + // Serial.printf("Creating Dir: %s\n", path); + if(fs.mkdir(path)){ + Serial.println("Dir created"); + } else { + Serial.println("no dir"); + } +} + +void removeDir(fs::FS &fs, const char * path){ + Serial.printf("Removing Dir: %s\n", path); + if(fs.rmdir(path)){ + Serial.println("Dir removed"); + } else { + Serial.println("rmdir failed"); + } +} + +void readFile(fs::FS &fs, const char * path){ + Serial.printf("Reading file: %s\n", path); + + File file = fs.open(path); + if(!file){ + Serial.println("Failed to open file for reading"); + return; + } + + Serial.print("Read from file: "); + while(file.available()){ + Serial.write(file.read()); + } + file.close(); +} + +void writeFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Writing file: %s\n", path); + + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + if(file.print(message)){ + Serial.println("File written"); + } else { + Serial.println("Write failed"); + } + file.close(); +} + +void appendFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Appending to file: %s\n", path); + + File file = fs.open(path, FILE_APPEND); + if(!file){ + Serial.println("Failed to open file for appending"); + return; + } + if(file.print(message)){ + Serial.println("Message appended"); + } else { + Serial.println("Append failed"); + } + file.close(); +} + +void renameFile(fs::FS &fs, const char * path1, const char * path2){ + Serial.printf("Renaming file %s to %s\n", path1, path2); + if (fs.rename(path1, path2)) { + Serial.println("File renamed"); + } else { + Serial.println("Rename failed"); + } +} + +void deleteFile(fs::FS &fs, const char * path){ + Serial.printf("Deleting file: %s\n", path); + if(fs.remove(path)){ + Serial.println("File deleted"); + } else { + Serial.println("Delete failed"); + } +} + +void testFileIO(fs::FS &fs, const char * path){ + File file = fs.open(path); + static uint8_t buf[512]; + size_t len = 0; + uint32_t start = millis(); + uint32_t end = start; + if(file){ + len = file.size(); + size_t flen = len; + start = millis(); + while(len){ + size_t toRead = len; + if(toRead > 512){ + toRead = 512; + } + file.read(buf, toRead); + len -= toRead; + } + end = millis() - start; + Serial.printf("%u bytes read for %u ms\n", flen, end); + file.close(); + } else { + Serial.println("Failed to open file for reading"); + } + + + file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + + size_t i; + start = millis(); + for(i=0; i<2048; i++){ + file.write(buf, 512); + } + end = millis() - start; + Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end); + file.close(); +} diff --git a/WebSocket3Aqva/SDUl.ino b/WebSocket3Aqva/SDUl.ino new file mode 100644 index 0000000..3e72280 --- /dev/null +++ b/WebSocket3Aqva/SDUl.ino @@ -0,0 +1,94 @@ +void saveul() +{ +nt=0;//сброс номера температ датчика + + +int q=0; +if((hour1<1)&&(min1<20))timev=0;//до 00:20 сброс timev-врмя записи на флеш улица восто приходят каждые 3 мин а зап каждые 20 мин + + if(timev+20 +#define WDT_TIMEOUT 30 +#include +#include +#include "ESPAsyncWebSrv.h" +#include +#include "SPI.h" +#include +#include +#include "NTPClient.h" +#include "WiFiUdp.h" +#include + +#include "FS.h" +#include "SD.h" +#include +UnixTime stamp(0); // указать GMT (3 для Москвы) +// Define deep sleep options +String dataMessage; +// Define NTP Client to get time +WiFiUDP ntpUDP; +NTPClient timeClient(ntpUDP); +#include "RTClib.h" +RTC_DS3231 rtc; +#include "nRF24L01.h" +#include "RF24.h" +#include + +RCSwitch mySwitch = RCSwitch(); + +char msg[16]; +//RF24 radio(12, 14, 26, 25, 27); +//RF24 radio(27, 26, 32, 33, 25);//server (ce,csn,sck,miso,mosi)esp32 +//gpio19 +RF24 radio(17, 16, 32, 33, 25);//server (ce,csn,sck,miso,mosi)esp32 + +const uint64_t pip = 0x02E423E4E2LL; +SPIClass sdSPI(HSPI); +File myFile; + +const char* ssid = "VOVA-47"; +const char* password = "vovak26102003"; + +const int LED_PIN = 2; + +AsyncWebServer server(80); +AsyncWebSocket webSocket("/ws"); + +int ledState = LOW; +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// Задайте свой статический IP-адрес +IPAddress local_IP(192, 168, 1, 115); +// Укажите IP-адрес шлюза +IPAddress gateway(192, 168, 1, 1); + +IPAddress subnet(255, 255, 0, 0); +IPAddress primaryDNS(8, 8, 8, 8); // опционально +IPAddress secondaryDNS(8, 8, 4, 4); // опционально + + +//**************************************************************************** +// ntp +int countTimeWas; +int countVal; +int countVal1; +String formattedDate; +String formattedTime; +String dayStamp; +String timeStamp; +String timerweek="{\"id\":\"week\",\"timer1_week\":\"0111100\",\"timer2_week\":\"1000011\",\"timer3_week\":\"0101010\"}"; +bool tweek; // флаг обновления строки timerweek для записи на SD +String timerdata="{\"timer1\":[\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\"],\"timer2\":[\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\"],\"timer3\":[\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\",\"00:00\"]}";//данные с таймеров +bool tdat=0;// флаг обновления строки timerdat для записи на SD +String timerout="{\"id\":\"tout\",\"t1\":\"011\",\"t2\":\"100\",\"t3\":\"010\"}";//подключние таймеров т1 т2 и т3 к выходам gpio4,gpio26,gpio27 +bool tout=0;// флаг обновления строки timerout для записи на SD +bool ntp_on=0; +//**************************JSON*************************************************** +JSONVar board; +JSONVar board1; +JSONVar board2; +JSONVar board3; +JSONVar board4; +JSONVar board5; + +//String jsonString="{\"id\":\"0\",\"temperature\":\"9.67\",\"humidity\":50.41815185546875,\"tim2\":\"10:10\",\"tim3\":\"11:11\",\"dataserv\":\"12\",\"timeserv\":\"15:30\",\"munthserv\":\"январь\",\"weekserv\":\"среда\"}"; +String jsonString="{\"id\":\"0\",\"temperature\":9.6757548,\"humidity\":50.41815185546875,\"tim2\":\"10:10\",\"tim3\":\"11:11\",\"dataserv\":\"12\",\"munthserv\":\"январь\",\"weekserv\":\"среда\"}"; +String jsonString1; +String jsonString2="{\"id\":\"2\",\"tkom1\":\"20.0\",\"hkom1\":\"30.0\",\"batkom1\":\"4.10\",\"timekom1\":\"07:08\",\"tkom2\":\"20.5\",\"hkom2\":\"80.5\",\"batkom2\":\"3.95\",\"timekom2\":\"15:15\",\"tkor\":\"23.5\",\"hkor\":\"90.5\",\"batkor\":\"3.75\",\"timekor\":\"13:13\",\"tbal\":\"13.5\",\"hbal\":\"80.5\",\"batbal\":\"3.45\",\"timebal\":\"11:11\",\"tul1\":\"7.3\",\"hul1\":\"75.5\",\"osv1\":\"50\",\"timeul1\":\"12:12\"}"; +String jsonStringout= "{\"id\":\"out\",\"out1\":\"1011\"}";// 0-выкл 1-вкл вых1 вых2 вых3 таймер(работаем по кнопкам или по таймеру +String jsonString77="{\"Time\":\"0:17\",\"temperatura\":\"19.73 C\",\"humidity\":\"73.59 %\"}\n{\"Time\":\"0:37\",\"temperatura\":\"19.65 C\",\"humidity\":\"74.34 %\"}\n{\"Time\":\"0:57\",\"temperatura\":\"19.57 C\",\"humidity\":\"74.99 %\"}"; +String jsonStringakva="{\"id\":\"akva\",\"tempakv1\":\"20,1\",\"light1\":\"80 %\",\"timakv1\":\"12.31\",\"fan1\":\"OFF\",\"tempakv2\":\"20,2\",\"light2\":\"82 %\",\"timakv2\":\"12.32\",\"fan2\":\"OFF\",\"tempakv3\":\"20,3\",\"light3\":\"83 %\",\"timakv3\":\"12.33\",\"fan3\":\"OFF\"}"; +//String jsonString77="{\"id\":\"77\",\"Time\":\"21:23\",\"temperatura\":\"8.88 C\",\"humidity\":\"90.97 %\"}\n"; +//String jsonString78="{\"id\":\"77\",\"data\":\'\"Time\":\"21:23\",\"temperatura\":\"8.88 C\",\"humidity\":\"90.97 %\"\'}"; +//{"timer1":["00:00","00:00","00:00","00:00","00:00","00:00","00:00","00:00","00:00","00:00"],"timer2":["00:00","00:00","00:00","00:00","00:00","00:00","00:00","00:00","00:00","00:00"],"timer3":["00:00","00:00","00:00","00:00","00:00","00:00","00:00","00:00","00:00","00:00"]} +//String jsonString7="{\"id\":\"week\",\"timer1_week\":\"0111100\",\"timer2_week\":\"1000011\",\"timer3_week\":\"0101010\"}"; +//**************************************************************************** +int idcon=0;// ID соединения +//************************************************************************************************* +char* strd[] = {"01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"}; + char* strm[] = {"январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"}; + char* strweek[] = {"воскресенье","понедельник","вторник","среда","четверг","пятница","суббота","воскресенье"}; + int nt=0;//номер термометра + int nti=0;//номер термометра для сайта + int temperature1=10; + String ts; + String hs; +String t1; + String h1; + String t10;//время работы сервера + String tim3;// время от нтп сервера при приходе данных с NOW + String tim2;//время получ от устройства NOW + String batz;//заря бат термометра ул запад + String munthserv;//месяц + String weekserv;//день недели + String timer1;//таймер1 + String timer2;//таймер2 + int timerbut1=0; + int timerbut2=0; +bool tbut1=0;//флаг таймера1 +bool tbut2=0;//флаг таймера2 +bool res = 0;//флаг разрешения сброса +int timebut=0;// подсчет времени по таймерам + +String tkom1;//температура +String hkom1;//влажность +String batkom1; +String timekom1;//время прихода данных комната1 + +String tkom2; +String hkom2; +String batkom2; +String timekom2; + +String tkor; +String hkor; +String batkor; +String timekor; + +String tbal; +String hbal; +String batbal; +String timebal; + +String timeul1; +String tul1; +String hul1; +String osv1; + +String takva1; +String takva2; +String takva3; +String timeakva; +String light; +String fan1; +String fan2; +String fan3; +bool fanak1; +bool fanak2; +bool fanak3; +int lightakv=80; +bool akva=0;//флаг прихода дааных с акваконрол + +int ct1=0;//счетчик пропуска данные каждые 3 минуты записываем каждые 20 те 7 пропусков +int wreset=0;//счетчик времени сброса esp(1 раз в 8 часов) + String out1;//выход1 gpio4 + String out2;//выход2 gpio26 + String out3;//выход3 gpio27 + int tweekday=1;//день недели для таймеров + int time17=0; +int hour1=10; +int min1=7; +int sek=0; +int year1; +int month1; +int data1; +int hk=0;//часы для исключения повтора записи данных +int mk=0;//минуты +int hb=0;//часы для исключения повтора записи данных +int mb=0;//минуты +int hkr=0;//часы для исключения повтора записи данных +int mkr=0;//минуты +int timev=0;//для пропуска 20 минут +//String timev1;//для записи на флэш при сбросе +bool outdata=0;//флаг обновления состояния выходов +boolean fdata=0;//флаг обновления данных темп и влажн +int fobnov=1;//флаг обновления данных темп и влажн +String timeserv;//время сервера +String dataserv;//дата +int v=0; +int v1=0; +long EpochTime=0; + int ind=0; + + String strdat;//накопленые в памяти данные по темп и влажность передаваемые клиенту + String tempdat;// +int ftdata=0;//флаг запроса данных темп и влажн +int fping=0;// флаг для задержки отр данных на страницу inform +int wright=0; +bool flread=0; + char* strden[] = {"/01","/02","/03","/04","/05","/06","/07","/08","/09","/10","/11","/12","/13","/14","/15","/16","/17","/18","/19","/20","/21","/22","/23","/24","/25","/26","/27","/28","/29","/30","/31"}; + char* strmen[] = {"/JAN","/FEBR","/MARCH","/APRIL","/MAY","/JUNE","/JULY","/AUG","/SEPT","/OCT","/NOV","/DEC"}; + char* stryen[] = {"/2014","/2015","/2016","/2017","/D-2018","/D-2019","/D-2020","/D-2021","/D-2022","/D-2023","/D-2024","/D-2025","/D-2026","/D-2027","/D-2028","/D-2029","/D-2030","/D-2031","/D-2032","D-2033","/D-2034","/D-2035"}; + char* strdaten[] = {"/T1.txt","/T2.txt","/T3.txt","/T4.txt","/T5.txt","/T6.txt","/T7.txt","/T8.txt","/T9.txt","/T10.txt"}; +//************************************************************ +//************************************************************ +hw_timer_t * timer = NULL; +volatile SemaphoreHandle_t timerSemaphore; +portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; +volatile uint32_t isrCounter = 0; +volatile uint32_t lastIsrAt = 0; + char *time_buf; +//***************************************************************************** + +// Structure example to receive data +// Must match the sender structure +typedef struct struct_message { + int id; + float temp; + float hum; + unsigned int readingId; + unsigned int bat; +} struct_message; +int volt11; +struct_message incomingReadings; +//****************************************Timer Budilnik***************************************************************************************************************************************************************************************** +int minuta;//счетчик минут для проверки времени сработки будильников +uint16_t BTimer1 [11] = {2, 390, 450, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440}; // массивы всех таймеров для суточных каналов (1 - 4) 0-й элемент отвечает за состояние канала (1 - вкл/ 0 - выкл/ 2 - авто)) +uint16_t BTimer2 [11] = {2, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440}; // остальное время в минутах (нечетные элементы - таймеры включения, четные - выключения) +uint16_t BTimer3 [11] = {2, 380, 450, 1080, 1410, 1440, 1440, 1440, 1440, 1440, 1440}; // время 1440 отображается на экране как "--:--", это неактивное значение, для основной логики пустая ячейка означает что таймер не задан +uint16_t weekTimer1 [7]={0,0,0,0,0,0,0};//недельные установки t1 +uint16_t weekTimer2 [7]={0,0,0,0,0,0,0};//недельные установки t2 +uint16_t weekTimer3 [7]={0,0,0,0,0,0,0};//недельные установки t3 +uint16_t gpioTimer1 [3]={1,0,0};//выходы подкл к таймеру {gpio 4, gpio 26, gpio 27} {1,0,0} подкл 4 +uint16_t gpioTimer2 [3]={1,0,0};//выходы подкл к таймеру {gpio 4, gpio 26, gpio 27} {0,0,0} откл все +uint16_t gpioTimer3 [3]={0,0,0};//выходы подкл к таймеру {gpio 4, gpio 26, gpio 27}{1,1,1} подкл все +uint16_t gpio[4]={0,0,0,1};//выходы состояние {gpio 4, gpio 26, gpio 27, timer}{1,1,1,1} timer определяет работу выходов по таймеру=1 или кнопки =0 +bool state1 = 0; //_________________Переменные состояния каналов(вкл/выкл) +bool state2 = 0; +bool state3 = 0; +uint16_t current_time = 0 ; //_______Текущее время в минутах (для основных расчетов) +//********************************************************************************************* +const char* PARAM_INPUT_1 = "output";//Gpio +const char* PARAM_INPUT_2 = "state"; //состояние выхода +const char* PARAM_INPUT = "value"; + +const int output = 4; +const int output1 = 26; +const int output2 = 27; +String ledout; +void IRAM_ATTR onTimer(); +//*********************************************************** +void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len) { + // Copies the sender mac address to a string + char macStr[18]; + Serial.print("Packet received from: "); + snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x", + mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + Serial.println(macStr); + memcpy(&incomingReadings, incomingData, sizeof(incomingReadings)); + + Serial.printf("Board ID %u: %u bytes\n", incomingReadings.id, len); + Serial.printf("t value: %4.2f \n", incomingReadings.temp); + t1 = incomingReadings.temp; + Serial.printf("h value: %4.2f \n", incomingReadings.hum); + h1=incomingReadings.hum; + Serial.printf("readingID value: %d \n", incomingReadings.readingId); + int tim11 =incomingReadings.readingId; + hour1=tim11/100; + min1=tim11%100; + volt11 =incomingReadings.bat;//заряд батареи + Serial.printf("bat value: %d \n", incomingReadings.bat); + + +batz=volt11/100; +batz+=","; +batz+=volt11%100; + + Serial.println(batz); + //tim3=timeserv; + //получаем из int incomingReadings= 1530 строку 15:30 + + tim3=incomingReadings.readingId/100; + tim3+=":"; + if(incomingReadings.readingId%100<10)tim3+="0"; + + tim3+=incomingReadings.readingId%100; +//JSONстрока формирование + ntphome(); + flread=1; +JSstringU(); + savedata(); + flread=1; +}//OnDataRecv + + //**************************************************************************** +//**************************************************************************************************************************************************************************************************************************************************** +//подпрогр Действия вебсекета +void handleWebSocketEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) { + switch (type) { + case WS_EVT_DISCONNECT://[3] Disconnected! откл соединения + Serial.printf("[%u] Disconnected!\n", client->id()); + idcon--; + break; + + case WS_EVT_CONNECT://[4] Connected from 192.168.1.108 подключение + { + IPAddress ip = client->remoteIP();//адрес подкл объкта + Serial.printf("[%u] Connected from %d.%d.%d.%d\n", client->id(), ip[0], ip[1], ip[2], ip[3]); + idcon++; + client->text(jsonString);//отправка дата месяц неделя + client->text(jsonString2);//отправка темп и влажности в комнатах + String countUpdate2 = "{\"label3\":\"count2\",\"value\":\"" + String(timeserv) + "\"}";//отправка строковой переменной + String countUpdate = "{\"label3\":\"count\",\"value\":\"" + String(t10) + "\"}";//отправка строковой переменной время раб сервера + client->text(countUpdate2);//отправка NTP времени timeserv + client->text(countUpdate);//отправка время раб сервера t10 + if (ftdata==1)//пришел запрос табл данных /inform1 запад + {ftdata=0; + nti=1; + readdata(); + client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу на стр inform + } + if (ftdata==2)//пришел запрос табл данных /inform К1 + {ftdata=0; + nti=4; + readdata(); + client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу на стр inform + } + if (ftdata==3)//пришел запрос табл данных /inform k2 + {ftdata=0; + nti=3; + readdata(); + client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу на стр inform + } + if (ftdata==5)//пришел запрос табл данных /inform балкон + {ftdata=0; + nti=2; + readdata(); + client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу на стр inform + } + if (ftdata==4)//пришел запрос табл данных /inform корридор + {ftdata=0; + nti=5; + readdata(); + client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу на стр inform + } + if (ftdata==10)//пришел запрос табл данных /inform восток + {ftdata=0; + nti=0; + readdata(); + client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу на стр inform + } + if (ftdata==6)//пришел запрос табл данных кухня + {ftdata=0; + // nti=6; + // readdata(); + // client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу на стр + } + if (ftdata==12)//пришел запрос /setting передача значений таймера + {ftdata=0; + client->text(timerweek);//таймер дни недели + Serial.println(timerweek); + + client->text(timerdata);//timerout + Serial.println(timerdata); + + client->text(timerout);//timerout + Serial.println(timerout); + } + + if (ftdata==8)//пришел запрос управления upravlenie.html + {ftdata=0; + JSstringOut(); + client->text(jsonStringout);// {"id":"out","out1":"1011"} отправляем состояние выходов + //Serial.println(jsonStringout); + } + if (ftdata==7)//пришел запрос управления akva.html + {ftdata=0; + JSstringAkva(); + client->text(jsonStringakva);//jsonStringakva="{\"id\":\"akva\",\"tempakv1\":\"20,1\",\"light1\":\"80 %\",\"timakv1\":\"12.31\",\"fan1\":\"OFF\",\"tempakv2\":\"20,2\",\"light2\":\"82 %\",\"timakv2\":\"12.32\",\"fan2\":\"OFF\",\"tempakv3\":\"20,3\",\"light3\":\"83 %\",\"timakv3\":\"12.33\",\"fan3\":\"OFF\"}"; + Serial.println(jsonStringakva); + } + + if (ftdata==15)//пришел запрос управления akva1.html + {ftdata=0; + JSstringAkva(); + client->text(jsonStringakva);//jsonStringakva="{\"id\":\"akva\",\"tempakv1\":\"20,1\",\"light1\":\"80 %\",\"timakv1\":\"12.31\",\"fan1\":\"OFF\",\"tempakv2\":\"20,2\",\"light2\":\"82 %\",\"timakv2\":\"12.32\",\"fan2\":\"OFF\",\"tempakv3\":\"20,3\",\"light3\":\"83 %\",\"timakv3\":\"12.33\",\"fan3\":\"OFF\"}"; + // Serial.println(jsonStringakva); + readakva(); + client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу + } + if (ftdata==16)//пришел запрос управления akva1.html + {ftdata=0; + JSstringAkva(); + client->text(jsonStringakva);//jsonStringakva="{\"id\":\"akva\",\"tempakv1\":\"20,1\",\"light1\":\"80 %\",\"timakv1\":\"12.31\",\"fan1\":\"OFF\",\"tempakv2\":\"20,2\",\"light2\":\"82 %\",\"timakv2\":\"12.32\",\"fan2\":\"OFF\",\"tempakv3\":\"20,3\",\"light3\":\"83 %\",\"timakv3\":\"12.33\",\"fan3\":\"OFF\"}"; + // Serial.println(jsonStringakva); + readakva(); + client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу + } + if (ftdata==17)//пришел запрос управления akva1.html + {ftdata=0; + JSstringAkva(); + client->text(jsonStringakva);//jsonStringakva="{\"id\":\"akva\",\"tempakv1\":\"20,1\",\"light1\":\"80 %\",\"timakv1\":\"12.31\",\"fan1\":\"OFF\",\"tempakv2\":\"20,2\",\"light2\":\"82 %\",\"timakv2\":\"12.32\",\"fan2\":\"OFF\",\"tempakv3\":\"20,3\",\"light3\":\"83 %\",\"timakv3\":\"12.33\",\"fan3\":\"OFF\"}"; + //Serial.println(jsonStringakva); + readakva(); + client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу + } + if (ftdata==18)//пришел запрос управления akva1.html + {ftdata=0; + // JSstringAkva(); + // client->text(jsonStringakva);//jsonStringakva="{\"id\":\"akva\",\"tempakv1\":\"20,1\",\"light1\":\"80 %\",\"timakv1\":\"12.31\",\"fan1\":\"OFF\",\"tempakv2\":\"20,2\",\"light2\":\"82 %\",\"timakv2\":\"12.32\",\"fan2\":\"OFF\",\"tempakv3\":\"20,3\",\"light3\":\"83 %\",\"timakv3\":\"12.33\",\"fan3\":\"OFF\"}"; + //Serial.println(jsonStringakva); + readakva(); + client->text(strdat.c_str());//отправка суточных данных данных из карты памяти в таблицу + } + + } + break; + + case WS_EVT_DATA: + { + AwsFrameInfo *info = (AwsFrameInfo*)arg; + if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) { + data[len] = '\0'; + String payload = String((char*)data); + + Serial.printf("[%u] Received: %s\n", client->id(), payload.c_str()); + + if (payload == "toggle") {//если пришло toggle + + }else{ //{"id":"week","timer1_week":"0111100","timer2_week":"1000011","timer3_week":"0101010"} + String js = payload.substring(1,11);//"id":"week" вырезаем нужные данные {"ido":"4","out":1} + // Serial.println(js); + if((js[1] = 'i')&&(js[6]=='w')) + {timerweek=payload; + tweek=1; + } + if((js[1] = 'i')&&(js[6]=='t'))// "id":"tout","t1":"100","t2":"010","t3":"001" + {timerout=payload; + Serial.println(timerout); + tweek=1; + } + if((js[1] = 't')&&(js[6]=='1'))//{"timer1":["08:00","09:00","10:00","11:00","12:00","13:00","14:00","15:00","16:00","17:00"],"timer2":["09:30","10:30","11:30","12:30","13:30","14:30","15:30","16:30","17:30","18:30"],"timer3":["10:15","11:15","12:15","13:15","14:15","15:15","16:15","17:15","18:15","19:15"]} + {timerdata=payload; + //Serial.println(timerdata); + tdat=1;//флаг разрешения парсинга строки и ее записи на SD + } + // Serial.println(js); + if((js[1] = 'i')&&(js[3]=='o'))//{"ido":"4","out":"1"} переключение выхода + {ledout=payload; + //Serial.println(ledout); + outconvert();// получен данные преобразуем в массив gpio[4]={0,0,0,1} + JSstringOut();//преобразуем состояние выходов gpio[4]={0,0,0,1} в JSON {"id":"out","out1":"1011"} + webSocket.textAll(jsonStringout);// выводим всем клиентам w/s + btime(); + } + } + + + + } + } + break; + } +} + + +void setup() { + pinMode(2, OUTPUT); + pinMode(4, OUTPUT); + digitalWrite(4, LOW); + pinMode(26, OUTPUT); + digitalWrite(26, LOW); + pinMode(27, OUTPUT); + digitalWrite(27, LOW); + pinMode(5, OUTPUT); + digitalWrite(5, LOW); + pinMode(19, OUTPUT); + digitalWrite(19, HIGH); + delay(500); +digitalWrite(19, LOW); + + Serial.begin(115200); + //pinMode(LED_PIN, OUTPUT); + rtc.begin(); + + // digitalWrite(2, LOW); + digitalWrite(2, HIGH); + Serial.println(WiFi.macAddress()); + + sdSPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS); + if (!SD.begin(SD_CS, sdSPI)) + { + // if(!SD.begin()){ + Serial.println("Mounting card mount failed"); + // return; + } + + + +uint8_t cardType = SD.cardType(); +if(cardType == CARD_NONE){ + Serial.println("No SD card attached"); + //return; + } + uint64_t cardSize = SD.cardSize() / (1024 * 1024); + Serial.printf("SD Card Size: %lluMB\n", cardSize); + + +if(!SPIFFS.begin()){ + Serial.println("An Error has occurred while mounting SPIFFS"); + //return; + } + + + Nrfsetup(); +//settimer();//таймер отсчета времени настр на 5 сек + WiFisetup(); + timeClient.begin(); + + timeClient.setTimeOffset(10800); + + +// ntp();//NTP init +/*current_time = hour1 * 60 + min1; +for (int i = 0; i <= 1439; i++) { + if (current_time > 1439) current_time = 0; + state1 = main_log(BTimer1, state1); + state2 = main_log(BTimer2, state2); + state3 = main_log(BTimer3, state3); +// state4 = main_log(Timer4, state4); + current_time++; +} +btime(); +*/ +timedate(); + Sdreaddata(); + Sdread(); + mySwitch.enableTransmit(22); + //mySwitch.send("000000000001010100010011"); + //mySwitch.send("000000000001010100010001"); + esp_now_register_recv_cb(OnDataRecv); + + + //*******************server****************************************************************** +// server.on("/", HTTP_GET, handleRoot); +server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/index.html"); + }); + server.on("/index.html", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/index.html"); + }); + // Route to load style.css file + server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/style.css", "text/css"); + }); + server.on("/fon.jpg", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/fon.jpg"); + }); +//***************************************************************************************************** +server.on("/upravlenie.html", HTTP_GET, [](AsyncWebServerRequest *request){ + fobnov=1; + ftdata=8; + request->send(SPIFFS, "/upravlenie.html", String(), false, processor); + }); + + //**************************************************************************************************************** + server.on("/setting.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=12; + request->send(SPIFFS, "/setting.html"); + }); + server.on("/inform.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=10; + request->send(SPIFFS, "/inform.html"); + }); + server.on("/informtabl.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=10; + request->send(SPIFFS, "/informtabl.html"); + }); + + server.on("/inform1.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=1; + request->send(SPIFFS, "/inform1.html"); + }); + server.on("/informtabl1.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=1; + request->send(SPIFFS, "/informtabl1.html"); + }); + + server.on("/inform2.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=2; + request->send(SPIFFS, "/inform2.html"); + }); + server.on("/informtabl2.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=2; + request->send(SPIFFS, "/informtabl2.html"); + }); + server.on("/inform3.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=3; + request->send(SPIFFS, "/inform3.html"); + }); + server.on("/informtabl3.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=3; + request->send(SPIFFS, "/informtabl3.html"); + }); + server.on("/inform4.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=4; + request->send(SPIFFS, "/inform4.html"); + }); + server.on("/informtabl4.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=4; + request->send(SPIFFS, "/informtabl4.html"); + }); + server.on("/inform5.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=5; + request->send(SPIFFS, "/inform5.html"); + }); + server.on("/informtabl5.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=5; + request->send(SPIFFS, "/informtabl5.html"); + }); + server.on("/inform6.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=6; + request->send(SPIFFS, "/inform6.html"); + }); + server.on("/informtabl6.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=6; + request->send(SPIFFS, "/informtabl6.html"); + }); + + server.on("/akva1.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=15; + request->send(SPIFFS, "/akva1.html"); + }); + + server.on("/akva2.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=16; + request->send(SPIFFS, "/akva2.html"); + }); + server.on("/akva3.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=17; + request->send(SPIFFS, "/akva3.html"); + }); + server.on("/akvadat.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=18; + request->send(SPIFFS, "/akvadat.html"); + }); + server.on("/akvagraf.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=18; + request->send(SPIFFS, "/akvagraf.html"); + }); + server.on("/timer.html", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/timer.html", String(), false, processor); + }); + server.on("/akva.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=7; + request->send(SPIFFS, "/akva.html"); + }); + + server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/favicon.ico"); + }); + server.on("/favicon-32x32.png", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/favicon-32x32.png"); + }); + server.on("/favicon-16x16.png", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/favicon-16x16.png"); + }); +//******************************************************************************************************** +JSstringU(); +JSstringK(); + server.addHandler(&webSocket); + webSocket.onEvent(handleWebSocketEvent); + + server.begin(); + esp_task_wdt_init(WDT_TIMEOUT, true); //включить панику, чтобы ESP32 перезапустился + esp_task_wdt_add(NULL); //добавить текущий поток в WDT watch + +} + + + + + + + +void loop() { + + // Send data to browser, increasing number every second. + if (millis() - countTimeWas >= 1000) { + countTimeWas = millis(); + countVal++;//cчетчик до перезапуска сервера + countVal1++; + v++; + v1++; + if (idcon>0)// если есть подключения + { String countUpdate1 = "{\"label3\":\"count1\",\"value\":" + String(countVal1) + "}";//отправка числовой переменной + webSocket.textAll(countUpdate1);//обновление ws + if((tdat==1)||(tweek==1))//есть новые данные для установок таймера + {timerconvert(); + gpio[3]=1;//управление выходами передаем таймеру + writeFile(SD, "/timerd.txt", timerdata.c_str());//записываем в этот файл значения для таймера + writeFile(SD, "/week.txt", timerweek.c_str());//записываем в этот файл значения недельного таймера + writeFile(SD, "/tdout.txt", timerout.c_str());//записываем в этот файл значения выходов к кот подкл таймер + //timerout= {"id":"tout","t1":"100","t2":"010","t3":"001"} + } + } + + + // Serial.println(countUpdate1); + + + + if (v1>3600) {//60min- + delay(0); + sdsave();// записываем на СД необходимые данные + delay(0); + ntp();//считываем время + v1=0;//обнуляем счетчик =3600с + delay(0); + } +//**************20sek******************************* + if (v>19){//20sek + JSstringU(); + JSstringK(); + JSstringOut(); + + + if((ntp_on==0)&&(idcon==0)) + {if((hour1==8)&&(min1==15))ntp();//синхронизация времени с NTP + + if((hour1==8)&&(min1>18)) ntp_on==1; //если NTP не отвечает прекращаем до следующего дня + } + + + + + if((res==1)&&(idcon==0))//idcon=0 клиентов нет + { + sdsave();// записываем на СД необходимые данные + ESP.restart(); //перезагрузка сервака + } + + res=0; + ntphome();//считываем время с esp32 + nrf(); //проверяем не приш ли данные на NRF + Serial.print ("idcon="); + Serial.println (idcon); + v=0;//обнуляем счетчик 4*5=20с + delay(0); + vrem();//время работы сайта + btime();//проверка сработки таймеров + + + if (idcon>0)// если есть подключения + { webSocket.textAll(jsonString);//{"id":"0","temperature":12.456787109375,"humidity":77.456787109375,"tim2":"18:15","ti + Serial.println(jsonString); + webSocket.textAll(jsonString2);//{"id":"2","tkom1":"20.0","hkom1":"30.0","batkom1":"4.10","timekom1" + Serial.println(jsonString2); + + String countUpdate = "{\"label3\":\"count\",\"value\":\"" + String(t10) + "\"}";//отправка строковой переменной время раб сервера + webSocket.textAll(countUpdate); + Serial.println(countUpdate); + delay(0); + String countUpdate2 = "{\"label3\":\"count2\",\"value\":\"" + String(timeserv) + "\"}";//отправка строковой переменной врем NTP + webSocket.textAll(countUpdate2); + Serial.println(countUpdate2); + } + } +//**************20sek end******************************* + + if((countVal>3600*2)&&(idcon==0))//прошло более 2 часов и нет подкл клиентов + { if(hour1!=3)res=1;//разрешение на перезагрузку сервака + + } + + + + + + } + esp_task_wdt_reset();//reset WDT сброс вотчдога +} diff --git a/WebSocket3Aqva/WiFi.ino b/WebSocket3Aqva/WiFi.ino new file mode 100644 index 0000000..c0ba0f1 --- /dev/null +++ b/WebSocket3Aqva/WiFi.ino @@ -0,0 +1,30 @@ +void WiFisetup() +{ + // Set the device as a Station and Soft Access Point simultaneously + + if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) { + Serial.println("STA Failed to configure"); + } + WiFi.mode(WIFI_AP_STA); + // Set device as a Wi-Fi Station + WiFi.begin(ssid, password); + digitalWrite(2, LOW); // светодиод погашен + + while (WiFi.status() != WL_CONNECTED) { + delay(1000); + Serial.println("Setting as a Wi-Fi Station.."); + } + digitalWrite(2, HIGH); // светодиод горит + + Serial.print("Station IP Address: "); + Serial.println(WiFi.localIP()); + Serial.print("Wi-Fi Channel: "); + Serial.println(WiFi.channel()); + + // Init ESP-NOW + if (esp_now_init() != ESP_OK) { + Serial.println("Error initializing ESP-NOW"); + return; + } + +} diff --git a/WebSocket3Aqva/data/akva.html b/WebSocket3Aqva/data/akva.html new file mode 100644 index 0000000..efaecc0 --- /dev/null +++ b/WebSocket3Aqva/data/akva.html @@ -0,0 +1,140 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Аквариум 1

+
+
+

TEMPERATURE

°C

light

+
+
+

FAN

Time

+
+
+ + +

Аквариум 2

+
+
+

TEMPERATURE

°C

light

+
+
+

FAN

Time

+
+
+ + +

Аквариум 3

+
+
+

TEMPERATURE

°C

light

+
+
+

FAN

Time

+
+
+
+

+ +
+ Время работы сервера: + 0:00 +

Count:0:00

+
+ + + +
+ +
+ + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/akva1.html b/WebSocket3Aqva/data/akva1.html new file mode 100644 index 0000000..6ddc178 --- /dev/null +++ b/WebSocket3Aqva/data/akva1.html @@ -0,0 +1,159 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + +
+ +
+

Аквариум 1

+
+
+

TEMPERATURE

°C

light

+
+
+

FAN

Time

+
+
+
................................................... +
+
+ таблица данных за сутки +
+ + + + + + + + + + + + + + + +
  Time  temperatura  light  fan
+ + +
+

+
+
+ + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/akva2.html b/WebSocket3Aqva/data/akva2.html new file mode 100644 index 0000000..05f7457 --- /dev/null +++ b/WebSocket3Aqva/data/akva2.html @@ -0,0 +1,160 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + +
+ +
+

Аквариум 2

+
+
+

TEMPERATURE

°C

light

+
+
+

FAN

Time

+
+
+
................................................... +
+
+ таблица данных за сутки +
+ + + + + + + + + + + + + + + + +
  Time  temperatura  light  fan
+
+ +
+

+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/akva3.html b/WebSocket3Aqva/data/akva3.html new file mode 100644 index 0000000..6ae3557 --- /dev/null +++ b/WebSocket3Aqva/data/akva3.html @@ -0,0 +1,160 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + +
+ +
+

Аквариум 3

+
+
+

TEMPERATURE

°C

light

+
+
+

FAN

Time

+
+
+
................................................... +
+
+ таблица данных за сутки +
+ + + + + + + + + + + + + + + + +
  Time  temperatura  light  fan
+
+ +
+

+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/akvadat.html b/WebSocket3Aqva/data/akvadat.html new file mode 100644 index 0000000..2eb0435 --- /dev/null +++ b/WebSocket3Aqva/data/akvadat.html @@ -0,0 +1,170 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + +
+ +
+

Аквариум

+ + + +
+ таблица данных за сутки +
+
................................................... +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  Time  temperatura1  temperatura2  temperatura3  light1  light2  light3  fan1  fan2  fan3
+ + +
+

+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/akvagraf.html b/WebSocket3Aqva/data/akvagraf.html new file mode 100644 index 0000000..f89f800 --- /dev/null +++ b/WebSocket3Aqva/data/akvagraf.html @@ -0,0 +1,236 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Аквариум

+ + +

+

+

+ +

+

+

+
+ +
+ + + + +
+

+
+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/android-chrome-192x192.png b/WebSocket3Aqva/data/android-chrome-192x192.png new file mode 100644 index 0000000..f57d851 Binary files /dev/null and b/WebSocket3Aqva/data/android-chrome-192x192.png differ diff --git a/WebSocket3Aqva/data/android-chrome-512x512.png b/WebSocket3Aqva/data/android-chrome-512x512.png new file mode 100644 index 0000000..78875b1 Binary files /dev/null and b/WebSocket3Aqva/data/android-chrome-512x512.png differ diff --git a/WebSocket3Aqva/data/apple-touch-icon.png b/WebSocket3Aqva/data/apple-touch-icon.png new file mode 100644 index 0000000..8245305 Binary files /dev/null and b/WebSocket3Aqva/data/apple-touch-icon.png differ diff --git a/WebSocket3Aqva/data/favicon-16x16.png b/WebSocket3Aqva/data/favicon-16x16.png new file mode 100644 index 0000000..c3ed26b Binary files /dev/null and b/WebSocket3Aqva/data/favicon-16x16.png differ diff --git a/WebSocket3Aqva/data/favicon-32x32.png b/WebSocket3Aqva/data/favicon-32x32.png new file mode 100644 index 0000000..7c5b0a2 Binary files /dev/null and b/WebSocket3Aqva/data/favicon-32x32.png differ diff --git a/WebSocket3Aqva/data/favicon.ico b/WebSocket3Aqva/data/favicon.ico new file mode 100644 index 0000000..06e0e94 Binary files /dev/null and b/WebSocket3Aqva/data/favicon.ico differ diff --git a/WebSocket3Aqva/data/fon.jpg b/WebSocket3Aqva/data/fon.jpg new file mode 100644 index 0000000..7e94f54 Binary files /dev/null and b/WebSocket3Aqva/data/fon.jpg differ diff --git a/WebSocket3Aqva/data/index.html b/WebSocket3Aqva/data/index.html new file mode 100644 index 0000000..11a0d87 --- /dev/null +++ b/WebSocket3Aqva/data/index.html @@ -0,0 +1,228 @@ + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+

Улица(восток)

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+

Улица(запад)

+ +
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

Комната1

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+ +

Комната2

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

Коридор

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

Балкон

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

Кухня

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+ +

+ + +
+ Время работы сервера: + 0:00 +

Count:0:00

+
+ +
+

+

+

+
+ +
+ + + + + +
+ + + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/inform.html b/WebSocket3Aqva/data/inform.html new file mode 100644 index 0000000..eef6bac --- /dev/null +++ b/WebSocket3Aqva/data/inform.html @@ -0,0 +1,230 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Улица(запад)

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

+

+

+ +

+

+

+
+ +
+ + + +
+ +
+

+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/inform1.html b/WebSocket3Aqva/data/inform1.html new file mode 100644 index 0000000..87bc5ca --- /dev/null +++ b/WebSocket3Aqva/data/inform1.html @@ -0,0 +1,227 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Улица(восток)

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+

+

+

+ +

+

+

+
+ +
+ + + + +
+

+
+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/inform2.html b/WebSocket3Aqva/data/inform2.html new file mode 100644 index 0000000..2d77d3c --- /dev/null +++ b/WebSocket3Aqva/data/inform2.html @@ -0,0 +1,229 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + + +
+ +
+

Комната1

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

+

+

+ +

+

+

+
+ +
+ + + + +
+
+

+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/inform3.html b/WebSocket3Aqva/data/inform3.html new file mode 100644 index 0000000..cb454cd --- /dev/null +++ b/WebSocket3Aqva/data/inform3.html @@ -0,0 +1,228 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Комната2

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

+

+

+ +

+

+

+
+ +
+
+
+

+
+ + + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/inform4.html b/WebSocket3Aqva/data/inform4.html new file mode 100644 index 0000000..7a6d5ba --- /dev/null +++ b/WebSocket3Aqva/data/inform4.html @@ -0,0 +1,226 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Коридор

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

+

+

+ +

+

+

+
+ +
+
+
+

+
+ + + + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/inform5.html b/WebSocket3Aqva/data/inform5.html new file mode 100644 index 0000000..98b0933 --- /dev/null +++ b/WebSocket3Aqva/data/inform5.html @@ -0,0 +1,227 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Балкон

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

+

+

+ +

+

+

+
+ +
+
+
+

+
+ + + + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/inform6.html b/WebSocket3Aqva/data/inform6.html new file mode 100644 index 0000000..1eaf986 --- /dev/null +++ b/WebSocket3Aqva/data/inform6.html @@ -0,0 +1,157 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Кухня

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+
................................................... +
+
+ таблица температуры за сутки +
+ + + + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/inform8.html b/WebSocket3Aqva/data/inform8.html new file mode 100644 index 0000000..6ab72a0 --- /dev/null +++ b/WebSocket3Aqva/data/inform8.html @@ -0,0 +1,151 @@ + + + + +Информация + + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Улица(восток)

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+
................................................... +
+
+ таблица температуры за сутки +
+ + + + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+ + + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/informtabl.html b/WebSocket3Aqva/data/informtabl.html new file mode 100644 index 0000000..f03786c --- /dev/null +++ b/WebSocket3Aqva/data/informtabl.html @@ -0,0 +1,164 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Улица(запад)

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

+ +
................................................... +
+
+ таблица температуры за сутки +
+ + + + + + + + + + + + + + +
  Time  temperatura  humidity
+
+ +
+

+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/informtabl1.html b/WebSocket3Aqva/data/informtabl1.html new file mode 100644 index 0000000..4be36e4 --- /dev/null +++ b/WebSocket3Aqva/data/informtabl1.html @@ -0,0 +1,166 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + + +
+ +
+

Улица(восток)

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+

+ +
................................................... +
+ +
+ + таблица температуры за сутки + +
+ +
+ + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/informtabl2.html b/WebSocket3Aqva/data/informtabl2.html new file mode 100644 index 0000000..1f9ed16 --- /dev/null +++ b/WebSocket3Aqva/data/informtabl2.html @@ -0,0 +1,162 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Комната1

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+ +

+ +
................................................... +
+
+ таблица температуры за сутки +
+ + + + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/informtabl3.html b/WebSocket3Aqva/data/informtabl3.html new file mode 100644 index 0000000..573c695 --- /dev/null +++ b/WebSocket3Aqva/data/informtabl3.html @@ -0,0 +1,161 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Комната2

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

+ +
................................................... +
+
+ таблица температуры за сутки +
+ + + + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/informtabl4.html b/WebSocket3Aqva/data/informtabl4.html new file mode 100644 index 0000000..2c2de89 --- /dev/null +++ b/WebSocket3Aqva/data/informtabl4.html @@ -0,0 +1,162 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Коридор

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

+ +
................................................... +
+
+ таблица температуры за сутки +
+ + + + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+ + + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/informtabl5.html b/WebSocket3Aqva/data/informtabl5.html new file mode 100644 index 0000000..f5fc450 --- /dev/null +++ b/WebSocket3Aqva/data/informtabl5.html @@ -0,0 +1,163 @@ + + + + +Информация + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Балкон

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

+ +
................................................... +
+
+ таблица температуры за сутки +
+ + + + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+ + + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/mstile-150x150.png b/WebSocket3Aqva/data/mstile-150x150.png new file mode 100644 index 0000000..3c8550b Binary files /dev/null and b/WebSocket3Aqva/data/mstile-150x150.png differ diff --git a/WebSocket3Aqva/data/setting.html b/WebSocket3Aqva/data/setting.html new file mode 100644 index 0000000..6a08474 --- /dev/null +++ b/WebSocket3Aqva/data/setting.html @@ -0,0 +1,478 @@ + + + + + + + + + + + +
+ +
+

ESP-Настройки таймера

+
+ + + + + +
+ + +
+ +
+

Таймер 1

+ +
    + +
    + + + + + + + +
    + +
  • on_1
  • +
  • off_1
  • +
  • on_2
  • +
  • off_2
  • +
  • on_3
  • +
  • off_3
  • +
  • on_4
  • +
  • off_4
  • +
  • on_5
  • +
  • off_5
  • + +
    + + + +
    +
+
+
+ + +
+

Таймер 2

+ +
    + +
    + + + + + + + +
    +
  • on_1
  • +
  • off_1
  • +
  • on_2
  • +
  • off_2
  • +
  • on_3
  • +
  • off_3
  • +
  • on_4
  • +
  • off_4
  • +
  • on_5
  • +
  • off_5
  • +
    + + + +
    +
+
+
+ + +
+

Таймер 3

+ +
    +
    + + + + + + + +
    + +
  • on_1
  • +
  • off_1
  • +
  • on_2
  • +
  • off_2
  • +
  • on_3
  • +
  • off_3
  • +
  • on_4
  • +
  • off_4
  • +
  • on_5
  • +
  • off_5
  • +
    + + + +
    +
+
+
+
+ +
+

+

+

+
+
+ Время работы сервера: + 0:00 +

Count:0:00

+
+ +
+

+

+

+
+ +
+ +
+ + + + + \ No newline at end of file diff --git a/WebSocket3Aqva/data/style.css b/WebSocket3Aqva/data/style.css new file mode 100644 index 0000000..177c32a --- /dev/null +++ b/WebSocket3Aqva/data/style.css @@ -0,0 +1,320 @@ +@charset "utf-8"; + + html {font-family: Arial; display: inline-block; text-align: center;} +body { + background-color: #C9C6C5; + color: #FFFFFF; + font-family: Arial, sans-serif; + font-size: 14px; + width: 100%; + margin-top: 5px; + background-image: url(fon.jpg); + position: static; + margin-left: 0px; +} + a{ + color: #FFFFFF; + margin-left: 17px; + } + a:visited { + color: #FFFFFF; /* Цвет посещенных ссылок */ + text-decoration: none; + margin-left: 17px; + } + a:active { + color: #A7F095; /* Цвет активных ссылок */ + margin-left: 17px; + } + a:hover { + color: #AFDAF4; /* Цвет ссылок при наведении мыши*/ + margin-left: 17px; + } +button { + padding: 10px 20px; + font: inherit; + transition: color 0s linear 2s; +} + +button:active { + color: #047F44; + transition-delay: 0s; +} + + +#header { + background: #F5DEB3; + width: 100%; +} + +#container { + background-color: #FFFFFF; + margin-right: auto; + margin-left: auto; + margin-bottom: auto; + text-align: center; + width: 80%; + height: 84px; + margin-top: 7px; + padding-top: 1px; +} + +#nav + { + background-color: #2F4468; + width: 100%; + color: #FFFFFF; + font-size: small; + margin-left: -18px; + margin-top: -3px; +} +#nav1 + { + background-color: #2F4468; + width: 100%; + color: #110FF8; + font-size: small; + margin-top: 64px; + margin-right: 64px; + margin-bottom: 64px; + margin-left: 64px; +} + + +#sidebar { + background-color: #8CA2AF; + float: left; + width: 20%; + position: static; + margin-top: -1px; + height: 420px; + min-width: 0px; +} + +#content { + background-color: #F8E6C1; + float: right; + width: 80%; + color: #14437A; + margin-top: -2px; + opacity: 0.91; +} +#content1 { + background-color: #F8E6C1; + width: 80%; + color: #14437A; + margin-right: auto; + margin-left: auto; + opacity: 0.91; + +} + +#clear { + clear: both; +} + +#footer { + background: #00BFFF; + width: 100%; + height: 40px; +} + + .topnav { + overflow: hidden; + background-color: #2f4468; + color: white; + font-size: 1.7rem; + height: 65px; + line-height: 3px; + +} +.top{ + overflow: hidden; + background-color: #8CA2AF; + color: white; + width: 100%; + +} +.top1{ + overflow: hidden; + background-color: #8CA2AF; + color: white; + width: 10%; + +} +.top2{ + overflow: hidden; + background-color: #B59D69; + color: white; + width: 100%; + +} + + .card.temperature { color: #fd7e14; } + .card.humidity { color: #1b78e2; } +.card.but { color: #3F97E8; } + + + .card { + background-color: #F9F9F7; + box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); +} + .cards { + max-width: 901px; + margin-right: auto; + margin-left: auto; + display: grid; + grid-gap: 2rem; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + min-height: 133px; +} + .reading { + font-size: 2.8rem; + +} + + + #navigation2 { + font-size: small; + color: #3E73A7; + float: left; + border-top-width: thick; + padding-left: 20px; +} +#navigation1 { + font-size: small; + color: #FFFFFF; + float: left; + border-top-width: thick; + padding-left: 20px; +} + + .times{ + font-size: xx-large; + margin-top: -50px; + background-color: #2F4468; + color: #FFFFFF; + height: 57px; + line-height: 56px; + } + .manth{ + color: #02087C; + margin-top: 0px; + background-color: #EF7320; + height: 2pc; + font-size: large; + padding-top: 2px; + opacity: 1; + line-height: 3%; + } +.servertime { + margin-top: 37px; +} +.data{ + color: #2F4468; + background-color: #FFFFFF; + margin-top: -93px; + height: 146px; + font-size: 92px; + line-height: 97px; +} +.week{ + color: #000006; + margin-top: -91px; + background-color: #EF7320; + height: 2pc; + font-size: large; + line-height: 30px; + +} +.levnav{ + font-size: large; + color: #FFFFFF; + margin-top: 5px; + margin-left: 25px; + line-height: 11px; + margin-right: 31px; + text-decoration: none; + text-align: left; + +} +#containerinf { + background-color: #B59D69; + margin-right: auto; + margin-left: auto; + margin-bottom: auto; + text-align: center; + width: 80%; + height: 84px; + margin-top: 7px; + padding-top: 1px; + opacity: 1; +} +#contentinfo { + background-color: #ECD9B1; + width: 100%; + color: #14437A; + margin-top: -2px; + opacity: 0.83; +} +.contentgraf { + background-color: #FFFFFF; + width: 100%; + color: #14437A; + margin-top: -2px; + +} +#tablinfo{ + background-color: #ECD9B1; + width: 35%; + color: #14437A; + margin-top: 11px; + opacity: 0.83; + text-align: center; + margin-right: auto; + margin-left: auto; + +} + .switch { + position: relative; + display: inline-block; + width: 120px; + height: 68px} + .switch input {display: none} + .slider { + position: absolute; + top: 0; + left: 0; + right: 0; bottom: 0; + background-color: #F0D2A8; + border-radius: 34px} + .slider:before { + position: absolute; + content: ""; + height: 52px; + width: 52px; + left: 8px; + bottom: 8px; + background-color: #fff; + -webkit-transition: .4s; + transition: .4s; + border-radius: 68px} + input:checked+.slider {background-color: #2196F3} + input:checked+.slider:before {-webkit-transform: translateX(52px); + -ms-transform: translateX(52px); transform: translateX(52px)} +.slider2 { -webkit-appearance: none; margin: 14px; width: 360px; height: 15px; background: #EAD7AF; + outline: none; -webkit-transition: .2s; transition: opacity .2s;} +.slider2::-webkit-slider-thumb {-webkit-appearance: none; appearance: none; width: 35px; height: 35px; background: #003249; cursor: pointer;} +.slider2::-moz-range-thumb { width: 15px; height: 35px; background: #003249; cursor: pointer; } +input[type=time] { + border: #01094B; + + color: #01094B; + padding: 2px; + margin: 3px; + font-size: 22px; + font-family: helvetica; + width: 93px; +} + + + diff --git a/WebSocket3Aqva/data/timer.html b/WebSocket3Aqva/data/timer.html new file mode 100644 index 0000000..3195800 --- /dev/null +++ b/WebSocket3Aqva/data/timer.html @@ -0,0 +1,289 @@ + + + + + ESP-NOW DASHBOARD + + + + + + + + + + + + +
+
+

ESP-Домашний сервер

%dataserv%

+ + + + + + +
+ + +
+
+

Таймер

+
+ + +
+

%timer1% минут

+

+ %BUTTONPLACEHOLDER1% +
+ +
+

%timer2% минут

+

+ %BUTTONPLACEHOLDER2% +
+ +
+ %BUTTONPLACEHOLDER3% +
+
+ %BUTTONPLACEHOLDER4% +
+ +
+ + + +
+

+

+

+
+
+
+ +
+ + 0:00 +
+ + +
+

+

+

+
+ +
+ + + + + + + + diff --git a/WebSocket3Aqva/data/upravlenie.html b/WebSocket3Aqva/data/upravlenie.html new file mode 100644 index 0000000..2832aeb --- /dev/null +++ b/WebSocket3Aqva/data/upravlenie.html @@ -0,0 +1,192 @@ + + + + + ESP-NOW DASHBOARD + + + + + + + + + + + + +
+
+

ESP-Домашний сервер

%dataserv%

+ + + + + + +
+ + +
+
+

Управление

+
+
+

TEMPERATURE

°C

Time

+
+
+

HUMIDITY

%

Time

+
+
+ %BUTTONPLACEHOLDER1% +
+ +
+ %BUTTONPLACEHOLDER2% +
+ +
+ %BUTTONPLACEHOLDER3% +
+
+ %BUTTONPLACEHOLDER4% +
+ +
+ + + +
+

+

+

+
+
+
+ +
+ + 0:00 +
+ + +
+

+

+

+
+ +
+ + + + + + + + diff --git a/WebSocket3Aqva/data/upravlenie1.html b/WebSocket3Aqva/data/upravlenie1.html new file mode 100644 index 0000000..53a1b7d --- /dev/null +++ b/WebSocket3Aqva/data/upravlenie1.html @@ -0,0 +1,109 @@ + + + + + ESP-NOW DASHBOARD + + + + + + + + + + + + +
+
+

ESP-Домашний сервер

%dataserv%

+ + + + + + +
+ + +
+
+

Управление

+
+
+

TEMPERATURE

°C

Time

+
+
+

HUMIDITY

%

Time

+
+ + +
+ + + +
+

+

+

+
+
+
+ +
+
+

+

+

+
+
+
+
+ +
+ + 0:00 +
+ + +
+

+

+

+
+ +
+ + + + + + + + diff --git a/WebSocket3Aqva/nrf.ino b/WebSocket3Aqva/nrf.ino new file mode 100644 index 0000000..86b60df --- /dev/null +++ b/WebSocket3Aqva/nrf.ino @@ -0,0 +1,68 @@ +void Nrfsetup() +{ + if (! radio.begin()) + { + // if(!SD.begin()){ + Serial.println("Radio is failed"); + // return; + } +else +{ + Serial.println("Radio begin"); +} + radio.setChannel(100); + radio.setPayloadSize(16);//должно быть16 + radio.setAddressWidth(5); + radio.setAutoAck( 0 ,false); + radio.setCRCLength(RF24_CRC_16); + radio.setDataRate(RF24_2MBPS); + radio.openReadingPipe(0,pip); + radio.startListening(); +} + +void nrf() +{ + if (radio.available()){ + radio.read(msg,16); + esp_task_wdt_reset();//reset WDT + Serial.println(msg); + parsmsg(); + delay(0); + if (radio.available()){radio.read(msg,16); + parsmsg();} + delay(500); + if (radio.available()){radio.read(msg,16); + parsmsg();} + delay(500); + if (radio.available()){radio.read(msg,16); + parsmsg();} + delay(500); + if (radio.available()){radio.read(msg,16); + parsmsg();} + delay(500); + if (radio.available()){radio.read(msg,16); + parsmsg();} + delay(0); + JSstringK();//создаем строку для сайта + delay(0); + + + if(nt==2){saveul();}//t9 T2 + if(nt==3){savebalk();}//t1 T3 + if(nt==4){savek2();}//t2 T4 + if(nt==5){savek1();}//t3 T5 + if(nt==7){savekor();}//t5 T6 + if(nt==9){saveakva();}//t7 T7 + delay(0); + if (radio.available()){radio.read(msg,16);} + } + //t1+138c347v524h5 балкон + //t2+243c401v528h моя комната +// t3+230c357v469h зал +// t5+230c357v469h коридор +//9d+088h866s00v улица восток +//t7+247c251c243c024 t1 t2 t3 akva + +delay(0); + +} diff --git a/WebSocket3Aqva/ntp.ino b/WebSocket3Aqva/ntp.ino new file mode 100644 index 0000000..13a37ac --- /dev/null +++ b/WebSocket3Aqva/ntp.ino @@ -0,0 +1,140 @@ +void ntp() + { + // while(!timeClient.update()) { + // timeClient.forceUpdate(); + //} + Serial.println("NTP"); +ntp_on=0; +if(!timeClient.update()) { + for(int i=0; i<2 && !timeClient.update(); i++) + {timeClient.forceUpdate(); + if(i<1)//проверка подкл к NTP + {ntp_on=1; + } + else + { + ntp_on=0; + } + } + } + else{ + ntp_on=1; + } + + +//если подкл +if(ntp_on==1) + { // The formattedDate comes with the following format: + // 2018-05-28T16:00:13Z + // We need to extract date and time + // formattedDate = timeClient.getFormattedDate(); + formattedTime =timeClient.getFormattedTime(); + Serial.println(formattedTime); + Serial.println("NTP3"); +// getDay +//getHours +//getMinutes +//getSeconds +//getFormattedTime +// formattedDate =timeClient.getFormattedDate(); + // int splitT = formattedDate.indexOf("T"); +// dayStamp = formattedDate.substring(0, splitT); +// Serial.println(timeClient.getDay()); + + // Extract time + // timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1); +// Serial.println("ntp"); +// Serial.println(timeClient.getEpochTime()); + stamp.getDateTime(timeClient.getEpochTime()); +EpochTime=timeClient.getEpochTime(); + Serial.println(EpochTime); + // забираем вот так +// Serial.println(stamp.year); + Serial.println(stamp.month); + Serial.println(stamp.day); + // Serial.println(stamp.hour); + // Serial.println(stamp.minute); + // Serial.println(stamp.second); + Serial.println(stamp.dayOfWeek); + timeserv=formatTimeDigits(stamp.hour,stamp.minute); + Serial.println("time"); + Serial.println(timeserv); + //dataserv=formatDateDigits(stamp.day, stamp.month, stamp.year); + //***************************Из ntp в ds 3231************************************ + DateTime now = rtc.now(); +if((stamp.day==now.day())&&(stamp.hour==now.hour())) +{ rtc.adjust(DateTime(stamp.year,stamp.month, stamp.day, stamp.hour,stamp.minute,stamp.second)); + Serial.println("NTP time write"); +} + +hour1=stamp.hour; +min1=stamp.minute; + + dataserv=stamp.day; + munthserv=strm[stamp.month-1] ; + weekserv=strweek[stamp.dayOfWeek]; +// tweekday=stamp.dayOfWeek;//1-7 +//Serial.println(timeserv); +//Serial.println(dataserv); + } +else +{Serial.println("NTP not c0nnect");//EpochTime=10983 3:03:03 + //EpochTime=EpochTime;//если NTP не ответил читаем EpochTime с СД карты +} + +} + +char *formatTimeDigits(int hour, int minute) +{ +char *time_str = new char[5]; +time_str[0] = '0' + (hour / 10); +time_str[1] = '0' + (hour % 10); +time_str[2] = ':'; +time_str[3] = '0' + (minute / 10); +time_str[4] = '0' + (minute % 10); +time_str[5] = '\0'; + +return time_str; +} + +char *formatDateDigits(int date, int mounth, int year) +{ +char *date_str = new char[9]; + +date_str[1] = '0' + (date % 10); +date_str[2] = '/'; +date_str[0] = '0' + (date / 10); +date_str[3] = '0' + (mounth / 10); +date_str[4] = '0' + (mounth % 10); +date_str[5] = '/'; +date_str[6] = '0' + ((year % 100) / 10); +date_str[7] = '0' + (year % 10); +date_str[8] = '\0'; + +return date_str; +} + +void ntphome() +{DateTime now = rtc.now(); + // stamp.getDateTime(timeClient.getEpochTime()); + // timeserv=formatTimeDigits(stamp.hour,stamp.minute); + timeserv=formatTimeDigits(now.hour(),now.minute()); + // hour1=stamp.hour; + hour1=now.hour(); +//min1=stamp.minute; +min1=now.minute(); + +// dataserv=formatDateDigits(stamp.day, stamp.month, stamp.year); + //dataserv=stamp.day; + dataserv=now.day(); + data1=now.day(); + munthserv=strm[now.month()-1] ; + + weekserv=strweek[now.dayOfTheWeek()]; + + tweekday=now.dayOfTheWeek(); +month1=now.month(); + year1=now.year(); + Serial.println("time"); + Serial.println(timeserv); +} diff --git a/WebSocket3Aqva/outconvert.ino b/WebSocket3Aqva/outconvert.ino new file mode 100644 index 0000000..157016e --- /dev/null +++ b/WebSocket3Aqva/outconvert.ino @@ -0,0 +1,74 @@ +void outconvert() +{ int led; + bool outl; + int j=0; + for (int i = 0; i < ledout.length() ; i++) {//перебираем строку данных {"ido":"4","out":"1"} + + if (ledout[i]==':') + {j++; + if (j==1)//первое : + { if (ledout[i+3]!='\"') + { + led=int(ledout[i+2] - '0')*10+int(ledout[i+3] - '0'); + } + else + { led=int(ledout[i+2] - '0'); + } + } + if (j==2)//второе : + {outl=int(ledout[i+2] - '0'); + } + } + + + } + + switch (led) { + case 4: + + state1=outl; + gpio[0]=outl; + gpio[3]=0; + break; + case 26: + state2=outl; + gpio[1]=outl; + gpio[3]=0; + // BTimer2[0]=3; + break; + case 27: + state3=outl; + gpio[2]=outl; + gpio[3]=0; + // BTimer3[0]=3; + break; + case 55: + //таймер или кнопки + //state1=outl; + gpio[3]=outl; + + break; + } + if( gpio[3]==0)//1-управление выходами через таймер 0- через кнопки + { BTimer1[0]=3; + BTimer2[0]=3; + BTimer3[0]=3; + } + else + { + BTimer1[0]=2; + BTimer2[0]=2; + BTimer3[0]=2; + btime(); + } + digitalWrite(led, outl); + Serial.print(state1); + Serial.print(state2); + Serial.println(state3); + Serial.print("led"); + Serial.print(led); + Serial.print(":"); + Serial.println(outl); + + } + diff --git a/WebSocket3Aqva/parsmsg.ino b/WebSocket3Aqva/parsmsg.ino new file mode 100644 index 0000000..917725f --- /dev/null +++ b/WebSocket3Aqva/parsmsg.ino @@ -0,0 +1,394 @@ + +void parsmsg() +{ +//int tkom1=0;//температура +//int hkom1=0;//влажность +//int batkom1=0; +//String timekom1;//время прихода данных комната1 + +//int tkom2=0; +//int hkom2=0; +//int batkom2=0; +//String timekom2; + +//int tkor=0; +//int hkor=0; +//int batkor=0; +//String timekor; + +//int tbal=0; +//int hbal=0; +//int batbal=0; +//String timebal; + +//String timebal; + //t1+138c347v524h5 балкон + //t2+243c401v528h моя комната +// t3+230c357v469h зал +// t5+230c357v469h коридор +//9d+088h866s00v улица восток +//timeul1 +//tul1 +//hul1 +//osv1 +//char msg[16];принятое сообщение +int tdat;//температура +int hdat;//влажность +int vdat;//напряж батареи датчика +int zndat; +int osv; + char token9[] = "9d";//улица + char token11[] = "t1";//датчики + char token12[] = "t2";//датчики + char token13[] = "t3";//датчики + char token14[] = "t4";//датчики + char token15[] = "t5";//датчики + char token17[] = "t7";//датчики akva + + int n=0; + int p=0; + boolean chet=0; +char c ; + delay(0); +//*************************** +Serial.println (msg); +for (int j=0 ; j<15 ;j++) +{ c=msg[j];//принятая с премника перемнная + + + if (p==9) + { if (c==token9[1]){p=99;}//данные с ул датчика восток + else{ + p=0;} + } + if (p==101)//cравнение второго символа на соответствие t 1 + { if (c==token11[1]){p=111;} + + } + if (p==101)//cравнение второго символа на соответствие t 2 + { if (c==token12[1]){p=112;} + + } + if (p==101)//cравнение второго символа на соответствие t 3 + { if (c==token13[1]){p=113;} + + } + if (p==101)//cравнение второго символа на соответствие t 4 + { if (c==token14[1]){p=114;} + + } + if (p==101)//cравнение второго символа на соответствие t 4 + { if (c==token17[1]){p=117;} + + } + if (p==101)//cравнение второго символа на соответствие t 5 + { if (c==token15[1]){p=115;} + else{ + p=0;} + } + //************************************************* + delay(0); + if (p==99) + {// myFile.print(c);//d+237h895s05v + nt=2; + timeul1=timeserv;//время получения данных + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=2;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5){ + tdat=(c-48)+tdat; + + if(zndat==1){tul1="-"+String (tdat/10)+"."+String (tdat%10); //температура знак -230 -23.0 + } + else + {tul1=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + } + if (n==7){hdat=(c-48)*100;}//влажность + if (n==8){hdat=(c-48)*10+hdat;} + if (n==9){ + hdat=(c-48)+hdat; + hul1=String (hdat/10)+"."+String (hdat%10); //влажность 866 86.6% + } + if (n==11){osv=10*(c-48);}//освещенность + if (n==12) + {osv=osv+(c-48); + if(osv>99){osv=99;} + osv1=String (osv)+"%"; + }//sun + // hourdu=t.hour;//время прихода данных час + // mindu=t.min;//мин + + } + //***************************************** + delay(0); + //*****************датчики температуры переносные*********************** +//************************T1**************************************************** + if (p==111) //выделение данных из принятой строки + { timebal=timeserv;//время получения данных + nt=3; +//byte ntdat;номер датчика +//byte zndat;знак температуры 0+ +//int tdat;температура +//int hdat;влажность +//int vdat;напряж батареи датчика + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=0;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + tbal=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + + if (n==7){vdat=(c-48)*100;}//напряж батареи датчика + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + batbal=String (vdat/100)+"."+String (vdat%100);//батарея 357v 3.75в + } + if (n==11){hdat=(c-48)*100;}//влажность + if (n==12) + {hdat=(c-48)*10+hdat; + } + if (n==13) + {hdat=(c-48)+hdat; + hbal=String (hdat/10)+"."+String (hdat%10); //влажность 866 86.6% + } + + } + delay(0); +//**************************************** T2 + if (p==112) //выделение данных из принятой строки + {timekom2=timeserv;//время получения данных + nt=4; + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=0;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + tkom2=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + + if (n==7){vdat=(c-48)*100;}//напряж батареи датчика + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + batkom2=String (vdat/100)+"."+String (vdat%100);//батарея 357v 3.75в + } + if (n==11){hdat=(c-48)*100;}//влажность + if (n==12) + {hdat=(c-48)*10+hdat; + } + if (n==13) + {hdat=(c-48)+hdat; + hkom2=String (hdat/10)+"."+String (hdat%10); //влажность 866 86.6% + } + + } + delay(0); + //**************************************** + //**************************************** T3 + if (p==113) //выделение данных из принятой строки + {// myFile.print(c);//t2+103c375v299h9 + nt=5; + timekom1=timeserv;//время получения данных + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=0;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + tkom1=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + + + + if (n==7){vdat=(c-48)*100;}//напряж батареи датчика + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + batkom1=String (vdat/100)+"."+String (vdat%100);//батарея 357v 3.75в + } + if (n==11){hdat=(c-48)*100;}//влажность + if (n==12) + {hdat=(c-48)*10+hdat; + } + if (n==13) + {hdat=(c-48)+hdat; + hkom1=String (hdat/10)+"."+String (hdat%10); //влажность 866 86.6% + } + + } +//**************************************** T4 **************************** + /* if (p==114) //выделение данных из принятой строки + {// myFile.print(c);//t1+103c375v299h9 + ntdat=4; + if(chet==0) + { if( hourd4==t.hour) + {fh=1; + } + else + {fh=0; + } + chet=1; + } + hourd4=t.hour; + mind4=t.min; +//byte ntdat;номер датчика +//byte zndat;знак температуры 0+ +//int tdat;температура +//int hdat;влажность +//int vdat;напряж батареи датчика + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=0;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + for (int u =22 ; u >= 0; u = u--) + { + t4[u+1]=t4[u]; + } + if(zndat==1)//- + {t14=tdat+1000; + t4[0]=t14; + } + else + {t14=tdat; + t4[0]=t14; + } + } + + if (n==7){vdat=(c-48)*100;}//напряж батареи датчика + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + bat[3]=vdat; + } + if (n==11){hdat=(c-48)*100;}//влажность + if (n==12) + {hdat=(c-48)*10+hdat; + for (int u =22 ; u >= 0; u = u--) + { + h4[u+1]=h4[u]; + } + h4[0]=hdat; + + } + if (n==13) + {hdat=(c-48)+hdat; + h14=hdat; + } + + }*/ + delay(0); + //**************************************** T5 + if (p==115) //выделение данных из принятой строки + {// myFile.print(c);//t2+103c375v299h9 + timekor=timeserv;//время получения данных + nt=7; + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=0;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + tkor=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + + if (n==7){vdat=(c-48)*100;}//напряж батареи датчика + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + batkor=String (vdat/100)+"."+String (vdat%100);//батарея 357v 3.75в + } + if (n==11){hdat=(c-48)*100;}//влажность + if (n==12) + {hdat=(c-48)*10+hdat; + } + if (n==13) + {hdat=(c-48)+hdat; + hkor=String (hdat/10)+"."+String (hdat%10); //влажность 866 86.6% + } + + } + delay(0); +//******************************************************************************* + //**************************************** T7 + if (p==117) //выделение данных из принятой строки + {// myFile.print(c);//t7+247c251c243c024 + timeakva=timeserv;//время получения данных + nt=9;// номер терм для сайта + n++; + if (n==3) {tdat=(c-48)*100;} //температура t1 + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + takva1=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + + if (n==7){vdat=(c-48)*100;}//t2 + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + takva2=String (vdat/10)+"."+String (vdat%10);//t2 + } + if (n==11){hdat=(c-48)*100;}//t3 + if (n==12){hdat=(c-48)*10+hdat;} + if (n==13) + {hdat=(c-48)+hdat; + takva3=String (hdat/10)+"."+String (hdat%10);//t3 + + } + + + } + delay(0); +//******************************************************************************* + +if ((c==token9[0])&&(p==0)){p=9;} +if ((c==token11[0])&&(p==0)){p=101;}//cравнение первого символа на соответствие t +}//for +//************************************************* + + +}//void pars diff --git a/WebSocket3Aqva/processor.ino b/WebSocket3Aqva/processor.ino new file mode 100644 index 0000000..4e6495e --- /dev/null +++ b/WebSocket3Aqva/processor.ino @@ -0,0 +1,60 @@ +String processor(const String& var){ + //Serial.println(var); + if(var == "BUTTONPLACEHOLDER1"){//вставка на странице(если в HTML нашли BUTTONPLACEHOLDER1 то вставляем кнопки) + String buttons =""; + //отправка значения состояния перключателей checked- включен ""-выключен + buttons+= "

Выход 1

"; + + return buttons; + } + if(var == "BUTTONPLACEHOLDER2"){//вставка на странице(если в HTML нашли BUTTONPLACEHOLDER2 то вставляем кнопки) + String buttons =""; + //отправка значения состояния перключателей checked- включен ""-выключен + + buttons += "

Выход 2

"; + + return buttons; + } + if(var == "BUTTONPLACEHOLDER3"){//вставка на странице(если в HTML нашли BUTTONPLACEHOLDER3 то вставляем кнопки) + String buttons =""; + //отправка значения состояния перключателей checked- включен ""-выключен + + buttons += "

Выход 3

"; + return buttons; + } + if(var == "BUTTONPLACEHOLDER4"){//вставка на странице(если в HTML нашли BUTTONPLACEHOLDER4 то вставляем кнопки) + String buttons =""; + //отправка значения состояния перключателей checked- включен ""-выключен + //кнопка таймера (если вкл то выходы работают по таймерам если нет то по кнопке + buttons += "

Таймер

"; + return buttons; + } + if(var == "BUTTON"){//вставка на странице(если в HTML нашли BUTTON то вставляем кнопки) + String buttons =""; + //отправка значения состояния перключателей checked- включен ""-выключен + buttons+= "

Output - GPIO 4

"; + buttons += "

Output - GPIO 26

"; + buttons += "

Output - GPIO 27

"; + return buttons; + } + return String(); +} + +//************************************************ + +String outputState(int out){ + if(digitalRead(out)){ + return "checked"; + } + else { + return ""; + } +} +String outputState55(int out){ + if(gpio[3]==1){ + return "checked"; + } + else { + return ""; + } +} diff --git a/WebSocket3Aqva/servertime.ino b/WebSocket3Aqva/servertime.ino new file mode 100644 index 0000000..f09c84d --- /dev/null +++ b/WebSocket3Aqva/servertime.ino @@ -0,0 +1,30 @@ +void vrem()//время работы сервера +{ + +int time17 = millis()/1000; +delay(0); +if (time17/60/60<10) { Serial.print ("0"); } +Serial.print (time17/60/60); +Serial.print (":"); +if (time17/60%60<10) { Serial.print ("0"); } +Serial.print ((time17/60)%60); +Serial.print (":"); +if (time17%60<10) { Serial.print ("0"); } +Serial.println (time17%60); +delay(0); +String q1=String(time17/60/60, DEC); +delay(0); +String q2=String((time17/60)%60, DEC); +delay(0); +String q3=String(time17%60, DEC); +delay(0); +if ((time17/60)%60<10) + { + t10=String(time17/60/60, DEC)+":"+"0"+String((time17/60)%60, DEC); + } + else + {t10=String(time17/60/60, DEC)+":"+String((time17/60)%60, DEC); + } + delay(0); +//t10 =q1+":"+q2+":"+q3 ; +} diff --git a/WebSocket3Aqva/timer.ino b/WebSocket3Aqva/timer.ino new file mode 100644 index 0000000..38bf1a2 --- /dev/null +++ b/WebSocket3Aqva/timer.ino @@ -0,0 +1,41 @@ +void settimer() { + + +/* LED pin */ +//int led = 14; +/* LED state */ +//volatile byte state = LOW; + // Use 1st timer of 4 (counted from zero). + // Set 80 divider for prescaler (see ESP32 Technical Reference Manual for more + // info). + timer = timerBegin(2, 80, true); + + /* Attach onTimer function to our timer */ + // timerAttachInterrupt(timer, &onTimer, true); + timerAttachInterrupt(timer, &onTimer, true); + /* Set alarm to call onTimer function every second 1 tick is 1us + => 1 second is 1000000us */ + /* Repeat the alarm (third parameter) */ + timerAlarmWrite(timer, 5000000, true); + /* Start an alarm */ + timerAlarmEnable(timer); + // Serial.println("start timer"); + +} + +void IRAM_ATTR onTimer() +{ + EpochTime=EpochTime+5; + esp_task_wdt_reset();//reset WDT +//Serial.print("EpochTime="); + //Serial.println(EpochTime); + // Increment the counter and set the time of ISR +// portENTER_CRITICAL_ISR(&timerMux); +// isrCounter++; +// lastIsrAt = millis(); +// portEXIT_CRITICAL_ISR(&timerMux); + // Give a semaphore that we can check in the loop +// xSemaphoreGiveFromISR(timerSemaphore, NULL); + // It is safe to use digitalRead/Write here if you want to toggle an output + +} diff --git a/WebSocket3Aqva/timerconvert.ino b/WebSocket3Aqva/timerconvert.ino new file mode 100644 index 0000000..1218b85 --- /dev/null +++ b/WebSocket3Aqva/timerconvert.ino @@ -0,0 +1,195 @@ +void timerconvert() +{ //timerout= {"id":"tout","t1":"100","t2":"010","t3":"001"} подкл таймеров по выходов + //String timerdata + //{"timer1":["01:00","09:00","10:00","11:00","","","","","",""],"timer2":[ +// String timerweek={"id":"week","timer1_week":"0111100","timer2_week":"1000011","timer3_week":"0101010"}; + //(str[1] = 't') + //uint16_t BTimer1 [11] = {3, 390, 450, 1440, 1440, 1440, 1440, 1440, 1440, 1440, 1440}; // массивы всех таймеров для суточных каналов (1 - 4) 0-й элемент отвечает за состояние канала (1 - вкл/ 0 - выкл/ 2 - авто)) + if (timerdata.startsWith("{\"timer1"))//парсим "timer1":["01 + {tdat=0; + int timer=0;//номер таймера + //int index =1;// индекс массива таймера + // Serial.println("timer"); + // Serial.println(timerdata.length()); + // Serial.println(timerdata[12]); + for (int i = 0; i < timerdata.length() ; i++) {//перебираем строку данных + + if (timerdata[i]=='[') + {timer++; + //******************************************************************** + if (timer==1) + {i=i+2; + for (int j = 1; j < 11 ; j++){ + if (timerdata[i]!='\"') + { + BTimer1 [j]=((int(timerdata[i] - '0')*10+int(timerdata[i+1] - '0'))*60+(int(timerdata[i+3] - '0')*10+int(timerdata[i+4] - '0'))); + i=i+8; + //Serial.println(BTimer1 [j]); + } + else + {i=i+3; + BTimer1 [j]=1440;//время неустановлено + } + // Serial.println(timerdata[i]); + + } + + } + //****************************************************************************** + if (timer==2) + {i=i+2; + for (int j = 1; j < 11 ; j++){ + + if (timerdata[i]!='\"') + { + BTimer2 [j]=((int(timerdata[i] - '0')*10+int(timerdata[i+1] - '0'))*60+(int(timerdata[i+3] - '0')*10+int(timerdata[i+4] - '0'))); + i=i+8; + //Serial.println(BTimer1 [j]); + } + else + {i=i+3; + BTimer2 [j]=1440; + } + // Serial.println(timerdata[i]); + + } + + } + if (timer==3) + {i=i+2; + for (int j = 1; j < 11 ; j++){ + if (timerdata[i]!='\"') + { + BTimer3 [j]=((int(timerdata[i] - '0')*10+int(timerdata[i+1] - '0'))*60+(int(timerdata[i+3] - '0')*10+int(timerdata[i+4] - '0'))); + i=i+8; + //Serial.println(BTimer1 [j]); + } + else + {i=i+3; + BTimer3 [j]=1440; + } + // Serial.println(timerdata[i]); + + } + // Serial.println(" "); + // for(int a = 0; a < 11; a++) + // { Serial.print(BTimer3[a]); + // } + // Serial.println(" "); + } + } + + } + + } + + + //****************************************************************************************** + if (timerweek.startsWith("{\"id\":\"week"))//парсим {"id":"week","timer1_week":"0111100" + {tweek=0; + int timer=0;//номер таймера + // Serial.println("week"); + // Serial.println(timerweek.length()); + for (int i = 0; i < timerweek.length() ; i++) {//перебираем строку данных + if (timerweek[i]==':') + {timer++; + if (timer==2)//данные таймера1 идут после вторых двоеточий + {i=i+2; + for (int j = 0; j < 7 ; j++){ + weekTimer1 [j]=int(timerweek[i+j] - '0');//пребразуем строку "0111100" в массив чисел weekTimer1 [7]= + } + } + if (timer==3) + {i=i+2; + for (int j = 0; j < 7 ; j++){ + weekTimer2 [j]=int(timerweek[i+j] - '0');//пребразуем строку "0111100" в массив чисел weekTimer1 [7]= + } + } + if (timer==4) + {i=i+2; + for (int j = 0; j < 7 ; j++){ + weekTimer3 [j]=int(timerweek[i+j] - '0');//пребразуем строку "0111100" в массив чисел weekTimer1 [7]= + } + Serial.print("weekTimer3"); + for(int a = 0; a < 7; a++) + { Serial.print(weekTimer3[a]); + } + Serial.println(""); + //Serial.println(""); + // Serial.print("tweekday"); + //Serial.println(tweekday); + } + } + } + } + // weekTimer1 [7]={0,0,0,0,0,0,0};//недельные установки t1 + if(weekTimer1 [tweekday-1]==1) + {BTimer1 [0]=2;//управляем таймером + }else + { + BTimer1 [0]=3;//управляем кнопками + } + if(weekTimer2 [tweekday-1]==1) + {BTimer2 [0]=2;//управляем таймером + }else + { + BTimer2 [0]=3;//управляем кнопками + } + if(weekTimer3 [tweekday-1]==1) + {BTimer3 [0]=2;//управляем таймером + }else + { + BTimer3 [0]=3;//управляем кнопками + } + Serial.print("BTimer1 [0]:"); + Serial.println(BTimer1 [0]); + Serial.print("BTimer2 [0]:"); + Serial.println(BTimer2 [0]); + Serial.print("BTimer3 [0]:"); + Serial.println(BTimer3 [0]); + //****************************************************************************************** + if (timerout.startsWith("{\"id\":\"tout"))//парсим timerout= {"id":"tout","t1":"100","t2":"010","t3":"001"} подкл таймеров по выходов + {//tuot=0; + int timer=0;//номер таймера + // Serial.println("timerout"); + // Serial.println(timerout.length()); + for (int i = 0; i < timerout.length() ; i++) {//перебираем строку данных + if (timerout[i]==':') + {timer++; + if (timer==2)//данные таймера1 идут после вторых двоеточий + {i=i+2; + for (int j = 0; j < 3 ; j++){ + gpioTimer1[j]=int(timerout[i+j] - '0');//пребразуем строку "011" в массив чисел gpioTimer1 [3]={1,0,0}; + } + } + if (timer==3) + {i=i+2; + for (int j = 0; j < 3 ; j++){ + gpioTimer2[j]=int(timerout[i+j] - '0');//пребразуем строку "011" в массив чисел gpioTimer2 [3]={1,1,0}; + } + } + if (timer==4) + {i=i+2; + for (int j = 0; j < 3 ; j++){ + gpioTimer3[j]=int(timerout[i+j] - '0');//пребразуем строку "011" в массив чисел gpioTimer3 [3]={1,1,0}; + } + Serial.println(""); + Serial.print("gpioTimer1"); + for(int a = 0; a < 3; a++) + { Serial.print(gpioTimer1[a]); + } + Serial.println(""); + } + } + } + } + current_time = hour1 * 60 + min1;//настройка выходов в соот с таймерами + for (int i = 0; i <= 1439; i++) { + if (current_time > 1439) current_time = 0; + state1 = main_log(BTimer1, state1); + state2 = main_log(BTimer2, state2); + state3 = main_log(BTimer3, state3); + current_time++; + } + btime(); +} diff --git a/WebSocket3Aqva/web.ino b/WebSocket3Aqva/web.ino new file mode 100644 index 0000000..4f939ae --- /dev/null +++ b/WebSocket3Aqva/web.ino @@ -0,0 +1,69 @@ +// Correct led start state. Changed all new led bits to prefix new... +void handleRoot(AsyncWebServerRequest *request) { + +request->send(200, "text/html", R"HTML( + + + + + +

ESP32 Websocket Example - Client to Server

+

With LED status update.

+ +

LED Status:

+ +

LED Status:

+

Count:0:00

+

Count:0:00

+

+
+ + + + +)HTML"); +} // END OF void handleRoot(AsyncWebServerRequest *request) diff --git a/WebSocket3Aqva/wrpin.ino b/WebSocket3Aqva/wrpin.ino new file mode 100644 index 0000000..9b9998f --- /dev/null +++ b/WebSocket3Aqva/wrpin.ino @@ -0,0 +1,6 @@ +void writepin() +{delay(50); + digitalWrite(5, HIGH); +delay(10); + digitalWrite(5, LOW); +} diff --git a/esp327nrfSDWDT3/JSstring.ino b/esp327nrfSDWDT3/JSstring.ino new file mode 100644 index 0000000..4250f0b --- /dev/null +++ b/esp327nrfSDWDT3/JSstring.ino @@ -0,0 +1,129 @@ +void JSstringU() +{ + board["id"] = incomingReadings.id; + +if(flread==0) +{ + board["temperature"] =ts; +// t1 = incomingReadings.temp; + board["humidity"] =hs; + board["tim2"] = tim2; + flread=1; +} + else + {board["temperature"] =incomingReadings.temp; +// t1 = incomingReadings.temp; + board["humidity"] =incomingReadings.hum; + if(min1<10) + { + board["tim2"] = String(hour1)+":0"+String(min1); + } + else + { + board["tim2"] =String(hour1)+":"+String(min1); + } + } + + + board["tim3"] = tim3; + board["dataserv"] = dataserv; + board["timeserv"] = timeserv; + board["munthserv"] = munthserv; + board["weekserv"] = weekserv; + board["timev"] = timev; + + // jsonString = JSON.stringify(board); + jsonString = JSON.stringify(board);//{"id":2,"temperature":9.6733450317382812,"humidity":50.41815185546875,"tim2":"12:02","dataserv":"12","timeserv":"15:30","munthserv":"январь",weekserv:"среда"} + // events.send(jsonString.c_str(), "new_readings", millis());//обновление веба текущая температура + Serial.println (jsonString); + + if(wright>360)//запись на sd каждые 30 минут 60*30/5 каждый тик 5сек +{String String2=jsonString2+"\n"; +//appendFile(SD, "/thkom.txt", String2.c_str());//добавление на инфы в файл + writeFile(SD, "/thkom1.txt", jsonString2.c_str());//записываем в этот файл последние данные для счит после сброса + writeFile(SD, "/thku1.txt", jsonString.c_str());//записываем в этот файл последние данные NOW для счит после сброса + +//wright=0; +} +} + + +void JSstringK() +{ board2["tkom1"] = tkom1; + board2["hkom1"] = hkom1; + board2["batkom1"] = batkom1; + board2["timekom1"] = timekom1; + board2["tkom2"] = tkom2; + board2["hkom2"] = hkom2; + board2["batkom2"] = batkom2; + board2["timekom2"] = timekom2; + board2["tkor"] = tkor; + board2["hkor"] = hkor; + board2["batkor"] = batkor; + board2["timekor"] = timekor; + board2["tbal"] = tbal; + board2["hbal"] = hbal; + board2["batbal"] = batbal; + board2["timebal"] = timebal; + board2["tul1"] = tul1; + board2["hul1"] = hul1; + board2["osv1"] = osv1; + board2["timeul1"] = timeul1; +jsonString2 = JSON.stringify(board2); + Serial.println (jsonString2); +//"new_datatemp" +//events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление веба +// writeFile(SD, "/thkom.txt", jsonString2.c_str()); + + + + + + + + + + + + + + + +if(wright>360)//запись на sd каждые 30 минут 60*30/5 каждый тик 5сек +{esp_task_wdt_reset();//reset WDT + board["temperature"] =incomingReadings.temp; +// t1 = incomingReadings.temp; + board["humidity"] =incomingReadings.hum; + if(min1<10) + { + board["tim2"] = String(hour1)+":0"+String(min1); + } + else + { + board["tim2"] =String(hour1)+":"+String(min1); + } + + + + board["tim3"] = tim3; + board["dataserv"] = dataserv; + board["timeserv"] = timeserv; + board["munthserv"] = munthserv; + board["weekserv"] = weekserv; + board["timev"] = timev; + + // jsonString = JSON.stringify(board); + jsonString = JSON.stringify(board); + + + + + String String2=jsonString2+"\n"; + esp_task_wdt_reset();//reset WDT +//appendFile(SD, "/thkom.txt", String2.c_str());//добавление на инфы в файл + writeFile(SD, "/thkom1.txt", jsonString2.c_str());//записываем в этот файл последние данные для счит после сброса + writeFile(SD, "/thku1.txt", jsonString.c_str());//записываем в этот файл последние данные NOW для счит после сброса + ESP.restart(); +wright=0; +} +} diff --git a/esp327nrfSDWDT3/SD.ino b/esp327nrfSDWDT3/SD.ino new file mode 100644 index 0000000..8a5bc0b --- /dev/null +++ b/esp327nrfSDWDT3/SD.ino @@ -0,0 +1,183 @@ +void sdlist() +{ + //listDir(SD, "/", 0); + //listDir(SD, "/", 0); + //delay(100); +// createDir(SD, "/mydir");//создать директорию (папку) +// delay(100); +// listDir(SD, "/", 0); +// delay(100); +// removeDir(SD, "/mydir"); + //delay(100); +// listDir(SD, "/", 2); +// delay(100); +// writeFile(SD, "/hello.txt", "Hello "); +// delay(100); +// appendFile(SD, "/hello.txt", "World!\n"); +// delay(100); +// readFile(SD, "/hello.txt"); + // deleteFile(SD, "/foo.txt"); +// renameFile(SD, "/hello.txt", "/foo.txt"); + // readFile(SD, "/foo.txt"); +// testFileIO(SD, "/test.txt"); + // Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024)); + // Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024)); +} + + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ + Serial.printf("Listing directory: %s\n", dirname); + + File root = fs.open(dirname); + if(!root){ + Serial.println("Failed to open directory"); + return; + } + if(!root.isDirectory()){ + Serial.println("Not a directory"); + return; + } + + File file = root.openNextFile(); + while(file){ + if(file.isDirectory()){ + Serial.print(" DIR : "); + Serial.println(file.name()); + if(levels){ + listDir(fs, file.name(), levels -1); + } + } else { + Serial.print(" FILE: "); + Serial.print(file.name()); + Serial.print(" SIZE: "); + Serial.println(file.size()); + } + file = root.openNextFile(); + } +} + +void createDir(fs::FS &fs, const char * path){ + // Serial.printf("Creating Dir: %s\n", path); + if(fs.mkdir(path)){ + Serial.println("Dir created"); + } else { + Serial.println("no dir"); + } +} + +void removeDir(fs::FS &fs, const char * path){ + Serial.printf("Removing Dir: %s\n", path); + if(fs.rmdir(path)){ + Serial.println("Dir removed"); + } else { + Serial.println("rmdir failed"); + } +} + +void readFile(fs::FS &fs, const char * path){ + Serial.printf("Reading file: %s\n", path); + + File file = fs.open(path); + if(!file){ + Serial.println("Failed to open file for reading"); + return; + } + + Serial.print("Read from file: "); + while(file.available()){ + Serial.write(file.read()); + } + file.close(); +} + +void writeFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Writing file: %s\n", path); + + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + if(file.print(message)){ + Serial.println("File written"); + } else { + Serial.println("Write failed"); + } + file.close(); +} + +void appendFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Appending to file: %s\n", path); + + File file = fs.open(path, FILE_APPEND); + if(!file){ + Serial.println("Failed to open file for appending"); + return; + } + if(file.print(message)){ + Serial.println("Message appended"); + } else { + Serial.println("Append failed"); + } + file.close(); +} + +void renameFile(fs::FS &fs, const char * path1, const char * path2){ + Serial.printf("Renaming file %s to %s\n", path1, path2); + if (fs.rename(path1, path2)) { + Serial.println("File renamed"); + } else { + Serial.println("Rename failed"); + } +} + +void deleteFile(fs::FS &fs, const char * path){ + Serial.printf("Deleting file: %s\n", path); + if(fs.remove(path)){ + Serial.println("File deleted"); + } else { + Serial.println("Delete failed"); + } +} + +void testFileIO(fs::FS &fs, const char * path){ + File file = fs.open(path); + static uint8_t buf[512]; + size_t len = 0; + uint32_t start = millis(); + uint32_t end = start; + if(file){ + len = file.size(); + size_t flen = len; + start = millis(); + while(len){ + size_t toRead = len; + if(toRead > 512){ + toRead = 512; + } + file.read(buf, toRead); + len -= toRead; + } + end = millis() - start; + Serial.printf("%u bytes read for %u ms\n", flen, end); + file.close(); + } else { + Serial.println("Failed to open file for reading"); + } + + + file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + + size_t i; + start = millis(); + for(i=0; i<2048; i++){ + file.write(buf, 512); + } + end = millis() - start; + Serial.printf("%u bytes written for %u ms\n", 2048 * 512, end); + file.close(); +} diff --git a/esp327nrfSDWDT3/SDDat.ino b/esp327nrfSDWDT3/SDDat.ino new file mode 100644 index 0000000..ced373f --- /dev/null +++ b/esp327nrfSDWDT3/SDDat.ino @@ -0,0 +1,117 @@ +void savedata() +{ + +JSONVar boardat; +if(min1<10) +{boardat["Time"] = String(hour1)+":0"+String(min1); +} +else +{ + boardat["Time"] = String(hour1)+":"+String(min1); +} +boardat["temperatura"] =String(t1)+" C"; +boardat["humidity"] = String(h1)+" %"; +tempdat = JSON.stringify(boardat); + Serial.println (tempdat); + esp_task_wdt_reset();//reset WDT +//JSON { "Time":"11:03", "temperatura":"10.56 C", "humidity":"7,56 %" }, +tempdat=tempdat+"\n"; + +//myFile = SD.open("/07.txt",FILE_WRITE); + // myFile = SD.open("/TEMPUL/28.txt", FILE_APPEND);//открываем файл в режиме добавления данных + // myFile = SD.open("/TEMPUL/2022/FEB/27.txt", FILE_APPEND);//открываем файл в режиме добавления данных + +// Serial.println ("open07"); +// myFile.print(tempdat+"\n"); +// myFile.close(); + //Serial.println (stamp.year); +//************************************************************************************************************************************************************************************************************************************ + Serial.println ("name2"); +// String name1="/TEMPUL"+ stryen[stamp.year-2014]+strmen[stamp.month-1]+strden[stamp.day-1]; +// Serial.println (name2); +createDir(SD, "/TEMPUL"); +String name1="/TEMPUL"+ String(stryen[stamp.year-2014]);//2022 + char Buf[50]; + name1.toCharArray(Buf, 50); + Serial.println (Buf); +createDir(SD, Buf); + name1=name1+String(strmen[stamp.month-1]);//FEB + name1.toCharArray(Buf, 50); + Serial.println (Buf); + createDir(SD, Buf); + name1=name1+String(strden[stamp.day-1]);//27 + name1.toCharArray(Buf, 50); + Serial.println (Buf); + createDir(SD, Buf); + + name1=name1+String(strdaten[0]);// + name1.toCharArray(Buf, 50); +//createDir(SD, "/TEMPUL/2022/FEB/27"); +// name1="/TEMPUL"+ String(stryen[stamp.year-2014])+String(strmen[stamp.month-1])+String(strden[stamp.day-1])+String(strdaten[0]); + Serial.println (Buf); +appendFile(SD,Buf,tempdat.c_str());//добавление на инфы в файл + +/* +//test = strcat(name1,name2); +String name1=strcat("/TEMPUL", stryen[stamp.year-2014]); +String name2=strcat(strmen[stamp.month-1], strd[stamp.day-1]); + +//+strm[stamp.month-1]+strd[stamp.day-1]; + + String name1="/TEMPUL"+ stry[stamp.year-2014]+strm[stamp.month-1]+strd[stamp.day-1]; + Serial.println (name2); +char Buf[50]; + name1.toCharArray(Buf, 50); +createDir(SD, Buf); + +name1=name1+ name2+strdaten[0]; + Serial.println (name1); +name1.toCharArray(Buf, 50); +*/ + +//**************************************************** +} + + + +void readdata() +{ + //**************************************************** +String name1="/TEMPUL"+ String(stryen[stamp.year-2014])+String(strmen[stamp.month-1])+String(strden[stamp.day-1])+String(strdaten[nti]); + char Buf[50]; +name1.toCharArray(Buf, 50); + + myFile = SD.open(Buf, FILE_READ); + while(myFile.available()) { + Serial.write(myFile.read()); + } + Serial.println(" "); + // Узнаем размер файла: + Serial.print("File size: "); + // "Размер файла: " + Serial.println(myFile.size()); + myFile.close(); + +strdat=""; + + Serial.println("/TEMPUL/D-2022/FEBR/27/T1.txt"); + myFile = SD.open(Buf, FILE_READ); + while(myFile.available()) { + strdat+=char(myFile.read()); + } + myFile.close(); + + esp_task_wdt_reset();//reset WDT + + + board1["tdata"] = strdat; + board1["dataserv"] = dataserv; + board1["timeserv"] = timeserv; +jsonString1 = JSON.stringify(board1); + // Serial.println (jsonString1); + // Serial.println ("strdat="); + //Serial.println (strdat); + + // events.send(tempdat.c_str(), "readings", millis());//обновление веба + // events.send(strdat.c_str(), "readings", millis());//обновление веба +} diff --git a/esp327nrfSDWDT3/SDKom.ino b/esp327nrfSDWDT3/SDKom.ino new file mode 100644 index 0000000..f7d3b67 --- /dev/null +++ b/esp327nrfSDWDT3/SDKom.ino @@ -0,0 +1,207 @@ +void savebalk() +{ +boolean q=0; + if((hb==hour1)&&( mb==min1)){q=1;} + hb=hour1; + mb=min1; + if(q==0) + { +JSONVar boardat; +if(min1<10) +{boardat["Time"] = String(hour1)+":0"+String(min1); +} +else +{ + boardat["Time"] = String(hour1)+":"+String(min1); +} +boardat["temperatura"] =String(tbal)+" C"; +boardat["humidity"] = String(hbal)+" %"; +tempdat = JSON.stringify(boardat); + Serial.println (tempdat); + esp_task_wdt_reset();//reset WDT +//JSON { "Time":"11:03", "temperatura":"10.56 C", "humidity":"7,56 %" }, +tempdat=tempdat+"\n"; + + Serial.println ("name2"); +// String name1="/TEMPUL"+ stryen[stamp.year-2014]+strmen[stamp.month-1]+strden[stamp.day-1]; +// Serial.println (name2); +createDir(SD, "/TEMPUL"); +String name1="/TEMPUL"+ String(stryen[stamp.year-2014]);//2022 + char Buf[50]; + name1.toCharArray(Buf, 50); + Serial.println (Buf); +createDir(SD, Buf); + name1=name1+String(strmen[stamp.month-1]);//FEB + name1.toCharArray(Buf, 50); + Serial.println (Buf); + createDir(SD, Buf); + name1=name1+String(strden[stamp.day-1]);//27 + name1.toCharArray(Buf, 50); + Serial.println (Buf); + createDir(SD, Buf); + + name1=name1+String(strdaten[2]);// + name1.toCharArray(Buf, 50); +//createDir(SD, "/TEMPUL/2022/FEB/27"); +// name1="/TEMPUL"+ String(stryen[stamp.year-2014])+String(strmen[stamp.month-1])+String(strden[stamp.day-1])+String(strdaten[0]); + Serial.println (Buf); +appendFile(SD,Buf,tempdat.c_str());//добавление на инфы в файл + } +} +//*************************K2***************************************************************** + + +void savek2() +{ + +JSONVar boardat; +if(min1<10) +{boardat["Time"] = String(hour1)+":0"+String(min1); +} +else +{ + boardat["Time"] = String(hour1)+":"+String(min1); +} +boardat["temperatura"] =String(tkom2)+" C"; +boardat["humidity"] = String(hkom2)+" %"; +tempdat = JSON.stringify(boardat); + Serial.println (tempdat); + esp_task_wdt_reset();//reset WDT +//JSON { "Time":"11:03", "temperatura":"10.56 C", "humidity":"7,56 %" }, +tempdat=tempdat+"\n"; + + Serial.println ("name2"); +// String name1="/TEMPUL"+ stryen[stamp.year-2014]+strmen[stamp.month-1]+strden[stamp.day-1]; +// Serial.println (name2); +createDir(SD, "/TEMPUL"); +String name1="/TEMPUL"+ String(stryen[stamp.year-2014]);//2022 + char Buf[50]; + name1.toCharArray(Buf, 50); + Serial.println (Buf); +createDir(SD, Buf); + name1=name1+String(strmen[stamp.month-1]);//FEB + name1.toCharArray(Buf, 50); + Serial.println (Buf); + createDir(SD, Buf); + name1=name1+String(strden[stamp.day-1]);//27 + name1.toCharArray(Buf, 50); + Serial.println (Buf); + createDir(SD, Buf); + + name1=name1+String(strdaten[3]);// + name1.toCharArray(Buf, 50); +//createDir(SD, "/TEMPUL/2022/FEB/27"); +// name1="/TEMPUL"+ String(stryen[stamp.year-2014])+String(strmen[stamp.month-1])+String(strden[stamp.day-1])+String(strdaten[0]); + Serial.println (Buf); +appendFile(SD,Buf,tempdat.c_str());//добавление на инфы в файл + +} + +//**************************K1**************************************************************** + + +void savek1() +{ + boolean q=0; + if((hk==hour1)&&( mk==min1)){q=1;} + hk=hour1; + mk=min1; + if(q==0) + { +JSONVar boardat; +if(min1<10) +{boardat["Time"] = String(hour1)+":0"+String(min1); +} +else +{ + boardat["Time"] = String(hour1)+":"+String(min1); +} +boardat["temperatura"] =String(tkom1)+" C"; +boardat["humidity"] = String(hkom1)+" %"; +tempdat = JSON.stringify(boardat); + Serial.println (tempdat); + esp_task_wdt_reset();//reset WDT +//JSON { "Time":"11:03", "temperatura":"10.56 C", "humidity":"7,56 %" }, +tempdat=tempdat+"\n"; + + Serial.println ("name2"); +// String name1="/TEMPUL"+ stryen[stamp.year-2014]+strmen[stamp.month-1]+strden[stamp.day-1]; +// Serial.println (name2); +createDir(SD, "/TEMPUL"); +String name1="/TEMPUL"+ String(stryen[stamp.year-2014]);//2022 + char Buf[50]; + name1.toCharArray(Buf, 50); + Serial.println (Buf); +createDir(SD, Buf); + name1=name1+String(strmen[stamp.month-1]);//FEB + name1.toCharArray(Buf, 50); + Serial.println (Buf); + createDir(SD, Buf); + name1=name1+String(strden[stamp.day-1]);//27 + name1.toCharArray(Buf, 50); + Serial.println (Buf); + createDir(SD, Buf); + + name1=name1+String(strdaten[4]);// + name1.toCharArray(Buf, 50); +//createDir(SD, "/TEMPUL/2022/FEB/27"); +// name1="/TEMPUL"+ String(stryen[stamp.year-2014])+String(strmen[stamp.month-1])+String(strden[stamp.day-1])+String(strdaten[0]); + Serial.println (Buf); +appendFile(SD,Buf,tempdat.c_str());//добавление на инфы в файл + } +} + + +//*********************kor********************************************************************* + + +void savekor() +{ + boolean q=0; + if((hkr==hour1)&&( mkr==min1)){q=1;} + hkr=hour1; + mkr=min1; + if(q==0) + { +JSONVar boardat; +if(min1<10) +{boardat["Time"] = String(hour1)+":0"+String(min1); +} +else +{ + boardat["Time"] = String(hour1)+":"+String(min1); +} +boardat["temperatura"] =String(tkor)+" C"; +boardat["humidity"] = String(hkor)+" %"; +tempdat = JSON.stringify(boardat); + Serial.println (tempdat); + esp_task_wdt_reset();//reset WDT +//JSON { "Time":"11:03", "temperatura":"10.56 C", "humidity":"7,56 %" }, +tempdat=tempdat+"\n"; + + Serial.println ("name2"); +// String name1="/TEMPUL"+ stryen[stamp.year-2014]+strmen[stamp.month-1]+strden[stamp.day-1]; +// Serial.println (name2); +createDir(SD, "/TEMPUL"); +String name1="/TEMPUL"+ String(stryen[stamp.year-2014]);//2022 + char Buf[50]; + name1.toCharArray(Buf, 50); + Serial.println (Buf); +createDir(SD, Buf); + name1=name1+String(strmen[stamp.month-1]);//FEB + name1.toCharArray(Buf, 50); + Serial.println (Buf); + createDir(SD, Buf); + name1=name1+String(strden[stamp.day-1]);//27 + name1.toCharArray(Buf, 50); + Serial.println (Buf); + createDir(SD, Buf); + + name1=name1+String(strdaten[5]);// + name1.toCharArray(Buf, 50); +//createDir(SD, "/TEMPUL/2022/FEB/27"); +// name1="/TEMPUL"+ String(stryen[stamp.year-2014])+String(strmen[stamp.month-1])+String(strden[stamp.day-1])+String(strdaten[0]); + Serial.println (Buf); +appendFile(SD,Buf,tempdat.c_str());//добавление на инфы в файл + } +} diff --git a/esp327nrfSDWDT3/SDUL1.ino b/esp327nrfSDWDT3/SDUL1.ino new file mode 100644 index 0000000..7e887e5 --- /dev/null +++ b/esp327nrfSDWDT3/SDUL1.ino @@ -0,0 +1,94 @@ +void saveul() +{ +nt=0;//сброс номера температ датчика + + +int q=0; +if((hour1<1)&&(min1<20))timev=0;//до 00:20 сброс timev-врмя записи на флеш улица восто приходят каждые 3 мин а зап каждые 20 мин + + if(timev+20 + + + + + #da532c + + + diff --git a/esp327nrfSDWDT3/data/imajes/favicon-16x16.png b/esp327nrfSDWDT3/data/imajes/favicon-16x16.png new file mode 100644 index 0000000..c3ed26b Binary files /dev/null and b/esp327nrfSDWDT3/data/imajes/favicon-16x16.png differ diff --git a/esp327nrfSDWDT3/data/imajes/favicon-32x32.png b/esp327nrfSDWDT3/data/imajes/favicon-32x32.png new file mode 100644 index 0000000..7c5b0a2 Binary files /dev/null and b/esp327nrfSDWDT3/data/imajes/favicon-32x32.png differ diff --git a/esp327nrfSDWDT3/data/imajes/favicon.ico b/esp327nrfSDWDT3/data/imajes/favicon.ico new file mode 100644 index 0000000..06e0e94 Binary files /dev/null and b/esp327nrfSDWDT3/data/imajes/favicon.ico differ diff --git a/esp327nrfSDWDT3/data/imajes/mstile-150x150.png b/esp327nrfSDWDT3/data/imajes/mstile-150x150.png new file mode 100644 index 0000000..3c8550b Binary files /dev/null and b/esp327nrfSDWDT3/data/imajes/mstile-150x150.png differ diff --git a/esp327nrfSDWDT3/data/imajes/off.png b/esp327nrfSDWDT3/data/imajes/off.png new file mode 100644 index 0000000..c882653 Binary files /dev/null and b/esp327nrfSDWDT3/data/imajes/off.png differ diff --git a/esp327nrfSDWDT3/data/imajes/on.png b/esp327nrfSDWDT3/data/imajes/on.png new file mode 100644 index 0000000..0fbaf72 Binary files /dev/null and b/esp327nrfSDWDT3/data/imajes/on.png differ diff --git a/esp327nrfSDWDT3/data/imajes/safari-pinned-tab.svg b/esp327nrfSDWDT3/data/imajes/safari-pinned-tab.svg new file mode 100644 index 0000000..1751ec1 --- /dev/null +++ b/esp327nrfSDWDT3/data/imajes/safari-pinned-tab.svg @@ -0,0 +1,85 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + diff --git a/esp327nrfSDWDT3/data/imajes/site.webmanifest b/esp327nrfSDWDT3/data/imajes/site.webmanifest new file mode 100644 index 0000000..b20abb7 --- /dev/null +++ b/esp327nrfSDWDT3/data/imajes/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/esp327nrfSDWDT3/data/index.html b/esp327nrfSDWDT3/data/index.html new file mode 100644 index 0000000..12f705b --- /dev/null +++ b/esp327nrfSDWDT3/data/index.html @@ -0,0 +1,239 @@ + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + + + + + + + +
+

Улица(восток)

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+

Улица(запад)

+ +
+
+

TEMPERATURE

°C

Time

+
+
+

HUMIDITY

%

Time

+
+
+

Комната1

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+ +

Комната2

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

Коридор

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

Балкон

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+

Кухня

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+ +

+ +
+ Время работы сервера: + 0:00 +
+ + +
+

+

+

+
+ +
+ + + + + +
+ + + + + + \ No newline at end of file diff --git a/esp327nrfSDWDT3/data/inform.html b/esp327nrfSDWDT3/data/inform.html new file mode 100644 index 0000000..c06421e --- /dev/null +++ b/esp327nrfSDWDT3/data/inform.html @@ -0,0 +1,161 @@ + + + + +Информация + + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Улица(запад)

+
+
+

TEMPERATURE

°C

Time

+
+
+

HUMIDITY

%

Time

+
+
+
................................................... +
+
+ таблица температуры за сутки +
+ +
+ + + + + + + + + + + + +
  Time  temperatura  humidity
+
+ +
+

+
+
+ + + + \ No newline at end of file diff --git a/esp327nrfSDWDT3/data/inform1.html b/esp327nrfSDWDT3/data/inform1.html new file mode 100644 index 0000000..2437258 --- /dev/null +++ b/esp327nrfSDWDT3/data/inform1.html @@ -0,0 +1,162 @@ + + + + +Информация + + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Улица(восток)

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+
................................................... +
+
+ таблица температуры за сутки +
+ +
+ + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+
+ + + + + \ No newline at end of file diff --git a/esp327nrfSDWDT3/data/inform2.html b/esp327nrfSDWDT3/data/inform2.html new file mode 100644 index 0000000..bb0f0f2 --- /dev/null +++ b/esp327nrfSDWDT3/data/inform2.html @@ -0,0 +1,160 @@ + + + + +Информация + + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Комната1

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+
................................................... +
+
+ таблица температуры за сутки +
+ +
+ + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+ +
+ + + \ No newline at end of file diff --git a/esp327nrfSDWDT3/data/inform3.html b/esp327nrfSDWDT3/data/inform3.html new file mode 100644 index 0000000..2249f57 --- /dev/null +++ b/esp327nrfSDWDT3/data/inform3.html @@ -0,0 +1,161 @@ + + + + +Информация + + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Комната2

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+
................................................... +
+
+ таблица температуры за сутки +
+ +
+ + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+
+ + + + \ No newline at end of file diff --git a/esp327nrfSDWDT3/data/inform4.html b/esp327nrfSDWDT3/data/inform4.html new file mode 100644 index 0000000..3ec5c00 --- /dev/null +++ b/esp327nrfSDWDT3/data/inform4.html @@ -0,0 +1,162 @@ + + + + +Информация + + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Коридор

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+
................................................... +
+
+ таблица температуры за сутки +
+ +
+ + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+
+ + + + + \ No newline at end of file diff --git a/esp327nrfSDWDT3/data/inform5.html b/esp327nrfSDWDT3/data/inform5.html new file mode 100644 index 0000000..594ea9a --- /dev/null +++ b/esp327nrfSDWDT3/data/inform5.html @@ -0,0 +1,162 @@ + + + + +Информация + + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Балкон

+
+
+

TEMPERATURE

°C

Battery

+
+
+

HUMIDITY

%

Time

+
+
+
................................................... +
+
+ таблица температуры за сутки +
+ +
+ + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+
+ + + + + \ No newline at end of file diff --git a/esp327nrfSDWDT3/data/inform6.html b/esp327nrfSDWDT3/data/inform6.html new file mode 100644 index 0000000..acd6c10 --- /dev/null +++ b/esp327nrfSDWDT3/data/inform6.html @@ -0,0 +1,161 @@ + + + + +Информация + + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Кухня

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+
................................................... +
+
+ таблица температуры за сутки +
+ +
+ + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+ +
+ + + \ No newline at end of file diff --git a/esp327nrfSDWDT3/data/inform7.html b/esp327nrfSDWDT3/data/inform7.html new file mode 100644 index 0000000..6bb151b --- /dev/null +++ b/esp327nrfSDWDT3/data/inform7.html @@ -0,0 +1,161 @@ + + + + +Информация + + + + + + + + + + + + +
+ +
+

ESP-Домашний сервер

+
+ + + +
+ +
+

Улица(восток)

+
+
+

TEMPERATURE

°C

Light

+
+
+

HUMIDITY

%

Time

+
+
+
................................................... +
+
+ таблица температуры за сутки +
+ +
+ + + + + + + + + + + + +
  Time  temperatura  humidity
+
+
+

+
+
+ + + + \ No newline at end of file diff --git a/esp327nrfSDWDT3/data/mstile-150x150.png b/esp327nrfSDWDT3/data/mstile-150x150.png new file mode 100644 index 0000000..3c8550b Binary files /dev/null and b/esp327nrfSDWDT3/data/mstile-150x150.png differ diff --git a/esp327nrfSDWDT3/data/off.png b/esp327nrfSDWDT3/data/off.png new file mode 100644 index 0000000..c882653 Binary files /dev/null and b/esp327nrfSDWDT3/data/off.png differ diff --git a/esp327nrfSDWDT3/data/on.png b/esp327nrfSDWDT3/data/on.png new file mode 100644 index 0000000..0fbaf72 Binary files /dev/null and b/esp327nrfSDWDT3/data/on.png differ diff --git a/esp327nrfSDWDT3/data/setting.html b/esp327nrfSDWDT3/data/setting.html new file mode 100644 index 0000000..f32f978 --- /dev/null +++ b/esp327nrfSDWDT3/data/setting.html @@ -0,0 +1,58 @@ + + + + +Настройка + + + + + + + + + + + +

ESP32 управляет освещением комнаты

+ + + + + + + + + + diff --git a/esp327nrfSDWDT3/data/style.css b/esp327nrfSDWDT3/data/style.css new file mode 100644 index 0000000..4f10865 --- /dev/null +++ b/esp327nrfSDWDT3/data/style.css @@ -0,0 +1,205 @@ +@charset "utf-8"; + + html {font-family: Arial; display: inline-block; text-align: center;} +body { + background-color: #C7CACC; + color: #FFFFFF; + font-family: Arial, sans-serif; + font-size: 14px; + width: 100%; + margin-top: 5px; + background-image: url(fon.jpg); +} + a{ + color: #FFFFFF; + } + a:visited { + color: #FFFFFF; /* Цвет посещенных ссылок */ + text-decoration: none; + } + a:active { + color: #A7F095; /* Цвет активных ссылок */ + } + a:hover { + color: #AFDAF4; /* Цвет ссылок при наведении мыши*/ + } + +#header { + background: #F5DEB3; + width: 100%; +} + +#container { + background-color: #FFFFFF; + margin-right: auto; + margin-left: auto; + margin-bottom: auto; + text-align: center; + width: 80%; + height: 84px; + margin-top: 7px; + padding-top: 1px; +} + +#nav + { + background-color: #2F4468; + width: 100%; + color: #FFFFFF; + font-size: small; + margin-left: -18px; + margin-top: -3px; +} + +#sidebar { + background-color: #8CA2AF; + float: left; + width: 20%; + position: static; + margin-top: -1px; + height: 358px; + min-width: 0px; +} + +#content { + background-color: #F8E6C1; + float: right; + width: 80%; + color: #14437A; + margin-top: -2px; + opacity: 0.91; +} + +#clear { + clear: both; +} + +#footer { + background: #00BFFF; + width: 100%; + height: 40px; +} + + .topnav { + overflow: hidden; + background-color: #2f4468; + color: white; + font-size: 1.7rem; + height: 65px; + line-height: 3px; + +} +.top{ + overflow: hidden; + background-color: #8CA2AF; + color: white; + width: 100%; + +} + + .card.temperature { color: #fd7e14; } + .card.humidity { color: #1b78e2; } + + + .card { + background-color: #F9F9F7; + box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); +} + .cards { + max-width: 901px; + margin: 0 auto; + display: grid; + grid-gap: 2rem; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + min-height: 133px; +} + .reading { + font-size: 2.8rem; + +} + + + #navigation a { + font-size: small; + color: #3E73A7; + float: left; + border-top-width: thick; + padding-left: 20px; +} + + .times{ + font-size: xx-large; + margin-top: -50px; + background-color: #2F4468; + color: #FFFFFF; + height: 57px; + line-height: 56px; + } + .manth{ + color: #02087C; + margin-top: 0px; + background-color: #EF7320; + height: 2pc; + font-size: large; + padding-top: 2px; + opacity: 1; + line-height: 3%; + } +.servertime { + margin-top: 37px; +} +.data{ + color: #2F4468; + background-color: #FFFFFF; + margin-top: -93px; + height: 146px; + font-size: 92px; + line-height: 97px; +} +.week{ + color: #000006; + margin-top: -91px; + background-color: #EF7320; + height: 2pc; + font-size: large; + line-height: 30px; + +} +.levnav{ + font-size: large; + color: #FFFFFF; + margin-top: 5px; + margin-left: 25px; + line-height: 11px; + margin-right: 31px; + text-decoration: none; + text-align: left; + +} +#containerinf { + background-color: #B59D69; + margin-right: auto; + margin-left: auto; + margin-bottom: auto; + text-align: center; + width: 80%; + height: 84px; + margin-top: 7px; + padding-top: 1px; + opacity: 1; +} +#contentinfo { + background-color: #ECD9B1; + width: 100%; + color: #14437A; + margin-top: -2px; + opacity: 0.83; +} +#tablinfo{ + background-color: #ECD9B1; + width: 35%; + color: #14437A; + margin-top: 11px; + opacity: 0.83; + margin-left: 288px; +} diff --git a/esp327nrfSDWDT3/data/upravlenie.html b/esp327nrfSDWDT3/data/upravlenie.html new file mode 100644 index 0000000..e73d416 --- /dev/null +++ b/esp327nrfSDWDT3/data/upravlenie.html @@ -0,0 +1,122 @@ + + + + + ESP-NOW DASHBOARD + + + + + + + + + + + + +
+

ESP-Домашний сервер

%dataserv%

+ + + + +

%timeserv%

+ +
+ + + +
+
+
+

TEMPERATURE

°C

Time

+
+
+

HUMIDITY

%

Time

+
+
+
+ +
+ Время работы сервера: +
+ + +
+ +

+
+ + +
+ + + + + + diff --git a/esp327nrfSDWDT3/esp327nrfSDWDT3.ino b/esp327nrfSDWDT3/esp327nrfSDWDT3.ino new file mode 100644 index 0000000..2e4b98c --- /dev/null +++ b/esp327nrfSDWDT3/esp327nrfSDWDT3.ino @@ -0,0 +1,634 @@ +/* + ESP32 Receiver (ESP-NOW + Web Server) + Complete project details at https://RandomNerdTutorials.com/esp32-esp-now-wi-fi-web-server/ + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files. + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. +*/ +//08:3A:F2:A7:80:6C //esp32 желтые ноги +//08:3A:F2:66:31:30 //esp32 lilygo2,3 +//08:3A:F2: //esp32 lilygo4,7 +#define SD_MISO 12 +#define SD_MOSI 13 +#define SD_SCLK 14 +#define SD_CS 15 +#include +#define WDT_TIMEOUT 10 +#include +#include "ESPAsyncWebSrv.h" +#include +#include +#include +#include "FS.h" +#include "SD.h" +#include "SPI.h" +#include + +#include "NTPClient.h" +#include "WiFiUdp.h" +#include +UnixTime stamp(0); // указать GMT (3 для Москвы) +// Define deep sleep options +String dataMessage; +// Define NTP Client to get time +WiFiUDP ntpUDP; +NTPClient timeClient(ntpUDP); +#include "nRF24L01.h" +#include "RF24.h" +char msg[16]; +//RF24 radio(12, 14, 26, 25, 27); +//RF24 radio(27, 26, 32, 33, 25);//server (ce,csn,sck,miso,mosi)esp32 + +RF24 radio(17, 16, 32, 33, 25);//server (ce,csn,sck,miso,mosi)esp32 +const uint64_t pip = 0x02E423E4E2LL; +SPIClass sdSPI(HSPI); +File myFile; +String jsonString;//"{\"id\":2,\"temperature\":9.6733450317382812,\"humidity\":50.41815185546875,\"readingId\":\"2\"}"; +String jsonString1; +String jsonString2;//="{\"tkom1\":\"20.0\",\"hkom1\":\"30.0\",\"batkom1\":\"0.00\",\"timekom1\":\"00:00\",\"tkom2\":\"\",\"hkom2\":\"\",\"batkom2\":\"\",\"timekom2\":\"\",\"tkor\":\"\",\"hkor\":\"\",\"batkor\":\"\",\"timekor\":\"\",\"tbal\":\"\",\"hbal\":\"\",\"batbal\":\"\",\"timebal\":\"\"}" +; +// Replace with your network credentials (STATION) +const char* ssid = "VOVA-47"; +const char* password = "vovak26102003"; + + char *time_buf; + +const char* PARAM_INPUT_1 = "output"; +const char* PARAM_INPUT_2 = "state"; + +// Structure example to receive data +// Must match the sender structure +typedef struct struct_message { + int id=0; + float temp=0; + float hum=0; + unsigned int readingId=0; +} struct_message; + +struct_message incomingReadings; + +JSONVar board; +JSONVar board1; +JSONVar board2; + + + +AsyncWebServer server(80); +AsyncEventSource events("/events"); +//************************************************************************************************* +char* strd[] = {"01","02","03","04","05","06","07","08","09","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"}; + char* strm[] = {"январь","февраль","март","апрель","май","июнь","июль","август","сентябрь","октябрь","ноябрь","декабрь"}; + char* strweek[] = {"воскресенье","понедельник","вторник","среда","четверг","пятница","суббота","воскресенье"}; + int nt=0;//номер термометра + int nti=0;//номер термометра для сайта + int temperature1=10; + double ts; + double hs; +String t1; + String h1; + String t10;//время работы сервера + String tim3;// время от нтп сервера при приходе данных с NOW + String tim2;//время получ от устройства NOW + String munthserv;//месяц + String weekserv;//день недели + +String tkom1;//температура +String hkom1;//влажность +String batkom1; +String timekom1;//время прихода данных комната1 + +String tkom2; +String hkom2; +String batkom2; +String timekom2; + +String tkor; +String hkor; +String batkor; +String timekor; + +String tbal; +String hbal; +String batbal; +String timebal; + +String timeul1; +String tul1; +String hul1; +String osv1; +int ct1=0;//счетчик пропуска данные каждые 3 минуты записываем каждые 20 те 7 пропусков + + + int time17=0; +int hour1=10; +int min1=7; +int sek=0; +int hk=0;//часы для исключения повтора записи данных +int mk=0;//минуты +int hb=0;//часы для исключения повтора записи данных +int mb=0;//минуты +int hkr=0;//часы для исключения повтора записи данных +int mkr=0;//минуты +int timev=0;//для пропуска 20 минут +//String timev1;//для записи на флэш при сбросе + +boolean fdata=0;//флаг обновления данных темп и влажн +int fobnov=1;//флаг обновления данных темп и влажн +String timeserv;//время сервера +String dataserv;//дата +int v=0; +int v1=0; +long EpochTime=0; + int ind=0; + String strdat;//накопленые в памяти данные по темп и влажность передаваемые клиенту + String tempdat;// +int ftdata=0;//флаг запроса данных темп и влажн +int fping=0;// флаг для задержки отр данных на страницу inform +int wright=0; +bool flread=0; + char* strden[] = {"/01","/02","/03","/04","/05","/06","/07","/08","/09","/10","/11","/12","/13","/14","/15","/16","/17","/18","/19","/20","/21","/22","/23","/24","/25","/26","/27","/28","/29","/30","/31"}; + char* strmen[] = {"/JAN","/FEBR","/MARCH","/APRIL","/MAY","/JUNE","/JULY","/AUG","/SEPT","/OCT","/NOV","/DEC"}; + char* stryen[] = {"/2014","/2015","/2016","/2017","/D-2018","/D-2019","/D-2020","/D-2021","/D-2022","/D-2023","/D-2024","/D-2025","/D-2026","/D-2027","/D-2028","/D-2029","/D-2030","/D-2031","/D-2032","D-2033","/D-2034","/D-2035"}; + char* strdaten[] = {"/T1.txt","/T2.txt","/T3.txt","/T4.txt","/T5.txt","/T6.txt","/T7.txt","/T8.txt","/T9.txt","/T10.txt"}; +//************************************************************ +hw_timer_t * timer = NULL; +volatile SemaphoreHandle_t timerSemaphore; +portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; +volatile uint32_t isrCounter = 0; +volatile uint32_t lastIsrAt = 0; +//************************************************************************************************** +// ntp +String formattedDate; +String formattedTime; +String dayStamp; +String timeStamp; + + +//***************************************************************************** + +//**************************************************************************** +String outputState(int output){ + if(digitalRead(output)){ + return "checked"; + } + else { + return ""; + } +} + +String processor(const String& var){ + //Serial.println(var); + if(var == "BUTTONPLACEHOLDER1"){ + String buttons = ""; + // buttons += "

Output - GPIO 12

"; + buttons += "

Output - GPIO 13

"; + // buttons += "

Output - GPIO 14

"; + return buttons; + } + return String(); +} + /* if(var == "HOLDERT1"){ + String buttons = ""; + buttons +="

"+t1+" °C

"; + String hour11=String(hour1, DEC); + String min11=String(min1, DEC); + if(min1<10){min11="0"+min11;} + buttons +="

"+hour11+":"+min11+"

"; + return buttons; +} + if(var == "HOLDERH1"){ + String buttons = ""; + buttons +="

"+h1+" %

"; + String hour11=String(hour1, DEC); + String min11=String(min1, DEC); + if(min1<10){min11="0"+min11;} + buttons +="

"+hour11+":"+min11+"

"; + return buttons; +} +*/ + /*if(var == "HOLDER2"){ + String buttons = ""; + + buttons +="

"+t10+"

"; + return buttons; + +}*/ +//************************************************ + + +//*********************************************************** +void vrem(); +void handle_OnConnect(); +void ntp(); +void ntphome(); +void IRAM_ATTR onTimer(); + void event(); + void WiFisetup(); + void savedata(); + void JSstringU(); + void JSstringK(); + void Sdreaddata(); + void Nrfsetup(); + void nrf(); + void parsmsg(); + void settimer(); + void readdata(); + //void ansv(); +//*********************************************************** +void OnDataRecv(const uint8_t * mac_addr, const uint8_t *incomingData, int len) { + // Copies the sender mac address to a string + char macStr[18]; + Serial.print("Packet received from: "); + snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x", + mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + Serial.println(macStr); + memcpy(&incomingReadings, incomingData, sizeof(incomingReadings)); + + Serial.printf("Board ID %u: %u bytes\n", incomingReadings.id, len); + Serial.printf("t value: %4.2f \n", incomingReadings.temp); + t1 = incomingReadings.temp; + Serial.printf("h value: %4.2f \n", incomingReadings.hum); + h1=incomingReadings.hum; + Serial.printf("readingID value: %d \n", incomingReadings.readingId); + int tim11 =incomingReadings.readingId; + hour1=tim11/100; + min1=tim11%100; +//JSONстрока формирование + ntphome(); + tim3=timeserv; +JSstringU(); +events.send(jsonString.c_str(), "new_readings", millis());//обновление веба +// fdata=1; + + // fdata=0; + savedata(); +}//OnDataRecv + //**************************************************************************** + void configureEvents() { + events.onConnect([](AsyncEventSourceClient *client){ + if(client->lastId()){ + Serial.printf("Client connections. Id: %u\n", client->lastId()); + } + // and set reconnect delay to 1 second + client->send("hello from ESP32",NULL,millis(),1000); + }); + +}// configureEvents +//********************************************************************************************************* +void setup() { + // Initialize Serial Monitor + pinMode(13, OUTPUT); + digitalWrite(13, LOW); + Serial.begin(115200); + +if(!SPIFFS.begin()){ + Serial.println("An Error has occurred while mounting SPIFFS"); + return; + } + + sdSPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS); + if (!SD.begin(SD_CS, sdSPI)) + { + // if(!SD.begin()){ + Serial.println("Mounting card mount failed"); + // return; + } + + +uint8_t cardType = SD.cardType(); +if(cardType == CARD_NONE){ + Serial.println("No SD card attached"); + //return; + } + uint64_t cardSize = SD.cardSize() / (1024 * 1024); + Serial.printf("SD Card Size: %lluMB\n", cardSize); + Sdreaddata(); + Nrfsetup(); +settimer(); +WiFisetup(); + // Initialize a NTPClient to get time + timeClient.begin(); + // Set offset time in seconds to adjust for your timezone, for example: + // GMT +1 = 3600 + // GMT +8 = 28800 + // GMT -1 = -3600 + // GMT 0 = 0 + timeClient.setTimeOffset(10800); + // Once ESPNow is successfully Init, we will register for recv CB to + // get recv packer info + esp_now_register_recv_cb(OnDataRecv); + ntp();//NTP init + +server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/index.html", String(), false, processor); + fobnov=1; + }); + server.on("/index.html", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/index.html", String(), false, processor); + fobnov=1; + + }); + // Route to load style.css file + server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/style.css", "text/css"); + }); + + + server.on("/fon.jpg", HTTP_GET, [](AsyncWebServerRequest *request){ + request->send(SPIFFS, "/fon.jpg"); + }); + + server.on("/upravlenie.html", HTTP_GET, [](AsyncWebServerRequest *request){ + fobnov=1; + request->send(SPIFFS, "/upravlenie.html", String(), false, processor); + }); + + server.on("/setting.html", HTTP_GET, [](AsyncWebServerRequest *request){ + + request->send(SPIFFS, "/setting.html"); + }); + server.on("/inform.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=1; + fping=0; + // Serial.println ("ftdata==1"); + request->send(SPIFFS, "/inform.html"); + }); + + server.on("/inform1.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=2; + fping=0; + // Serial.println ("ftdata==1"); + request->send(SPIFFS, "/inform1.html"); + }); + + server.on("/inform2.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=4; + fping=0; + // Serial.println ("ftdata==1"); + request->send(SPIFFS, "/inform2.html"); + }); + server.on("/inform3.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=7; + fping=0; + // Serial.println ("ftdata==1"); + request->send(SPIFFS, "/inform3.html"); + }); + server.on("/inform4.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=3; + fping=0; + // Serial.println ("ftdata==1"); + request->send(SPIFFS, "/inform4.html"); + }); + server.on("/inform5.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=5; + fping=0; + // Serial.println ("ftdata==1"); + request->send(SPIFFS, "/inform5.html"); + }); + server.on("/inform6.html", HTTP_GET, [](AsyncWebServerRequest *request){ + ftdata=6; + fping=0; + // Serial.println ("ftdata==1"); + request->send(SPIFFS, "/inform6.html"); + }); + server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){ + + request->send(SPIFFS, "/favicon.ico"); + }); + server.on("/favicon-32x32.png", HTTP_GET, [](AsyncWebServerRequest *request){ + + request->send(SPIFFS, "/favicon-32x32.png"); + }); + server.on("/favicon-16x16.png", HTTP_GET, [](AsyncWebServerRequest *request){ + + request->send(SPIFFS, "/favicon-32x32.png"); + }); + + // Send a GET request to /update?output=&state= принимаем get сообщение от клиента при нажати кнопки + // принимаем номер контакта и его состояние + // GET http://192.168.1.100/update?output=13&state=1 + server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) { + String inputMessage1; + String inputMessage2; + // GET input1 value on /update?output=&state= + + + if (request->hasParam(PARAM_INPUT_1) && request->hasParam(PARAM_INPUT_2)) { + inputMessage1 = request->getParam(PARAM_INPUT_1)->value(); + inputMessage2 = request->getParam(PARAM_INPUT_2)->value(); + digitalWrite(inputMessage1.toInt(), inputMessage2.toInt()); + } + else { + inputMessage1 = "No message sent"; + inputMessage2 = "No message sent"; + } + Serial.print("GPIO: "); + Serial.print(inputMessage1); + Serial.print(" - Set to: "); + Serial.println(inputMessage2); + + request->send(200, "text/plain", "OK"); + }); + +JSstringU(); +JSstringK(); + +configureEvents(); + server.addHandler(&events); + + server.begin(); + esp_task_wdt_init(WDT_TIMEOUT, true); //включить панику, чтобы ESP32 перезапустился + esp_task_wdt_add(NULL); //добавить текущий поток в WDT watch + +} + + +//*********************************************************************************************************** +//*********************************************************************************************************** +//*********************************************************************************************************** +void loop() +{ + + + static unsigned long lastEventTime = millis(); + + static const unsigned long EVENT_INTERVAL_MS = 5000; + if (v>3) {//20sek + ntphome();//считываем время + v=0;//обнуляем счетчик 4*5=20с + } + if (v1>240) {//20min + ntp();//считываем время + v1=0;//обнуляем счетчик 240*5=1200с + } + + // digitalWrite(13, HIGH); // светодиод горит +// digitalWrite(13, LOW); // светодиод погашен + if ((millis() - lastEventTime) > EVENT_INTERVAL_MS) + { + events.send("ping",NULL,millis()); + lastEventTime = millis(); + v++; + v1++; + + vrem();//время работы сайта + events.send(t10.c_str(), "t10", millis());//время работы сайта обн каждые 5сек + events.send(timeserv.c_str(), "timeserv", millis());//время обн каждые 5сек + + fping++;//задержка отправки данных на стр до готовности стр принять их + if(fping>1000){fping=0;} + nrf(); //проверяем не приш ли данные на NRF + wright++;//сч времени для записи на флеш + Serial.println (wright); + Serial.print ("ftdata="); + Serial.println (ftdata); + Serial.print ("fobnov="); + Serial.println (fobnov); + if( ftdata==0) + { if (fobnov>0) {//2,5sek + fobnov++; + if(fobnov>3){fobnov=0;} + events.send(jsonString.c_str(), "new_readings", millis());//обновление веба текущая температура + events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление веба + Serial.println("/index"); + } + } + +//***************************************************************************************** + + +//******************************************************************************************* + +//********************************************************************************************* + + + + //********************************************************************************************** + if (ftdata==2)//пришел запрос табл данных /inform ЗАПАД + {// tim3=formattedTime; + if(fping>2){fping=0;} + if(fping==1){ + events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление веба + } + if(fping>1){ + ftdata=0; + fping=0; + nti=1; + readdata(); + // Serial.println("data1"); + events.send(strdat.c_str(), "readings", millis());//отправка данных из памяти в таблицу на стр inform + } + } +//*************************************************************************************************** + if (ftdata==1)//пришел запрос табл данных /inform ВОСТОК + {// tim3=formattedTime; + + if(fping>2){fping=0;} + if(fping==1){ +// events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление веба + events.send(jsonString.c_str(), "new_readings", millis());//обновление данных ЗАПАД + } + if(fping>1){ + ftdata=0; + fping=0; + nti=0; + readdata(); + events.send(strdat.c_str(), "readings", millis());//отправка данных из памяти в таблицу на стр inform + // fobnov=1; + + } + } + +//*************************************************************************************************** + if (ftdata==3)//пришел запрос табл данных /inform коридор + {// tim3=formattedTime; + + if(fping>2){fping=0;} + if(fping==1){ + events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление данных Т Н ВАТ все кроме запад + } + if(fping>1){ + ftdata=0; + fping=0; + nti=5; + readdata(); + events.send(strdat.c_str(), "readings", millis());//отправка данных из памяти в таблицу на стр inform + } + } +//*************************************************************************************************** + if (ftdata==5)//пришел запрос табл данных /inform балкон + {// tim3=formattedTime; + + if(fping>2){fping=0;} + if(fping==1){ + events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление данных Т Н ВАТ все кроме запад + } + if(fping>1){ + ftdata=0; + fping=0; + nti=2; + readdata(); + events.send(strdat.c_str(), "readings", millis());//отправка данных из памяти в таблицу на стр inform + } + } + +//****************************************************************************************************** + if (ftdata==4)//пришел запрос табл данных /inform К1 + {// tim3=formattedTime; + + if(fping>2){fping=0;} + if(fping==1){ + events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление данных Т Н ВАТ все кроме запад + } + if(fping>1){ + ftdata=0; + fping=0; + nti=4; + readdata(); + events.send(strdat.c_str(), "readings", millis());//отправка данных из памяти в таблицу на стр inform + } + } + + + //****************************************************************************************************** + if (ftdata==7)//пришел запрос табл данных /inform К2 + {// tim3=formattedTime; + + if(fping>2){fping=0;} + if(fping==1){ + events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление данных Т Н ВАТ все кроме запад + } + if(fping>1){ + ftdata=0; + fping=0; + nti=3; + readdata(); + events.send(strdat.c_str(), "readings", millis());//отправка данных из памяти в таблицу на стр inform + } + } + + //********************************************************************************************************* + if (ftdata==6)//пришел запрос табл данных /inform + {// tim3=formattedTime; + if(fping>2){fping=0;} + if(fping==1){ + events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление веба + } + if(fping>1){ + ftdata=0; + fping=0; + nti=1; + readdata(); + Serial.println("data1"); + events.send(strdat.c_str(), "readings", millis());//отправка данных из памяти в таблицу на стр inform + } + } + + + + + } +} diff --git a/esp327nrfSDWDT3/event.ino b/esp327nrfSDWDT3/event.ino new file mode 100644 index 0000000..1d71c0e --- /dev/null +++ b/esp327nrfSDWDT3/event.ino @@ -0,0 +1,24 @@ + + void event() + { + /*events.send(String(t1).c_str(), "t1", millis()); + events.send(String(h1).c_str(), "h1", millis()); + // events.send(String(hour1).c_str(), "hour1", millis()); + // events.send(String(min1).c_str(), "min1", millis()); + + + if (min1<10) + { + tim2=String(hour1)+":"+"0"+String(min1); + } + else + {tim2=String(hour1)+":"+String(min1); + } + events.send(tim2.c_str(), "tim2", millis()); + events.send(t10.c_str(), "t10", millis()); + //events.send(formattedDate.c_str(), "tim3", millis()); + + events.send(tim3.c_str(), "tim3", millis()); + events.send(timeserv.c_str(), "timeserv", millis()); + events.send(dataserv.c_str(), "dataserv", millis());*/ + } diff --git a/esp327nrfSDWDT3/nrf.ino b/esp327nrfSDWDT3/nrf.ino new file mode 100644 index 0000000..9d76713 --- /dev/null +++ b/esp327nrfSDWDT3/nrf.ino @@ -0,0 +1,54 @@ +void Nrfsetup() +{ + radio.begin(); + radio.setChannel(100); + radio.setPayloadSize(16);//должно быть16 + radio.setAddressWidth(5); + radio.setAutoAck( 0 ,false); + radio.setCRCLength(RF24_CRC_16); + radio.setDataRate(RF24_2MBPS); + radio.openReadingPipe(0,pip); + radio.startListening(); +} + +void nrf() +{ + if (radio.available()){ + radio.read(msg,16); + esp_task_wdt_reset();//reset WDT + Serial.println(msg); + parsmsg(); + if (radio.available()){radio.read(msg,16); + parsmsg();} + delay(500); + if (radio.available()){radio.read(msg,16); + parsmsg();} + delay(500); + if (radio.available()){radio.read(msg,16); + parsmsg();} + delay(500); + if (radio.available()){radio.read(msg,16); + parsmsg();} + delay(500); + if (radio.available()){radio.read(msg,16); + parsmsg();} + + JSstringK();//создаем строку для сайта + events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление веба + + if(nt==2){saveul();}//t9 T2 + if(nt==3){savebalk();}//t1 T3 + if(nt==4){savek2();}//t2 T4 + if(nt==5){savek1();}//t3 T5 + if(nt==7){savekor();}//t5 T6 + if (radio.available()){radio.read(msg,16);} + } + //t1+138c347v524h5 балкон + //t2+243c401v528h моя комната +// t3+230c357v469h зал +// t5+230c357v469h коридор +//9d+088h866s00v улица восток + + + +} diff --git a/esp327nrfSDWDT3/ntp.ino b/esp327nrfSDWDT3/ntp.ino new file mode 100644 index 0000000..afa5491 --- /dev/null +++ b/esp327nrfSDWDT3/ntp.ino @@ -0,0 +1,95 @@ +void ntp() + { + // while(!timeClient.update()) { + // timeClient.forceUpdate(); + //} + + for(int i=0; i<5 && !timeClient.update(); i++) +{ + +timeClient.forceUpdate(); +} + + // The formattedDate comes with the following format: + // 2018-05-28T16:00:13Z + // We need to extract date and time + // formattedDate = timeClient.getFormattedDate(); + formattedTime =timeClient.getFormattedTime(); + Serial.println(formattedTime); + Serial.println("NTP3"); +// getDay +//getHours +//getMinutes +//getSeconds +//getFormattedTime +// formattedDate =timeClient.getFormattedDate(); + // int splitT = formattedDate.indexOf("T"); +// dayStamp = formattedDate.substring(0, splitT); +// Serial.println(timeClient.getDay()); + + // Extract time + // timeStamp = formattedDate.substring(splitT+1, formattedDate.length()-1); +// Serial.println("ntp"); +// Serial.println(timeClient.getEpochTime()); + stamp.getDateTime(timeClient.getEpochTime()); +EpochTime=timeClient.getEpochTime(); + // забираем вот так +// Serial.println(stamp.year); + Serial.println(stamp.month); + Serial.println(stamp.day); + // Serial.println(stamp.hour); + // Serial.println(stamp.minute); + // Serial.println(stamp.second); + Serial.println(stamp.dayOfWeek); + timeserv=formatTimeDigits(stamp.hour,stamp.minute); + //dataserv=formatDateDigits(stamp.day, stamp.month, stamp.year); + +hour1=stamp.hour; +min1=stamp.minute; + + dataserv=stamp.day; + munthserv=strm[stamp.month-1] ; + weekserv=strweek[stamp.dayOfWeek]; +//Serial.println(timeserv); +//Serial.println(dataserv); +} + +char *formatTimeDigits(int hour, int minute) +{ +char *time_str = new char[5]; +time_str[0] = '0' + (hour / 10); +time_str[1] = '0' + (hour % 10); +time_str[2] = ':'; +time_str[3] = '0' + (minute / 10); +time_str[4] = '0' + (minute % 10); +time_str[5] = '\0'; + +return time_str; +} + +char *formatDateDigits(int date, int mounth, int year) +{ +char *date_str = new char[9]; + +date_str[1] = '0' + (date % 10); +date_str[2] = '/'; +date_str[0] = '0' + (date / 10); +date_str[3] = '0' + (mounth / 10); +date_str[4] = '0' + (mounth % 10); +date_str[5] = '/'; +date_str[6] = '0' + ((year % 100) / 10); +date_str[7] = '0' + (year % 10); +date_str[8] = '\0'; + +return date_str; +} + +void ntphome() +{ + stamp.getDateTime(timeClient.getEpochTime()); + timeserv=formatTimeDigits(stamp.hour,stamp.minute); + hour1=stamp.hour; +min1=stamp.minute; +// dataserv=formatDateDigits(stamp.day, stamp.month, stamp.year); + dataserv=stamp.day; +} diff --git a/esp327nrfSDWDT3/parsmsg.ino b/esp327nrfSDWDT3/parsmsg.ino new file mode 100644 index 0000000..e9429a6 --- /dev/null +++ b/esp327nrfSDWDT3/parsmsg.ino @@ -0,0 +1,352 @@ + +void parsmsg() +{ +//int tkom1=0;//температура +//int hkom1=0;//влажность +//int batkom1=0; +//String timekom1;//время прихода данных комната1 + +//int tkom2=0; +//int hkom2=0; +//int batkom2=0; +//String timekom2; + +//int tkor=0; +//int hkor=0; +//int batkor=0; +//String timekor; + +//int tbal=0; +//int hbal=0; +//int batbal=0; +//String timebal; + +//String timebal; + //t1+138c347v524h5 балкон + //t2+243c401v528h моя комната +// t3+230c357v469h зал +// t5+230c357v469h коридор +//9d+088h866s00v улица восток +//timeul1 +//tul1 +//hul1 +//osv1 +//char msg[16];принятое сообщение +int tdat;//температура +int hdat;//влажность +int vdat;//напряж батареи датчика +int zndat; +int osv; + char token9[] = "9d";//улица + char token11[] = "t1";//датчики + char token12[] = "t2";//датчики + char token13[] = "t3";//датчики + char token14[] = "t4";//датчики + char token15[] = "t5";//датчики + + int n=0; + int p=0; + boolean chet=0; +char c ; + +//*************************** +for (int j=0 ; j<15 ;j++) +{ c=msg[j];//принятая с премника перемнная + + + if (p==9) + { if (c==token9[1]){p=99;}//данные с ул датчика восток + else{ + p=0;} + } + if (p==101)//cравнение второго символа на соответствие t 1 + { if (c==token11[1]){p=111;} + + } + if (p==101)//cравнение второго символа на соответствие t 2 + { if (c==token12[1]){p=112;} + + } + if (p==101)//cравнение второго символа на соответствие t 3 + { if (c==token13[1]){p=113;} + + } + if (p==101)//cравнение второго символа на соответствие t 4 + { if (c==token14[1]){p=114;} + + } + if (p==101)//cравнение второго символа на соответствие t 5 + { if (c==token15[1]){p=115;} + else{ + p=0;} + } + //************************************************* + if (p==99) + {// myFile.print(c);//d+237h895s05v + nt=2; + timeul1=timeserv;//время получения данных + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=2;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5){ + tdat=(c-48)+tdat; + + if(zndat==1){tul1="-"+String (tdat/10)+"."+String (tdat%10); //температура знак -230 -23.0 + } + else + {tul1=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + } + if (n==7){hdat=(c-48)*100;}//влажность + if (n==8){hdat=(c-48)*10+hdat;} + if (n==9){ + hdat=(c-48)+hdat; + hul1=String (hdat/10)+"."+String (hdat%10); //влажность 866 86.6% + } + if (n==11){osv=10*(c-48);}//освещенность + if (n==12) + {osv=osv+(c-48); + if(osv>99){osv=99;} + osv1=String (osv)+"%"; + }//sun + // hourdu=t.hour;//время прихода данных час + // mindu=t.min;//мин + + } + //***************************************** + + //*****************датчики температуры переносные*********************** +//************************T1**************************************************** + if (p==111) //выделение данных из принятой строки + { timebal=timeserv;//время получения данных + nt=3; +//byte ntdat;номер датчика +//byte zndat;знак температуры 0+ +//int tdat;температура +//int hdat;влажность +//int vdat;напряж батареи датчика + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=0;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + tbal=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + + if (n==7){vdat=(c-48)*100;}//напряж батареи датчика + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + batbal=String (vdat/100)+"."+String (vdat%100);//батарея 357v 3.75в + } + if (n==11){hdat=(c-48)*100;}//влажность + if (n==12) + {hdat=(c-48)*10+hdat; + } + if (n==13) + {hdat=(c-48)+hdat; + hbal=String (hdat/10)+"."+String (hdat%10); //влажность 866 86.6% + } + + } +//**************************************** T2 + if (p==112) //выделение данных из принятой строки + {timekom2=timeserv;//время получения данных + nt=4; + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=0;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + tkom2=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + + if (n==7){vdat=(c-48)*100;}//напряж батареи датчика + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + batkom2=String (vdat/100)+"."+String (vdat%100);//батарея 357v 3.75в + } + if (n==11){hdat=(c-48)*100;}//влажность + if (n==12) + {hdat=(c-48)*10+hdat; + } + if (n==13) + {hdat=(c-48)+hdat; + hkom2=String (hdat/10)+"."+String (hdat%10); //влажность 866 86.6% + } + + } + //**************************************** + //**************************************** T3 + if (p==113) //выделение данных из принятой строки + {// myFile.print(c);//t2+103c375v299h9 + nt=5; + timekom1=timeserv;//время получения данных + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=0;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + tkom1=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + + + + if (n==7){vdat=(c-48)*100;}//напряж батареи датчика + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + batkom1=String (vdat/100)+"."+String (vdat%100);//батарея 357v 3.75в + } + if (n==11){hdat=(c-48)*100;}//влажность + if (n==12) + {hdat=(c-48)*10+hdat; + } + if (n==13) + {hdat=(c-48)+hdat; + hkom1=String (hdat/10)+"."+String (hdat%10); //влажность 866 86.6% + } + + } +//**************************************** T4 **************************** + /* if (p==114) //выделение данных из принятой строки + {// myFile.print(c);//t1+103c375v299h9 + ntdat=4; + if(chet==0) + { if( hourd4==t.hour) + {fh=1; + } + else + {fh=0; + } + chet=1; + } + hourd4=t.hour; + mind4=t.min; +//byte ntdat;номер датчика +//byte zndat;знак температуры 0+ +//int tdat;температура +//int hdat;влажность +//int vdat;напряж батареи датчика + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=0;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + for (int u =22 ; u >= 0; u = u--) + { + t4[u+1]=t4[u]; + } + if(zndat==1)//- + {t14=tdat+1000; + t4[0]=t14; + } + else + {t14=tdat; + t4[0]=t14; + } + } + + if (n==7){vdat=(c-48)*100;}//напряж батареи датчика + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + bat[3]=vdat; + } + if (n==11){hdat=(c-48)*100;}//влажность + if (n==12) + {hdat=(c-48)*10+hdat; + for (int u =22 ; u >= 0; u = u--) + { + h4[u+1]=h4[u]; + } + h4[0]=hdat; + + } + if (n==13) + {hdat=(c-48)+hdat; + h14=hdat; + } + + }*/ + //**************************************** T5 + if (p==115) //выделение данных из принятой строки + {// myFile.print(c);//t2+103c375v299h9 + timekor=timeserv;//время получения данных + nt=7; + n++; + if (n==2){ + if (c==45){zndat=1;//- + }//znak + else + {zndat=0;//+ + } + } + if (n==3) {tdat=(c-48)*100;} //температура + if (n==4){tdat=(c-48)*10+tdat;} + if (n==5) + {tdat=(c-48)+tdat; + tkor=String (tdat/10)+"."+String (tdat%10); //температура без знака +230 +23.0 + } + + if (n==7){vdat=(c-48)*100;}//напряж батареи датчика + if (n==8){vdat=(c-48)*10+vdat;} + if (n==9) + {vdat=(c-48)+vdat; + batkor=String (vdat/100)+"."+String (vdat%100);//батарея 357v 3.75в + } + if (n==11){hdat=(c-48)*100;}//влажность + if (n==12) + {hdat=(c-48)*10+hdat; + } + if (n==13) + {hdat=(c-48)+hdat; + hkor=String (hdat/10)+"."+String (hdat%10); //влажность 866 86.6% + } + + } +//******************************************************************************* + +if ((c==token9[0])&&(p==0)){p=9;} +if ((c==token11[0])&&(p==0)){p=101;}//cравнение первого символа на соответствие t +}//for +//************************************************* + + +}//void pars diff --git a/esp327nrfSDWDT3/savedata.ino b/esp327nrfSDWDT3/savedata.ino new file mode 100644 index 0000000..852e811 --- /dev/null +++ b/esp327nrfSDWDT3/savedata.ino @@ -0,0 +1,183 @@ +/*void savedata() +{ + + JSONVar boardat; +if(min1<10) +{boardat["Time"] = String(hour1)+":0"+String(min1); +} +else +{ + boardat["Time"] = String(hour1)+":"+String(min1); +} +boardat["temperatura"] =String(t1)+" C"; +boardat["humidity"] = String(h1)+" %"; +tempdat = JSON.stringify(boardat); +// Serial.println (tempdat); +//JSON { "Time":"11:03", "temperatura":"10.56 C", "humidity":"7,56 %" }, + + // myFile = SPIFFS.open("/TempUl.txt", FILE_WRITE);//создаем файл с именем TempUl + myFile = SPIFFS.open("/TempU1.txt", FILE_APPEND);//открываем файл в режиме добавления данных + myFile.print(tempdat+"\n"); + myFile.close(); +//**************************************************** + + +} + +void readdata() +{ + //**************************************************** + Serial.println("/TempU1.txt"); + // Читаем содержимое файла: + + myFile = SPIFFS.open("/TempU1.txt", FILE_READ); + + + + // "Содержимое файла: \"" + + while(myFile.available()) { + + Serial.write(myFile.read()); + + } + Serial.println(" "); + + // Узнаем размер файла: + + Serial.print("File size: "); + // "Размер файла: " + Serial.println(myFile.size()); + + myFile.close(); + +strdat=""; + + myFile = SPIFFS.open("/TempU1.txt", FILE_READ); + + + while(myFile.available()) { + + strdat+=char(myFile.read()); + + } + + + myFile.close(); + + + + + board1["tdata"] = strdat; + board1["dataserv"] = dataserv; + board1["timeserv"] = timeserv; +jsonString1 = JSON.stringify(board1); + // Serial.println (jsonString1); + // Serial.println ("strdat="); + //Serial.println (strdat); + + // events.send(tempdat.c_str(), "readings", millis());//обновление веба + // events.send(strdat.c_str(), "readings", millis());//обновление веба +}*/ + + +void Sdreaddata()//чтение данных после откл питания или сброса +{ Serial.println ("read SD data"); + strdat=""; + myFile = SD.open("/thkom1.txt", FILE_READ); + while(myFile.available()) { + + strdat+=char(myFile.read()); + + } + + + myFile.close(); + jsonString2=strdat; + Serial.println (jsonString2); + events.send(jsonString2.c_str(), "new_datatemp", millis());//обновление веба + JSONVar myObject = JSON.parse(strdat); +//{"tkom1":"","hkom1":"","batkom1":"","timekom1":"","tkom2":"25.1","hkom2":"50.1","batkom2":"4.0","timekom2":"22:00","tkor":"23.6","hkor":"45.7","batkor":"3.71","timekor":"21:55","tbal":"11.1","hbal":"56.3","batbal":"3.45","timebal":"21:47","tul1":"5.3","hul1":"99.9","osv1":"0%","timeul1":"22:01"} + + if (myObject.hasOwnProperty("tkom1")) { + tkom1=((const char*) myObject["tkom1"]);} + if (myObject.hasOwnProperty("hkom1")) { + hkom1=((const char*) myObject["hkom1"]);} + if (myObject.hasOwnProperty("batkom1")) { + batkom1=((const char*) myObject["batkom1"]);} + if (myObject.hasOwnProperty("timekom1")) { + timekom1=((const char*) myObject["timekom1"]);} + + if (myObject.hasOwnProperty("tkom2")) { + tkom2=((const char*) myObject["tkom2"]);} + if (myObject.hasOwnProperty("hkom2")) { + hkom2=((const char*) myObject["hkom2"]);} + if (myObject.hasOwnProperty("batkom2")) { + batkom2=((const char*) myObject["batkom2"]);} + if (myObject.hasOwnProperty("timekom2")) { + timekom2=((const char*) myObject["timekom2"]);} + + + if (myObject.hasOwnProperty("tkor")) { + tkor=((const char*) myObject["tkor"]);} + if (myObject.hasOwnProperty("hkor")) { + hkor=((const char*) myObject["hkor"]);} + if (myObject.hasOwnProperty("batkor")) { + batkor=((const char*) myObject["batkor"]);} + if (myObject.hasOwnProperty("timekor")) { + timekor=((const char*) myObject["timekor"]);} + + if (myObject.hasOwnProperty("tbal")) { + tbal=((const char*) myObject["tbal"]);} + if (myObject.hasOwnProperty("hbal")) { + hbal=((const char*) myObject["hbal"]);} + if (myObject.hasOwnProperty("batbal")) { + batbal=((const char*) myObject["batbal"]);} + if (myObject.hasOwnProperty("timebal")) { + timebal=((const char*) myObject["timebal"]);} + + if (myObject.hasOwnProperty("tul1")) { + tul1=((const char*) myObject["tul1"]);} + if (myObject.hasOwnProperty("hul1")) { + hul1=((const char*) myObject["hul1"]);} + if (myObject.hasOwnProperty("osv1")) { + osv1=((const char*) myObject["osv1"]);} + if (myObject.hasOwnProperty("timeul1")) { + timeul1=((const char*) myObject["timeul1"]);} + + + strdat=""; + myFile = SD.open("/thku1.txt", FILE_READ); + while(myFile.available()) { + + strdat+=char(myFile.read()); + + } + myFile.close(); + jsonString=strdat; + Serial.println ("jsonString"); + Serial.println (jsonString); + + events.send(jsonString.c_str(), "new_readings", millis());//обновление веба текущая температура + myObject = JSON.parse(jsonString); + if (myObject.hasOwnProperty("id")) { +String id=((const char*) myObject["id"]);} + if (myObject.hasOwnProperty("temperature")) { +ts=((double) myObject["temperature"]);} + + if (myObject.hasOwnProperty("humidity")) { + hs=((double) myObject["humidity"]);} + + if (myObject.hasOwnProperty("tim2")) { + tim2=((const char*) myObject["tim2"]);} + if (myObject.hasOwnProperty("tim3")) { + tim3=((const char*) myObject["tim3"]);} + if (myObject.hasOwnProperty("dataserv")) { + dataserv=((const char*) myObject["dataserv"]);} + if (myObject.hasOwnProperty("timev")) { + timev=((int) myObject["timev"]);} + +//{"id":2,"temperature":9.6733450317382812,"humidity":50.41815185546875,"tim2":"12:02", + // "dataserv":"12","timeserv":"15:30","munthserv":"январь",weekserv:"среда"} + +} diff --git a/esp327nrfSDWDT3/time.ino b/esp327nrfSDWDT3/time.ino new file mode 100644 index 0000000..c7488db --- /dev/null +++ b/esp327nrfSDWDT3/time.ino @@ -0,0 +1,30 @@ +void vrem()//время работы сервера +{ + +time17 = millis()/1000; +if (time17/60/60<10) { Serial.print ("0"); } +Serial.print (time17/60/60); +Serial.print (":"); +if (time17/60%60<10) { Serial.print ("0"); } +Serial.print ((time17/60)%60); +Serial.print (":"); +if (time17%60<10) { Serial.print ("0"); } +Serial.println (time17%60); +String q1=String(time17/60/60, DEC); +String q2=String((time17/60)%60, DEC); +String q3=String(time17%60, DEC); +if ((time17/60)%60<10) + { + t10=String(time17/60/60, DEC)+":"+"0"+String((time17/60)%60, DEC); + } + else + {t10=String(time17/60/60, DEC)+":"+String((time17/60)%60, DEC); + } + +//t10 =q1+":"+q2+":"+q3 ; +} + +/*char *time_buf; +int t = 2055; + +sprintf(time_buf, "%d:%d", t / 100, t % 100);*/ diff --git a/esp327nrfSDWDT3/timer.ino b/esp327nrfSDWDT3/timer.ino new file mode 100644 index 0000000..55d99a7 --- /dev/null +++ b/esp327nrfSDWDT3/timer.ino @@ -0,0 +1,39 @@ +void settimer() { + + +/* LED pin */ +//int led = 14; +/* LED state */ +//volatile byte state = LOW; + // Use 1st timer of 4 (counted from zero). + // Set 80 divider for prescaler (see ESP32 Technical Reference Manual for more + // info). + timer = timerBegin(2, 80, true); + + /* Attach onTimer function to our timer */ + timerAttachInterrupt(timer, &onTimer, true); + /* Set alarm to call onTimer function every second 1 tick is 1us + => 1 second is 1000000us */ + /* Repeat the alarm (third parameter) */ + timerAlarmWrite(timer, 5000000, true); + /* Start an alarm */ + timerAlarmEnable(timer); + // Serial.println("start timer"); + +} + +void IRAM_ATTR onTimer(){ +EpochTime=EpochTime+1; + esp_task_wdt_reset();//reset WDT +//Serial.print("EpochTime="); + // Serial.println(EpochTime); + // Increment the counter and set the time of ISR +// portENTER_CRITICAL_ISR(&timerMux); +// isrCounter++; +// lastIsrAt = millis(); +// portEXIT_CRITICAL_ISR(&timerMux); + // Give a semaphore that we can check in the loop +// xSemaphoreGiveFromISR(timerSemaphore, NULL); + // It is safe to use digitalRead/Write here if you want to toggle an output + +} diff --git a/play5.ino b/play5.ino deleted file mode 100644 index dcafdc7..0000000 --- a/play5.ino +++ /dev/null @@ -1,428 +0,0 @@ -#include -#include -#include -#include -#include -SdFile myFile; -#include -#include "GyverTimer.h" // подключаем библиотеку -GTimer myTimer(MS); // создать миллисекундный таймер (ms) (по умолч. в режиме интервала) -//myGLCD.setBackColor(VGA_TRANSPARENT); -//UTFT_Buttons myButtons(&myGLCD, &myTouch); -//#include -extern uint8_t SmallFont[]; -extern uint8_t BigFont[]; -extern uint8_t Ubuntubold[]; -#define imagedatatype unsigned short -extern imagedatatype cl[]; -unsigned short pic1[0x320]; - -#define TOUCH_ORIENTATION LANDSCAPE -UTFT myGLCD(ITDB50,38,39,40,41);//byte model, int RS, int WR,int CS, int RST, int SER=0); -UTFT_SdRaw myFiles(&myGLCD); -//int k1=2;//размер экрана 1-240х320 2-480х640 -int led = 13; -URTouch myTouch(42,43,44,45,47);//TCLK, TCS, TDIN, TDOUT и IRQ.Папа -const int chipSelect = 10; -int xt, yt; -int day1,month1,year1, h1,m1,s1;//время дата -char* str[] = {"MON","TUE","WED","THU","FRI","SAT","SUN"}; - byte dow ; - - -#define SD_CHIP_SELECT 2 // SD chip select pin -// file system object -SdFat sd; - -#include -EncButton btn0; -EncButton btn1; -EncButton btn2; -EncButton btn3; -EncButton btn4; - -#include -// создаём массив значений сигналов с кнопок -int16_t sigs[5] = { - 940, 900, 870, 820, - 10 }; -extern uint8_t SevenSegNumFont[]; -// указываем пин, количество кнопок и массив значений -AnalogKey keys; -//********************PAINT*************************************************************************************** -int color = 0; -word colorlist[] = {VGA_WHITE, VGA_BLACK, VGA_RED, VGA_BLUE, VGA_GREEN, VGA_FUCHSIA, VGA_YELLOW, VGA_AQUA}; -int bsize = 4; -//******************************************************************************************************* -int analogPin = 1; // определяем входной аналоговый пин -//VGA_BLACK, VGA_WHITE, VGA_RED, VGA_GREEN, VGA_BLUE, VGA_SILVER, VGA_GRAY, -//VGA_MAROON, VGA_YELLOW, VGA_OLIVE, VGA_LIME, VGA_AQUA, VGA_TEAL, VGA_NAVY, -// VGA_FUCHSIA, VGA_PURPLE, VGA_TRANSPARENT-прозрачный. -#define BIRD_BG 0xB5D6 -#define WHITE 0xFFFF -#define BLACK 0x0000 -#define RED 0xF800 -#define BLUE 0x001F -#define GREEN 0x07E0 -#define YELLOW 0xFFE0 -#define MAGENTA 0xF81F -#define CYAN 0x881f -#define ORANGE 0xfbc0 -#define GRAY 0xB5D6 - -#define BARDO 0xFC6F -int arrPins[] = {GRAY,VGA_BLUE, VGA_GREEN,MAGENTA,VGA_AQUA,YELLOW, VGA_RED,BARDO}; - - #define MaxX 7//кол-во кубиков по горизонтали - #define MaxY 16 //кол-во кубиков по вертикали +3 невидимых - #define SmeX 148// смещение стакана по горизонтали - #define SmeY 20//// смещение стакана по вертикали - #define LL 320 - #define interval 320 - #define razmer 36 // размер квадратика - #define NumCol 6 // количество цветов квадратиков - #define MaxLevel 8 // макс. кол-во уровней - #define NextLevel 20 // через сколько столбиков повышать уровень - - int MasSt[MaxX][MaxY], MasTmp[MaxX][MaxY], MasOld[MaxX][MaxY], fignext[3]; - int Level=1, dx, dy, OldLevel, tr, flfirst=1; // flfirst=? сменить для обнуления рекорда - uint16_t MasCol[]={WHITE, BLACK, RED, BLUE, GREEN, YELLOW, MAGENTA, VGA_AQUA}; - unsigned long TimeOfPush, Counter,Score=0, TScore=0, Record=0, OldRecord, OldScore, myrecord; - word tempspeed; - bool fl, Demo=true, myfl=false, Arbeiten=false, FlNew, FlZ=false, gmov=false; - int16_t VAL, Mp, x,y; - int16_t mmm [4][2]={{-1,0},{0,-1},{1,0},{0,1}}; - word MasSpeed[MaxLevel]={500,450,400,350,300,250,200,100}; // задержки уровней - bool valBtnL, valBtnR, valBtnT, valBtnPause, valBtnD; // Объявляем переменные для хранения состояния кнопок. - const uint32_t tmrKeyHold = 400; // Определяем время в мс после которого нажатая кнопка будет считаться удерживаемой (залипание при нажатии кнопки). - bool exit_menu=0; - void ViewStacan (void); - void Touch_Init (void); - void gameover (void); -// void GetNext (void); -// void but (void); -// void ProcDemo (void); -// void NewGame (void); -//void mydelay(int md); -// bool figmove(int dx, int dy); -//*********************************************************************************************************** - -// BIRDUINO - -//**************************************************************************************************** -//#include "flappy_title.h" // the latest version -//#include "bird05.h" // the latest version -//#include "pillar01.h" // first version -//#include "pillar_end.h" -//#include "bottom_deco.h" -//#define BIRD_BMP_X 34 -//#define BIRD_BMP_Y 24 -#define BORD_BMP_X 68 -#define BORD_BMP_Y 48 -#define FLAPPY_TITLE_X 190 -#define FLAPPY_TITLE_Y 51 -#define BOTTOM_DECO_X 600 -#define PILLAR_BMP_X 55 -#define PILLAR_BMP_Y 1 -#define PILLAR_END_BMP_X 55 -#define PILLAR_END_BMP_Y 20 -extern unsigned short pillar_end[0x44C]; -//extern unsigned short pillar[0x37]; -extern unsigned short pillar[0x6E]; -extern unsigned short icon[0x25DA]; -extern unsigned short bottom_deco[0x258]; -extern unsigned short bird[0x330]; -extern unsigned short bord[0xCC0]; -extern unsigned short udar[0xCC0]; -#define BIRD_BG 0x7639 // first value from the bird header file -#define TFTHEIGHT 800 -#define TFTWIDTH 480 -#define TEXT_POSITION_LEFT 50 -#define TEXT_POSITION_CENTER 110 -#define BOTTOM_AREA_Y 405 -#define BOTTOM_AREA_BG_COLOR 0x// 221,216,150 -#define BOTTOM_LINE_1_COLOR -// Floppy Bird -#define PILLAR_GAP 100 // pixels дырка в воротах -#define BIRD_X PILLAR_BMP_X // from the pillar header file -#define MOV_RATE_X0 3 // starting moving rate стартовая скорость -#define FALL_RATE_Y 3 // starting falling rate - -static int yP = 100; - -static int xP; - -static int yB; -static int movingRate, fallRateInt, steps; -static uint32_t fallRate; -static int score, level; -static int lastSpeedUpScore, highscore; -//static int screenPressed; -static boolean screenPressed, gameStarted, paused; -static uint32_t crt_millis, prev_millis; - -static char s[250]; // for sprintf -//static void drawTitle(void); -int life=3;// жизни -/*****************************************************************************/ -static int tick; -/*****************************************************************************/ -//********* TETRIS *********************************************************** -int arrPins1[] = {GRAY,CYAN , GREEN, MAGENTA, VGA_BLUE,YELLOW, ORANGE,VGA_RED}; - int figcol=0;// цвет фигуры - int figcol1=0;// цвет фигуры стола // - - #define pinSeed A0 // Номер аналогового входа значения которого будут использованы для выбора случайной точки входа в последовательность псевдослучайных чисел, для корректной работы функции random(). -#define GAME_OFF 0 // Одно из состояний игры (будет храниться в переменной state). -#define GAME_ON 1 // Одно из состояний игры (будет храниться в переменной state). -#define GAME_OVER 2 - /* Определяем настраиваемые значения: */ // -const uint16_t sumToNewLevel = 20; // Определяем количество фигур которое нужно набрать для перехода на новый уровень. -const uint16_t startTime = 1000; // Определяем начальное время в мс с которым фигура опускается на одну клетку игрового стола (начальная скорость игры). -const uint16_t changeTimeLevel = 10; // Определяем значение в мс на которое уменьшается время опускания фигуры с каждым новым уровнем (увеличение скорости). -//const uint32_t tmrKeyHold = 400; // Определяем время в мс после которого нажатая кнопка будет считаться удерживаемой (залипание при нажатии кнопки). -const uint32_t scrBoundary = 400;//68; // Определяем границу отделяющую левую и правую части экрана. -const uint32_t newCubeSize = 20;//6; // Определяем размер клеток в пикселях для поля отображения будущих фигур. -const uint32_t tableCubeSize = 30;//3; // Определяем размер клеток в пикселях для игрового стола. - /* Объявляем массивы и переменные: */ -const uint32_t Xsm=137; -const uint32_t Ysm=15; -const uint32_t tableRows = 14;//( 480-3) / (tableCubeSize+1); // Определяем количество строк на игровом столе (зависит от размера клеток игрового стола). Количество = (высота экрана - 3 линии) / (высота клеток игрового стола + 1 разделительная линия). -const uint32_t tableCols =10;// (scrBoundary-4) / (tableCubeSize+1); // Определяем количество столбцов на игровом столе (зависит от размера клеток игрового стола). Количество = (ширина до границы - 4 линии) / (ширина клеток игрового стола + 1 разделительная линия). - uint32_t tableArray [tableRows]; // Объявляем массив клеток игрового стола. Каждый элемент массива - это строки игрового стола, а каждый бит это клетка на игровом столе (0-пуста, 1-закрашена). - uint8_t figureArray [6]; // Объявляем массив для хранения вида движущейся фигуры. | Каждый элемент массивов figureArray и figureArrayNew - это строки фигуры, в которых биты 4-0 являются флагами наличия кубиков в столбцах стоки (0-нет, 1-есть). - uint8_t figureArrayNew [6]; // Объявляем массив для хранения вида будущей фигуры. | Последний элемент массивов figureArray и figureArrayNew - это флаг запрещающий поворот фигуры (0-разрешено, 1-запрещено). - int8_t figurePos [4]; // Объявляем массив позиции движущейся фигуры на игровом столе (в клетках). [0]: отступ слева, [1]: отступ сверху, [2]: начальный отступ новой фигуры слева, [3]: начальный отступ новой фигуры сверху. - uint8_t state; // Объявляем переменную для хранения текущего состояния игры: GAME_OFF, GAME_ON, GAME_OVER. - uint32_t sumfig; // Объявляем счётчик количества созданных фигур: 0-4294967296. - uint8_t level1; // Объявляем счётчик текущего уровня игры: 1-99. - uint32_t points; // Объявляем счётчик набранного количества балов: 0-99999. - uint32_t tmrShift; // Объявляем переменную для хранения времени следующего сдвига фигуры вниз. - // bool valBtnL, valBtnR, valBtnT, valBtnD,valBtnPause; // Объявляем переменные для хранения состояния кнопок. - /* Объявляем функции: */ // - void getKeys (void); // Объявляем функцию получения состояния всех кнопок в переменные valBtnL, valBtnR, valBtnT, valBtnD. - void showWelcome (void); // Объявляем функцию прорисовки анимированного приветствия. - void showGameScreen (void); // Объявляем функцию прорисовки игрового поля. - void showFigure (bool, bool, int); // Объявляем функцию прорисовки или затирания фигуры (аргументы: флаг [1-фигура на игровом столе, 0-будущая фигура], флаг [1-прорисовать фигуру, 0-затереть фигуру]). - void showTable (void); // Объявляем функцию прорисовки всех кубиков в клетках игрового стола. - bool createNewFigure (void); // Объявляем функцию создания будущей фигуры. Функция возвращает false если вставить ранее созданную будущую фигуру на игровой стол не удается (завершение игры). - void turnFigure (bool, uint8_t=1); // Объявляем функцию поворота фигуры на 90° по часовой стрелке (аргументы: флаг [1-фигура на игровом столе, 0-будущая фигура], количество поворотов будущей фигуры на 90° по часовой стрелке). - bool shiftFigure (uint8_t); // Объявляем функцию сдвига фигуры на одну клетку игрового стола. Если возвращает false если сдвиг невозможен. (аргументы: 1 - влево, 2 - вправо, 3 - вниз, иначе - без сдвига). - bool checkFigure (void); // Объявляем функцию проверки корректности положения фигуры на игровом столе (перед её отрисовкой). Если положение фигуры некорректно, то функция вернёт false. - bool checkTable (void); // Объявляем функцию проверки полностью заполненных строк на игровом столе (функцию требуется вызывать до создания новой фигуры на игровом столе). Если на игровом столе есть полностью заполненные строки, то функция вернёт true. - uint8_t deletTableRows (void); // Объявляем функцию удаления полностью заполненных строк на игровом столе (функцию требуется вызывать до создания новой фигуры на игровом столе). Функция возвращает количество удалённых строк с игрового стола. - // -/******ZMEYKA***********************************************************************/ -extern unsigned short apple[0x384]; -extern unsigned short zmeygol[0x384]; -extern unsigned short zmeygol1[0x384]; -extern unsigned short zmeygol2[0x384]; -extern unsigned short zmeygol3[0x384]; -extern unsigned short zmeytelo[0x384]; - - /* Объявление переменных */ -int Tail[115]; // Массив тела змейки. -int Choice; // Переменная выбора движения. -int nTail; // Переменная количества элементов в змейке. -int CoreX; // Переменная X-координаты квадратика. -int CoreY; // Переменные Y-координаты квадратика. -int xz; // Переменная X-координаты движения. -int yz; // Переменная Y-координаты движения. -int EndX; // Переменная X-координаты последнего элемента массива. -int EndY; // Переменная Y-координаты последнего элемента массива. -int del=600; // Переменная задержки. -int ycor; // Дополнительная переменная Y-координаты с которой строится и выводится завершающаяся змейка. -int aTail; // Дополнительная переменная количества элементов в змейке. -int Xk=30; -int Yk=10; -int grad=0; -int dispx, dispy, text_y_center; - /* Объявление функций */ -void ShowSnake(); // Функция вывода всей змейки на экран после выигрыша или проигрыша. -void SplashScreen(); // Функция вывода заставки игры на экран. -void GameOver(); // Функция завершения игры. -void SpeedControl(); // Функция регулировки скорости. -void MoveControl(); // Функция движения змейки и выбора направления. - -//************************************************************************************* -void setup() { - pinMode(led, OUTPUT); - Serial.begin(9600); // скорость обмена по уарт -Serial1.begin(9600); - // put your setup code here, to run once: -// pinMode(21, OUTPUT); -// digitalWrite(21, HIGH);//RD ITDB50 - pinMode(7, OUTPUT); - // br=constbr+brightness; - analogWrite(7, 200);//яркость экрана - - pinMode(14, OUTPUT); - digitalWrite(14, HIGH); //reset esp8266 - pinMode(15, OUTPUT); - digitalWrite(15, LOW); - - myGLCD.InitLCD(); - myGLCD.setFont(BigFont); - myTimer.setInterval(1000); // запуск в режиме интервала 500 мс - //************************************************************************************* - uint32_t crt_millis = millis(); - uint32_t prev_millis = crt_millis; - dispx=myGLCD.getDisplayXSize(); - dispy=myGLCD.getDisplayYSize(); - text_y_center=(dispy/2)-6; - myTouch.InitTouch(); - myTouch.setPrecision(PREC_MEDIUM); - - if (!sd.begin(SD_CHIP_SELECT, SPI_HALF_SPEED)) { - Serial.println(F("Card failed, or not present")); - - } - else - { - - Serial.println(F("Card initialised.")); - } - - - -} - -void loop() - { - myGLCD.clrScr(); - // char fname440[] = "SO11/SO100100.RAW"; - // myFiles.load(0, 0, 440, 440, fname440, 32, 0);// draw 440x440 raw (32*buffer) (non inverted colour) - myFiles.load(0, 0, 800, 480, "play/11.raw" , 32, 0); - - myGLCD.setColor(0, 0,155); - myGLCD.fillRect(0, 450,800, 480);//команд строка - - - - myGLCD.setColor(250, 0, 0); - myGLCD.fillRect(20, 20,70, 70); - - myGLCD.setColor(250, 250, 0); - myGLCD.fillRect(20, 90,70, 140); - - myGLCD.setColor(250, 0, 250); - myGLCD.fillRect(20, 160,70, 210); - - myGLCD.setColor(0, 0, 250); - myGLCD.fillRect(20, 230,70, 280); - - myGLCD.setColor(0, 250, 250); - myGLCD.fillRect(20, 300,70, 350); - - myGLCD.setColor(0, 250, 0); - myGLCD.fillRect(20, 370,70, 420); - - - - myGLCD.setColor(250, 200, 0); - myGLCD.fillRect(120, 20, 170, 70);//x,y,xkon ykon - myGLCD.setColor(200, 200, 0); - myGLCD.fillRect(120, 90, 170, 140);//x,y,xkon ykon - myGLCD.setColor(250, 150, 150); - myGLCD.fillRect(120, 160, 170, 210);//x,y,xkon ykon - - myGLCD.drawBitmap (639, 370, 160, 80, cl);//часы - myGLCD.drawRoundRect (639, 370, 799, 450); //Clok - kalendar();//календарь - ntp(); - kalendardat();//дата месяц год - - while (1) - { - if (myTimer.isReady()) - { - s1++; - if(s1>59){ - s1=0; - m1++; - if(m1>59){ - h1++; - m1=0; - if(h1>23)h1=0; - } - } - clc() ; - } - - - - if (myTouch.dataAvailable()) - { - myTouch.read(); - xt=myTouch.getX(); - yt=myTouch.getY(); - if ((xt>=20) && (xt<=70)) // Upper row - { - if ((yt>=20) && (yt<=70)) // Button: 1 - { - columns(); - } - if ((yt>=90) && (yt<=140)) // Button: 2 - { - birduino(); - } - if ((yt>=160) && (yt<=210)) // Button: 3 - { - tetris(); - } - if ((yt>=230) && (yt<=280)) // Button: 4 - { - paint(); - } - if ((yt>=300) && (yt<=350)) // Button: 5 - { - foto(); - } - if ((yt>=370) && (yt<=420)) // Button: 5 - { - zmeyka(); - } -} - if ((xt>=120) && (xt<=170)) // Upper row - { - if ((yt>=20) && (yt<=70)) // serial1 - { - serial(); - } - if ((yt>90) && (yt<=140)) //read serial1 - { - readserial(); - } - if ((yt>160) && (yt<=210)) //readprognoz - { - readprognoz(); - } - } -delay(200); - } - } - } - - - bool figmove(int dx, int dy) - { bool fff=false; - - if (x+dx<0 || x+dx>MaxX-1) return(false); // попытка выйти за стенки стакана - if (dx!=0) if (MasSt[x+dx][y+dy+2]==0) return(true); else return(false); - if (dy>0) // падение вниз - { if (y+dy+2>MaxY-1 || MasSt[x+dx][y+dy+2]>0) // либо на дне, либо на квадрате - {if (y<3) gameover(); - else fff=true; - } else - { for (byte i=0;i<3;i++) MasSt[x][y+2-i+dy]=MasSt[x][y+2-i]; - MasSt[x][y]=0; - y=y+dy; - } - if (fff) { MyScore(); - GetNext(); - } - ViewStacan(); - } - return(true); - } - //================================================