Advertisement
Guest User

Untitled

a guest
Aug 9th, 2018
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 100.68 KB | None | 0 0
  1.  
  2. #include <EEPROM.h>
  3.  
  4. #include <RCSwitch.h>
  5. RCSwitch mySwitch = RCSwitch();
  6.  
  7.  
  8. #include <ESP8266WiFi.h>
  9. #include <PubSubClient.h>
  10.  
  11. #include <WiFiUdp.h> //часы
  12.  
  13. #include <WiFiClient.h>
  14. #include <ESP8266WebServer.h>
  15. #include <ESP8266mDNS.h>
  16. #include <ESP8266HTTPUpdateServer.h>
  17.  
  18. /////////////////для часов/////////////////////////////////////////////////////////////////
  19. unsigned int localPort = 2390;      // local port to listen for UDP packets
  20.  
  21. /* Don't hardwire the IP address or we won't get the benefits of the pool.
  22.     Lookup the IP address for the host name instead */
  23. //IPAddress timeServer(129, 6, 15, 28); // time.nist.gov NTP server
  24. IPAddress timeServerIP; // time.nist.gov NTP server address
  25. const char* ntpServerName = "time.nist.gov";
  26.  
  27. const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
  28.  
  29. byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
  30. #define GMT 6 //часовой пояс
  31. long evTimeClock;
  32. long start_sinh; //старт синхронизации часов
  33. byte state_clock = 1;
  34. // A UDP instance to let us send and receive packets over UDP
  35. WiFiUDP udp;
  36.  
  37. long secsSince1900 = 0;
  38. long secsSince1900_2 = 0;//unix time с 1900 года 1 яанваря (время последнего удачного онлайн обнавления).
  39. long highWord;
  40. long lowWord;
  41. long epoch;
  42.  
  43. byte weekday = 4;// день недели
  44. byte day = 1;// число месяца
  45. int year = 1970;// год
  46. byte month = 1;// месяц
  47. int month_days; //дней в месяце
  48. long count_day; //количество дней с 1970 года 1 яанваря по текущее время
  49. long v_year; //кличество дней в году
  50. long next_year; //количество дней с 1970 года 1 яанваря, до зовершения текущего года
  51. int next_month; //количество дней от ночала текущего года до зовершения текущего месяца
  52. int count_day_curent_year; //сколько прошло дней в текущем году
  53. //int accuracy = 0; //буфер погрешности времени при подсчете оффлайн (в милисекундах)
  54. String curent_time = ""; //вывод текущего времени и даты
  55. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  56.  
  57.  
  58. String str = "";
  59. boolean conf = false;
  60. String html_header = "<html>\
  61. <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
  62. <head>\
  63.   <title>Wi-Fi Switch 1</title>\
  64.   <style>\
  65.     body { background-color: #00FF00; font-family: Arial, Helvetica, Sans-Serif; Color: #000000; }\
  66.   </style>\
  67. </head>";
  68.  
  69. ESP8266WebServer server(80);
  70. ESP8266HTTPUpdateServer httpUpdater;
  71.  
  72. byte len_ssid, len_pass, len_mqtt_server, len_mqtt_port, len_mqtt_user, len_mqtt_pass;
  73.  
  74. const char* host = "VPN";
  75. String ssid = "VPN";
  76. String pass = "8888888888";
  77.  
  78.  
  79. const char *ssid_ap = "Wi-Fi_relay2"; //имя точки доступа
  80. const char *pass_ap = "AP12345678";//пароль точки доступа
  81.  
  82.  
  83. //////////////////////настройки для MQTT///////////////////////////////
  84. //все в eeprom хранится ///////////////////////////////////////////////
  85. String mqtt_server = "10.160.254.26";
  86. String buf_mqtt_port = "8883";
  87. String mqtt_user = "Aaaaa";
  88. String mqtt_pass = "Bbbbbb";
  89. uint16_t mqtt_port;
  90. /////////////////////////////////////////////////////////////////////////
  91. #define ONLINE "relay/online" //топик о состоянии устройства - в сети\ не в сети
  92.  
  93. #define OUT1 "relay/out1" //топик для управления каналом 1
  94. #define OUT2 "relay/out2" //топик для управления каналом 2
  95. #define OUT3 "relay/out3" //топик для управления каналом 3
  96. #define OUT4 "relay/out4" //топик для управления каналом 4
  97.  
  98. #define STAT1 "relay/stat1" //топик для обратной связи, текущее состояние вых. 1
  99. #define STAT2 "relay/stat2" //топик для обратной связи, текущее состояние вых. 2
  100. #define STAT3 "relay/stat3" //топик для обратной связи, текущее состояние вых. 3
  101. #define STAT4 "relay/stat4" //топик для обратной связи, текущее состояние вых. 4
  102.  
  103. #define DEF1 "relay/def1" //топик для розетка1 "по умолчанию"
  104. #define DEF2 "relay/def2" //топик для розетка2 "по умолчанию"
  105. #define DEF3 "relay/def3" //топик для розетка3 "по умолчанию"
  106. #define DEF4 "relay/def4" //топик для розетка4 "по умолчанию"
  107.  
  108. #define TIMER_ON1 "relay/timer_on1" //топик для вкл\выкл таймера 1
  109. #define TIMER_ON2 "relay/timer_on2" //топик для вкл\выкл таймера 2
  110. #define TIMER_ON3 "relay/timer_on3" //топик для вкл\выкл таймера 3
  111. #define TIMER_ON4 "relay/timer_on4" //топик для вкл\выкл таймера 4
  112.  
  113. #define SET_TIME_1H "relay/set_time1h" //топик для установки часов таймера 1
  114. #define SET_TIME_2H "relay/set_time2h" //топик для установки часов таймера 2
  115. #define SET_TIME_3H "relay/set_time3h" //топик для установки часов таймера 3
  116. #define SET_TIME_4H "relay/set_time4h" //топик для установки часов таймера 4
  117.  
  118. #define SET_TIME_1M "relay/set_time1m" //топик для установки минут таймера 1
  119. #define SET_TIME_2M "relay/set_time2m" //топик для установки минут таймера 2
  120. #define SET_TIME_3M "relay/set_time3m" //топик для установки минут таймера 3
  121. #define SET_TIME_4M "relay/set_time4m" //топик для установки минут таймера 4
  122.  
  123. #define SET_TIME_1S "relay/set_time1s" //топик для установки секунд таймера 1
  124. #define SET_TIME_2S "relay/set_time2s" //топик для установки секунд таймера 2
  125. #define SET_TIME_3S "relay/set_time3s" //топик для установки секунд таймера 3
  126. #define SET_TIME_4S "relay/set_time4s" //топик для установки секунд таймера 4
  127.  
  128. #define TIME1 "relay/time1" //топик о прошедшем времени таймера 1
  129. #define TIME2 "relay/time2" //топик о прошедшем времени таймера 2
  130. #define TIME3 "relay/time3" //топик о прошедшем времени таймера 3
  131. #define TIME4 "relay/time4" //топик о прошедшем времени таймера 4
  132. #define CURENT_TIME "relay/curent_time" //текущее дата и время.
  133. #define WEEKDEY1 "relay/weekday1" //будильник 1 по дням недели
  134. #define WEEKDEY2 "relay/weekday2" //будильник 2 по дням недели
  135. #define WEEKDEY3 "relay/weekday3" //будильник 3 по дням недели
  136. #define WEEKDEY4 "relay/weekday4" //будильник 4 по дням недели
  137. /////////////////настройки для радиобрелка///////////////////////////
  138.  
  139. #define KEY_A 1855936 //код клавиши А
  140. #define KEY_B 1855792 // код клавиши В
  141. #define KEY_C 1855756  //код клавиши С
  142. #define KEY_D 1855747  //код клавиши D
  143. #define KEY_AB 1855984 //ПЕРЕЗАГРУЗКА
  144. #define KEY_AC 1855759 //(CD key) стирает ssid & pass & mqtt параметры подключений.
  145. /////////////////////////////////////////////////////////////////////
  146.  
  147. byte def1;// состояние розетки 1 "по умолчанию"
  148. byte def2;// состояние розетки 2 "по умолчанию"
  149. byte def3;// состояние розетки 3 "по умолчанию"
  150. byte def4;// состояние розетки 4 "по умолчанию"
  151.  
  152. byte count_con = 0; // колличество подключений к wi-fi AP
  153. #define BUFFER_SIZE 100
  154.  
  155. int led_r = 5; // красный свето-диод - режим точки доступа, мигающий - нстройки ssid сохранены, ожидание перезагрузки пользоватилем
  156. int led_g = 15; // зеленый свето-диод - wi-fi подключен, мигающий - попытка подключится к сети с сохраненным ssid,
  157. // оранжевый (красный + зеленый) - успешно подключен к wi-fi и mqtt брокеру
  158. boolean red_led_blink = 0; // флаг для запуска мигания красным свето-диодом
  159.  
  160. byte timer_on1 = 0;// переменная для включения таймера 1-ой розетки: 0 - выкл, 1-включен для отключения розетки, 2 - включен для включения розетки.3-будильник для выкл. розетки 4- буд. для вкл. розетки
  161. byte timer_on2 = 0;// переменная для включения таймера 2-ой розетки: 0 - выкл, 1-включен для отключения розетки, 2 - включен для включения розетки.
  162. byte timer_on3 = 0;// переменная для включения таймера 3-ей розетки: 0 - выкл, 1-включен для отключения розетки, 2 - включен для включения розетки.
  163. byte timer_on4 = 0;// переменная для включения таймера 4-ой розетки: 0 - выкл, 1-включен для отключения розетки, 2 - включен для включения розетки.
  164.  
  165. String time1 = "";// переменная для отображения прошедшего времени с момента старта таймера 1
  166. String time2 = "";// переменная для отображения прошедшего времени с момента старта таймера 2
  167. String time3 = "";// переменная для отображения прошедшего времени с момента старта таймера 3
  168. String time4 = "";// переменная для отображения прошедшего времени с момента старта таймера 4
  169.  
  170. unsigned long set_time1 = 0;// переменная для установки времени таймера 1-ой розетки (в милисекундах)
  171. unsigned long set_time2 = 0;// переменная для установки времени таймера 2-ой розетки (в милисекундах)
  172. unsigned long set_time3 = 0;// переменная для установки времени таймера 3-ей розетки (в милисекундах)
  173. unsigned long set_time4 = 0;// переменная для установки времени таймера 4-ой розетки (в милисекундах)
  174.  
  175. long evTime1; //переменная для снятия показания времени с millis() для начала отсчета времени таймера 1
  176. long evTime2; //переменная для снятия показания времени с millis() для начала отсчета времени таймера 2
  177. long evTime3; //переменная для снятия показания времени с millis() для начала отсчета времени таймера 3
  178. long evTime4; //переменная для снятия показания времени с millis() для начала отсчета времени таймера 4
  179.  
  180. boolean timer_start1 = 0; // 0 - таймер остановлен, 1- таймер запущен
  181. boolean timer_start2 = 0; // 0 - таймер остановлен, 1- таймер запущен
  182. boolean timer_start3 = 0; // 0 - таймер остановлен, 1- таймер запущен
  183. boolean timer_start4 = 0; // 0 - таймер остановлен, 1- таймер запущен
  184.  
  185. boolean alarm1_0; //флаг для установки 1 - ого будильника на воскресенье
  186. boolean alarm1_1; //флаг для установки 1 - ого будильника на понедельник
  187. boolean alarm1_2; //флаг для установки 1 - ого будильника на вторник
  188. boolean alarm1_3; //флаг для установки 1 - ого будильника на среда
  189. boolean alarm1_4; //флаг для установки 1 - ого будильника на четверг
  190. boolean alarm1_5; //флаг для установки 1 - ого будильника на пятница
  191. boolean alarm1_6; //флаг для установки 1 - ого будильника на суббота
  192.  
  193. boolean alarm2_0; //флаг для установки 2 - ого будильника на воскресенье
  194. boolean alarm2_1; //флаг для установки 2 - ого будильника на понедельник
  195. boolean alarm2_2; //флаг для установки 2 - ого будильника на вторник
  196. boolean alarm2_3; //флаг для установки 2 - ого будильника на среда
  197. boolean alarm2_4; //флаг для установки 2 - ого будильника на четверг
  198. boolean alarm2_5; //флаг для установки 2 - ого будильника на пятница
  199. boolean alarm2_6; //флаг для установки 2 - ого будильника на суббота
  200.  
  201. boolean alarm3_0; //флаг для установки 3 - ого будильника на воскресенье
  202. boolean alarm3_1; //флаг для установки 3 - ого будильника на понедельник
  203. boolean alarm3_2; //флаг для установки 3 - ого будильника на вторник
  204. boolean alarm3_3; //флаг для установки 3 - ого будильника на среда
  205. boolean alarm3_4; //флаг для установки 3 - ого будильника на четверг
  206. boolean alarm3_5; //флаг для установки 3 - ого будильника на пятница
  207. boolean alarm3_6; //флаг для установки 3 - ого будильника на суббота
  208.  
  209. boolean alarm4_0; //флаг для установки 4 - ого будильника на воскресенье
  210. boolean alarm4_1; //флаг для установки 4 - ого будильника на понедельник
  211. boolean alarm4_2; //флаг для установки 4 - ого будильника на вторник
  212. boolean alarm4_3; //флаг для установки 4 - ого будильника на среда
  213. boolean alarm4_4; //флаг для установки 4 - ого будильника на четверг
  214. boolean alarm4_5; //флаг для установки 4 - ого будильника на пятница
  215. boolean alarm4_6; //флаг для установки 4 - ого будильника на суббота
  216.  
  217. long buf_ss1 = 0;
  218. long buf_ss2 = 0;
  219. long buf_ss3 = 0;
  220. long buf_ss4 = 0;
  221.  
  222. int set_time1h;
  223. int set_time2h;
  224. int set_time3h;
  225. int set_time4h;
  226.  
  227.  int set_time1m;
  228. int set_time2m;
  229.  int set_time3m;
  230.  int set_time4m;
  231.  
  232.  int set_time1s;
  233.  int set_time2s;
  234.  int set_time3s;
  235.  int set_time4s;
  236.  
  237.  String bufer;
  238. byte step_mqtt_send = 0; //переменная для поочередной (по однаму сообщению за цикл loop) отправки исходящих сообщений mqtt
  239. //в ходе опытов было установленно что отправка одного исходяжего сообщения занемает не малое время, где то 500 милисек
  240. // таким образом если отправлять за раз много сообщений (около 10) то это создает длительное преривание цикла loop
  241.  
  242. WiFiClient wclient;
  243. PubSubClient client(wclient);
  244.  
  245. // Функция получения данных от сервера
  246. long eventTime; // для снятия текущего времени с начала старта.
  247. long evTimeconn;
  248. boolean flagconn = 1;// флаг для однакратного подключения к wi fi
  249. long loop_start;
  250. long loop_end;
  251. String wifi_scan = "";
  252.  
  253.  
  254. void alarm1_stat(){
  255. if(timer_on1 >=3){
  256.   time1 = "";
  257. if(timer_on1 == 3){  
  258. time1 += "выкл. в: ";
  259. }else{  
  260. time1 += "вкл. в: ";
  261. }
  262.  
  263. time1 += String(set_time1h);
  264. time1 += ':';
  265. if(set_time1m < 10)time1 += '0';
  266. time1 += String(set_time1m);
  267. time1 += "--";
  268.  
  269. if(alarm1_1 == 1)time1 += "Пн,";
  270. if(alarm1_2 == 1)time1 += "Вт,";
  271. if(alarm1_3 == 1)time1 += "Ср,";
  272. if(alarm1_4 == 1)time1 += "Чт,";
  273. if(alarm1_5 == 1)time1 += "Пт,";
  274. if(alarm1_6 == 1)time1 += "Сб,";
  275. if(alarm1_0 == 1)time1 += "Вс,";
  276.  
  277. time1 += '\n';
  278. if (client.connected())client.publish(TIME1, String (time1));
  279.  }
  280. }
  281.  
  282. void alarm2_stat(){
  283. if(timer_on2 >=3){
  284.   time2 = "";
  285. if(timer_on2 == 3){  
  286. time2 += "выкл. в: ";
  287. }else{  
  288. time2 += "вкл. в: ";
  289. }
  290.  
  291. time2 += String(set_time2h);
  292. time2 += ':';
  293. if(set_time2m < 10)time2 += '0';
  294. time2 += String(set_time2m);
  295. time2 += "--";
  296.  
  297. if(alarm2_1 == 1)time2 += "Пн,";
  298. if(alarm2_2 == 1)time2 += "Вт,";
  299. if(alarm2_3 == 1)time2 += "Ср,";
  300. if(alarm2_4 == 1)time2 += "Чт,";
  301. if(alarm2_5 == 1)time2 += "Пт,";
  302. if(alarm2_6 == 1)time2 += "Сб,";
  303. if(alarm2_0 == 1)time2 += "Вс,";
  304.  
  305. time2 += '\n';
  306. if (client.connected())client.publish(TIME2, String (time2));
  307.  }
  308. }
  309.  
  310. void alarm3_stat(){
  311. if(timer_on3 >=3){
  312.   time3 = "";
  313. if(timer_on3 == 3){  
  314. time3 += "выкл. в: ";
  315. }else{  
  316. time3 += "вкл. в: ";
  317. }
  318.  
  319. time3 += String(set_time3h);
  320. time3 += ':';
  321. if(set_time3m < 10)time3 += '0';
  322. time3 += String(set_time3m);
  323. time3 += "--";
  324.  
  325. if(alarm3_1 == 1)time3 += "Пн,";
  326. if(alarm3_2 == 1)time3 += "Вт,";
  327. if(alarm3_3 == 1)time3 += "Ср,";
  328. if(alarm3_4 == 1)time3 += "Чт,";
  329. if(alarm3_5 == 1)time3 += "Пт,";
  330. if(alarm3_6 == 1)time3 += "Сб,";
  331. if(alarm3_0 == 1)time3 += "Вс,";
  332.  
  333. time3 += '\n';
  334. if (client.connected())client.publish(TIME3, String (time3));
  335.  }
  336. }
  337.  
  338. void alarm4_stat(){
  339. if(timer_on4 >=3){
  340.   time4 = "";
  341. if(timer_on4 == 3){  
  342. time4 += "выкл. в: ";
  343. }else{  
  344. time4 += "вкл. в: ";
  345. }
  346.  
  347. time4 += String(set_time4h);
  348. time4 += ':';
  349. if(set_time4m < 10)time4 += '0';
  350. time4 += String(set_time4m);
  351. time4 += "--";
  352.  
  353. if(alarm4_1 == 1)time4 += "Пн,";
  354. if(alarm4_2 == 1)time4 += "Вт,";
  355. if(alarm4_3 == 1)time4 += "Ср,";
  356. if(alarm4_4 == 1)time4 += "Чт,";
  357. if(alarm4_5 == 1)time4 += "Пт,";
  358. if(alarm4_6 == 1)time4 += "Сб,";
  359. if(alarm4_0 == 1)time4 += "Вс,";
  360.  
  361. time4 += '\n';
  362. if (client.connected())client.publish(TIME4, String (time4));
  363.  }
  364. }
  365.  
  366.  
  367. void callback(const MQTT::Publish& pub){
  368.  
  369.   //Serial.print(pub.topic()); // выводим в сериал порт название топика
  370.   //Serial.print(" => ");
  371.   //Serial.println(pub.payload_string()); // выводим в сериал порт значение полученных данных
  372.  
  373.  
  374.   bufer = pub.payload_string();
  375.  
  376.   if (String(pub.topic()) == OUT1) // проверяем из нужного ли нам топика пришли данные
  377.   {
  378.    
  379.     int stled = bufer.toInt(); // преобразуем полученные данные в тип integer
  380.     digitalWrite(16, stled); // включаем или выключаем светодиод в зависимоти от полученных значений данных
  381.     if (digitalRead(16) == HIGH) {
  382.       client.publish(STAT1, String ("выкл."));
  383.       if (timer_on1 == 1) {
  384.         evTime1 = millis();
  385.         timer_start1 = 0;
  386.       }
  387.     } else {
  388.       client.publish(STAT1, String ("вкл."));
  389.       if (timer_on1 == 2) {
  390.         evTime1 = millis();
  391.         timer_start1 = 0;
  392.       }
  393.     }
  394.  
  395.   }
  396.   //delay(1);
  397.   if (String(pub.topic()) == OUT2) // проверяем из нужного ли нам топика пришли данные
  398.   {
  399.    
  400.     int stled = bufer.toInt(); // преобразуем полученные данные в тип integer
  401.     digitalWrite(14, stled); // включаем или выключаем светодиод в зависимоти от полученных значений данных
  402.     if (digitalRead(14) == HIGH) {
  403.       client.publish(STAT2, String ("выкл."));
  404.       if (timer_on2 == 1) {
  405.         evTime2 = millis();
  406.         timer_start2 = 0;
  407.       }
  408.     } else {
  409.       client.publish(STAT2, String ("вкл."));
  410.       if (timer_on2 == 2) {
  411.         evTime2 = millis();
  412.         timer_start2 = 0;
  413.       }
  414.     }
  415.    
  416.   }
  417.   //delay(1);
  418.   if (String(pub.topic()) == OUT3) // проверяем из нужного ли нам топика пришли данные
  419.   {
  420.    
  421.     int stled = bufer.toInt(); // преобразуем полученные данные в тип integer
  422.     digitalWrite(12, stled); // включаем или выключаем светодиод в зависимоти от полученных значений данных
  423.     if (digitalRead(12) == HIGH) {
  424.       client.publish(STAT3, String ("выкл."));
  425.       if (timer_on3 == 1) {
  426.         evTime3 = millis();
  427.         timer_start3 = 0;
  428.       }
  429.     } else {
  430.       client.publish(STAT3, String ("вкл."));
  431.       if (timer_on3 == 2) {
  432.         evTime3 = millis();
  433.         timer_start3 = 0;
  434.       }
  435.     }
  436.    
  437.   }
  438.   //delay(1);
  439.   if (String(pub.topic()) == OUT4) // проверяем из нужного ли нам топика пришли данные
  440.   {
  441.    
  442.     int stled = bufer.toInt(); // преобразуем полученные данные в тип integer
  443.     digitalWrite(13, stled); // включаем или выключаем светодиод в зависимоти от полученных значений данных
  444.     if (digitalRead(13) == HIGH) {
  445.       client.publish(STAT4, String ("выкл."));
  446.       if (timer_on4 == 1) {
  447.         evTime4 = millis();
  448.         timer_start4 = 0;
  449.       }
  450.     } else {
  451.       client.publish(STAT4, String ("вкл."));
  452.       if (timer_on4 == 2) {
  453.         evTime4 = millis();
  454.         timer_start4 = 0;
  455.       }
  456.     }
  457.    
  458.   }
  459.  
  460.   //delay(1);
  461.  
  462.   if (String(pub.topic()) == DEF1) // проверяем из нужного ли нам топика пришли данные
  463.   {
  464.    
  465.     int buf_def1 = bufer.toInt(); // преобразуем полученные данные в тип integer
  466.     if (EEPROM.read(115) != buf_def1)EEPROM.write(115, buf_def1); // записываем значение состояние розетки 1 "по умолчанию" в 1 ячейку eeprom
  467.     EEPROM.commit();
  468.   }
  469.   //delay(1);
  470.  
  471.   if (String(pub.topic()) == DEF2) // проверяем из нужного ли нам топика пришли данные
  472.   {
  473.    
  474.     int buf_def2 = bufer.toInt(); // преобразуем полученные данные в тип integer
  475.     if (EEPROM.read(117) != buf_def2)EEPROM.write(117, buf_def2); // записываем значение состояние розетки 2 "по умолчанию" в 3 ячейку eeprom
  476.     EEPROM.commit();
  477.   }
  478.   //delay(1);
  479.   if (String(pub.topic()) == DEF3) // проверяем из нужного ли нам топика пришли данные
  480.   {
  481.    
  482.     int buf_def3 = bufer.toInt(); // преобразуем полученные данные в тип integer
  483.     if (EEPROM.read(119) != buf_def3)EEPROM.write(119, buf_def3); // записываем значение состояние розетки 2 "по умолчанию" в 3 ячейку eeprom
  484.     EEPROM.commit();
  485.   }
  486.   //delay(1);
  487.   if (String(pub.topic()) == DEF4) // проверяем из нужного ли нам топика пришли данные
  488.   {
  489.    
  490.     int buf_def4 = bufer.toInt(); // преобразуем полученные данные в тип integer
  491.     if (EEPROM.read(121) != buf_def4)EEPROM.write(121, buf_def4); // записываем значение состояние розетки 2 "по умолчанию" в 3 ячейку eeprom
  492.     EEPROM.commit();
  493.   }
  494.  // delay(1);
  495.  
  496.   if (String(pub.topic()) == TIMER_ON1) {
  497.     int stled = bufer.toInt(); // преобразуем полученные данные в тип integer
  498.     timer_on1 = stled;
  499.     //delay(1);
  500.     if(timer_on1 >= 3)alarm1_stat();
  501.   }
  502.  
  503.   if (String(pub.topic()) == TIMER_ON2) {
  504.     int stled = bufer.toInt(); // преобразуем полученные данные в тип integer
  505.     timer_on2 = stled;
  506.    // delay(1);
  507.    if(timer_on2 >= 3)alarm2_stat();
  508.   }
  509.  
  510.   if (String(pub.topic()) == TIMER_ON3) {
  511.     int stled = bufer.toInt(); // преобразуем полученные данные в тип integer
  512.     timer_on3 = stled;
  513.     //delay(1);
  514.     if(timer_on3 >= 3)alarm3_stat();
  515.   }
  516.  
  517.   if (String(pub.topic()) == TIMER_ON4) {
  518.     int stled = bufer.toInt(); // преобразуем полученные данные в тип integer
  519.     timer_on4 = stled;
  520.     //delay(1);
  521.     if(timer_on4 >= 3)alarm4_stat();
  522.   }
  523.  
  524.  
  525.  
  526.   if (String(pub.topic()) == SET_TIME_1H) { // установка часов таймера
  527.     //delay(100);
  528.     set_time1h = bufer.toInt(); // преобразуем полученные данные в тип integer
  529. //delay(1);
  530. if(timer_on1 >= 3)alarm1_stat();
  531.   }
  532.  
  533.   if (String(pub.topic()) == SET_TIME_2H) {// установка часов таймера
  534.     //delay(100);
  535.     set_time2h = bufer.toInt(); // преобразуем полученные данные в тип integer
  536. //delay(1);
  537. if(timer_on2 >= 3)alarm2_stat();
  538.   }
  539.  
  540.   if (String(pub.topic()) == SET_TIME_3H) {// установка часов таймера
  541.     //delay(100);
  542.     set_time3h = bufer.toInt(); // преобразуем полученные данные в тип integer
  543. //delay(1);
  544. if(timer_on3 >= 3)alarm3_stat();
  545.   }
  546.  
  547.   if (String(pub.topic()) == SET_TIME_4H) {// установка часов таймера
  548.     //delay(100);
  549.     set_time4h = bufer.toInt(); // преобразуем полученные данные в тип integer
  550. //delay(1);
  551.  if(timer_on4 >= 3)alarm4_stat();
  552.   }
  553.  
  554.  
  555.  
  556.  
  557.   if (String(pub.topic()) == SET_TIME_1M) { //установка минут таймера
  558.     //delay(100);
  559.     set_time1m = bufer.toInt(); // преобразуем полученные данные в тип integer
  560. //delay(1);
  561. if(timer_on1 >= 3)alarm1_stat();
  562.   }
  563.  
  564.   if (String(pub.topic()) == SET_TIME_2M) {//установка минут таймера
  565.     //delay(100);
  566.     set_time2m = bufer.toInt(); // преобразуем полученные данные в тип integer
  567. //delay(1);
  568. if(timer_on2 >= 3)alarm2_stat();
  569.   }
  570.  
  571.   if (String(pub.topic()) == SET_TIME_3M) {//установка минут таймера
  572.     //delay(100);
  573.     set_time3m = bufer.toInt(); // преобразуем полученные данные в тип integer
  574. //delay(1);
  575. if(timer_on3 >= 3)alarm3_stat();
  576.   }
  577.  
  578.   if (String(pub.topic()) == SET_TIME_4M) {//установка минут таймера
  579.     //delay(100);
  580.     set_time4m = bufer.toInt(); // преобразуем полученные данные в тип integer
  581. //delay(1);
  582. if(timer_on4 >= 3)alarm4_stat();
  583.   }
  584.  
  585.  
  586.  
  587.  
  588.   if (String(pub.topic()) == SET_TIME_1S) {//установка секунд таймера
  589.     //delay(100);
  590.     set_time1s = bufer.toInt(); // преобразуем полученные данные в тип integer
  591. //delay(1);
  592.   }
  593.  
  594.   if (String(pub.topic()) == SET_TIME_2S) {//установка секунд таймера
  595.     //delay(100);
  596.     set_time2s = bufer.toInt(); // преобразуем полученные данные в тип integer
  597. //delay(1);
  598.   }
  599.  
  600.   if (String(pub.topic()) == SET_TIME_3S) {//установка секунд таймера
  601.     //delay(100);
  602.     set_time3s = bufer.toInt(); // преобразуем полученные данные в тип integer
  603. //delay(1);
  604.   }
  605.  
  606.   if (String(pub.topic()) == SET_TIME_4S) {//установка секунд таймера
  607.     //delay(100);
  608.     set_time4s = bufer.toInt(); // преобразуем полученные данные в тип integer
  609. //delay(1);
  610.   }
  611.  
  612. if (String(pub.topic()) == WEEKDEY1) {
  613. int buf = bufer.toInt();
  614. if(buf == 0){
  615.  alarm1_0 = !alarm1_0;
  616.  EEPROM.write(123, alarm1_0);// сохраняем в 123 ячеку флаг установки дня недели воскресенье для 1-ого будильника
  617.  EEPROM.commit(); //подтверждаем сохранение
  618. }
  619. if(buf == 1){
  620.  alarm1_1 = !alarm1_1;
  621.  EEPROM.write(124, alarm1_1);
  622.  EEPROM.commit();  
  623. }
  624. if(buf == 2){
  625.  alarm1_2 = !alarm1_2;
  626.  EEPROM.write(125, alarm1_2);
  627.  EEPROM.commit();  
  628. }
  629. if(buf == 3){
  630.  alarm1_3 = !alarm1_3;
  631.  EEPROM.write(126, alarm1_3);// сохраняем в 126 ячеку флаг установки дня недели среда для 1-ого будильника
  632.  EEPROM.commit(); //подтверждаем сохранение
  633. }
  634. if(buf == 4){
  635.  alarm1_4 = !alarm1_4;
  636.  EEPROM.write(127, alarm1_4);// сохраняем в 127 ячеку флаг установки дня недели четверг для 1-ого будильника
  637.  EEPROM.commit(); //подтверждаем сохранение
  638. }
  639. if(buf == 5){
  640.  alarm1_5 = !alarm1_5;
  641.  EEPROM.write(128, alarm1_5);// сохраняем в 128 ячеку флаг установки дня недели пятница для 1-ого будильника
  642.  EEPROM.commit(); //подтверждаем сохранение
  643. }
  644. if(buf == 6){
  645.  alarm1_6 = !alarm1_6;
  646.  EEPROM.write(129, alarm1_6);// сохраняем в 129 ячеку флаг установки дня недели суббота для 1-ого будильника
  647.  EEPROM.commit(); //подтверждаем сохранение
  648. }
  649. alarm1_stat();
  650. }
  651.  
  652.  if (String(pub.topic()) == WEEKDEY2) {
  653. int buf = bufer.toInt();
  654. if(buf == 0){
  655.  alarm2_0 = !alarm2_0;
  656.  EEPROM.write(130, alarm2_0);// сохраняем в 130 ячеку флаг установки дня недели воскресенье для 2-ого будильника
  657.  EEPROM.commit(); //подтверждаем сохранение
  658. }
  659. if(buf == 1){
  660.  alarm2_1 = !alarm2_1;
  661.  EEPROM.write(131, alarm2_1);// сохраняем в 131 ячеку флаг установки дня недели понедельник для 2-ого будильника
  662.  EEPROM.commit(); //подтверждаем сохранение  
  663. }
  664. if(buf == 2){
  665.  alarm2_2 = !alarm2_2;
  666.  EEPROM.write(132, alarm2_2);// сохраняем в 132 ячеку флаг установки дня недели вторник для 2-ого будильника
  667.  EEPROM.commit(); //подтверждаем сохранение  
  668. }
  669. if(buf == 3){
  670.  alarm2_3 = !alarm2_3;
  671.  EEPROM.write(133, alarm2_3);// сохраняем в 133 ячеку флаг установки дня недели среда для 2-ого будильника
  672.  EEPROM.commit(); //подтверждаем сохранение  
  673. }
  674. if(buf == 4){
  675.  alarm2_4 = !alarm2_4;
  676.  EEPROM.write(134, alarm2_4);// сохраняем в 134 ячеку флаг установки дня недели четверг для 2-ого будильника
  677.  EEPROM.commit(); //подтверждаем сохранение  
  678. }
  679. if(buf == 5){
  680.  alarm2_5 = !alarm2_5;
  681.  EEPROM.write(135, alarm2_5);// сохраняем в 135 ячеку флаг установки дня недели пятница для 2-ого будильника
  682.  EEPROM.commit(); //подтверждаем сохранение  
  683. }
  684. if(buf == 6){
  685.  alarm2_6 = !alarm2_6;
  686.  EEPROM.write(136, alarm2_6);// сохраняем в 136 ячеку флаг установки дня недели суббота для 2-ого будильника
  687.  EEPROM.commit(); //подтверждаем сохранение  
  688. }
  689. alarm2_stat();
  690. }
  691.  
  692. if (String(pub.topic()) == WEEKDEY3) {
  693. int buf = bufer.toInt();
  694. if(buf == 0){
  695.  alarm3_0 = !alarm3_0;
  696.  EEPROM.write(137, alarm3_0);// сохраняем в 137 ячеку флаг установки дня недели воскресенье для 3-ого будильника
  697.  EEPROM.commit(); //подтверждаем сохранение  
  698. }
  699. if(buf == 1){
  700.  alarm3_1 = !alarm3_1;
  701.  EEPROM.write(138, alarm3_1);// сохраняем в 138 ячеку флаг установки дня недели понедельник для 3-ого будильника
  702.  EEPROM.commit(); //подтверждаем сохранение  
  703. }
  704. if(buf == 2){
  705.  alarm3_2 = !alarm3_2;
  706.  EEPROM.write(139, alarm3_2);// сохраняем в 139 ячеку флаг установки дня недели вторник для 3-ого будильника
  707.  EEPROM.commit(); //подтверждаем сохранение  
  708. }
  709. if(buf == 3){
  710.  alarm3_3 = !alarm3_3;
  711.  EEPROM.write(140, alarm3_3);// сохраняем в 140 ячеку флаг установки дня недели среда для 3-ого будильника
  712.  EEPROM.commit(); //подтверждаем сохранение  
  713. }
  714. if(buf == 4){
  715.  alarm3_4 = !alarm3_4;
  716.  EEPROM.write(141, alarm3_4);// сохраняем в 141 ячеку флаг установки дня недели четверг для 3-ого будильника
  717.  EEPROM.commit(); //подтверждаем сохранение  
  718. }
  719. if(buf == 5){
  720.  alarm3_5 = !alarm3_5;
  721.  EEPROM.write(142, alarm3_5);// сохраняем в 142 ячеку флаг установки дня недели пятница для 3-ого будильника
  722.  EEPROM.commit(); //подтверждаем сохранение  
  723. }
  724. if(buf == 6){
  725.  alarm3_6 = !alarm3_6;
  726.  EEPROM.write(143, alarm3_6);// сохраняем в 143 ячеку флаг установки дня недели суббота для 3-ого будильника
  727.  EEPROM.commit(); //подтверждаем сохранение  
  728. }
  729. alarm3_stat();
  730. }
  731.  
  732. if (String(pub.topic()) == WEEKDEY4) {
  733. int buf = bufer.toInt();
  734. if(buf == 0){
  735.  alarm4_0 = !alarm4_0;
  736.  EEPROM.write(144, alarm4_0);// сохраняем в 144 ячеку флаг установки дня недели воскресенье для 4-ого будильника
  737.  EEPROM.commit(); //подтверждаем сохранение  
  738. }
  739. if(buf == 1){
  740.  alarm4_1 = !alarm4_1;
  741.  EEPROM.write(145, alarm4_1);// сохраняем в 145 ячеку флаг установки дня недели понедельник для 4-ого будильника
  742.  EEPROM.commit(); //подтверждаем сохранение  
  743. }
  744. if(buf == 2){
  745.  alarm4_2 = !alarm4_2;
  746.  EEPROM.write(146, alarm4_2);// сохраняем в 146 ячеку флаг установки дня недели вторник для 4-ого будильника
  747.  EEPROM.commit(); //подтверждаем сохранение
  748. }
  749. if(buf == 3){
  750.  alarm4_3 = !alarm4_3;
  751.  EEPROM.write(147, alarm4_3);// сохраняем в 147 ячеку флаг установки дня недели среда для 4-ого будильника
  752.  EEPROM.commit(); //подтверждаем сохранение
  753. }
  754. if(buf == 4){
  755.  alarm4_4 = !alarm4_4;
  756.  EEPROM.write(148, alarm4_4);// сохраняем в 148 ячеку флаг установки дня недели четверг для 4-ого будильника
  757.  EEPROM.commit(); //подтверждаем сохранение
  758. }
  759. if(buf == 5){
  760.  alarm4_5 = !alarm4_5;
  761.  EEPROM.write(149, alarm4_5);// сохраняем в 149 ячеку флаг установки дня недели пятница для 4-ого будильника
  762.  EEPROM.commit(); //подтверждаем сохранение
  763. }
  764. if(buf == 6){
  765.  alarm4_6 = !alarm4_6;
  766.  EEPROM.write(150, alarm4_6);// сохраняем в 150 ячеку флаг установки дня недели суббота для 4-ого будильника
  767.  EEPROM.commit(); //подтверждаем сохранение
  768. }
  769. alarm4_stat();
  770. }
  771. }
  772.  
  773. void handleRoot() {
  774.   String str = "";
  775.   str += html_header;
  776.   str += "<p><font size=\"5\"><font style=\"background-color:#ffffff;\">Удлиннитель. Настройки подключения к WiFi.</font></font></p>\n\r";
  777.   str += "<p><font size=\"4\"><font style=\"background-color:#ffffff;\">Текущий сохранненный Wi-Fi NET:   ";  
  778.   if(len_ssid < 32){
  779.     str += ssid;
  780.   }else{
  781.     str += "не установлен";
  782.   }
  783.   str += "</font></font></p>\n\r";
  784.   str += "<p><font size=\"4\"><font style=\"background-color:#5CD862;\">Список доступных Wi-Fi сетей: (обновляется только при первом включении!)</font></font></p>\n\r";
  785.   str += wifi_scan;
  786.   str += "<body>\
  787.   <form method=\"POST\" action=\"ok\">\
  788.     <input name=\"ssid\"> WIFI Net</br></br>\
  789.     <input name=\"pswd\"> Password</br></br>\
  790.     <input name=\"mqtt_server\"> URL MQTT Server</br></br>\
  791.     <input name=\"mqtt_port\"> MQTT PORT</br></br>\
  792.     <input name=\"mqtt_user\"> MQTT USER</br></br>\
  793.     <input name=\"mqtt_pass\"> MQTT PASSWORD</br></br>\
  794.     <input type=SUBMIT value=\"Save settings\">\
  795.   </form>\
  796. </body>\
  797. </html>";
  798.   server.send ( 200, "text/html", str );
  799. }
  800.  
  801.  
  802. void handleOk() {
  803.   String ssid_ap;
  804.   String pass_ap;
  805.  
  806.   String mqtt_server_;
  807.   String mqtt_user_;
  808.   String mqtt_pass_;
  809.   String mqtt_port_;
  810.  
  811.   String str = "";
  812.   str += html_header;
  813.   str += "<body>";
  814.  
  815.   //EEPROM.begin(512);
  816.  
  817.   ssid_ap = server.arg(0);
  818.   pass_ap = server.arg(1);
  819.  
  820.   mqtt_server_ = server.arg(2);
  821.   mqtt_port_ = server.arg(3);
  822.   mqtt_user_ = server.arg(4);
  823.   mqtt_pass_ = server.arg(5);
  824.  
  825.   if (ssid_ap != "") {
  826.     EEPROM.write(96, ssid_ap.length());    
  827.     EEPROM.write(97, pass_ap.length());
  828.  
  829.     EEPROM.write(400, mqtt_server_.length());
  830.     EEPROM.write(401, mqtt_port_.length());
  831.     EEPROM.write(402, mqtt_user_.length());
  832.     EEPROM.write(403, mqtt_pass_.length());
  833.    
  834.    
  835.     for (byte i = 0; i < ssid_ap.length(); i++)
  836.       EEPROM.write(i, ssid_ap.charAt(i));
  837.    
  838.    
  839.     for (byte i = 0; i < pass_ap.length(); i++)
  840.       EEPROM.write(i + 32, pass_ap.charAt(i));
  841.  
  842. delay(10);    
  843.    
  844.     for (byte i = 0; i <= mqtt_server_.length(); i++){
  845.     EEPROM.write(404 + i, mqtt_server_.charAt(i));  
  846.     }
  847.  
  848. delay(10);
  849.    
  850.     for (byte i = 0; i < mqtt_port_.length(); i++){
  851.     EEPROM.write(436 + i, mqtt_port_.charAt(i));  //остовляем 32 символа для mqtt_server выше
  852.     }
  853.  
  854. delay(10);
  855.    
  856.     for (byte i = 0; i <= mqtt_user_.length(); i++){
  857.     EEPROM.write(441 + i, mqtt_user_.charAt(i));  //остовляем 32 символа для mqtt_server выше и 5 символов для mqtt_port
  858.     }
  859.  
  860. delay(10);
  861.    
  862.     for (byte i = 0; i <= mqtt_pass_.length(); i++){
  863.     EEPROM.write(457 + i, mqtt_pass_.charAt(i));  //остовляем 32 символа для mqtt_server выше и 5 символов для mqtt_port, и еще 16 символов для mqtt_user
  864.     }
  865.      
  866.     EEPROM.commit();
  867.     EEPROM.end();
  868.     red_led_blink = 1; // запускаем мигание красным свето-диодом
  869.     Serial.println("Configuration saved in FLASH");
  870.     str += "Configuration saved in FLASH</br>\
  871.   Changes applied after reboot</p></br></br>\
  872.   <a href=\"/\">Return</a> to settings page</br>";
  873.   } else {
  874.     str += "No WIFI Net</br>\
  875.   <a href=\"/\">Return</a> to settings page</br>";
  876.   }
  877.   str += "</body></html>";
  878.   server.send ( 200, "text/html", str );
  879.  
  880.  
  881. }
  882.  
  883. void http_server() {
  884.   MDNS.begin(host);
  885.   httpUpdater.setup(&server);
  886.  
  887.   server.on("/", handleRoot);
  888.   server.on("/ok", handleOk);
  889.   server.begin();
  890.  
  891.   MDNS.addService("http", "tcp", 80);
  892.   Serial.printf("HTTPUpdateServer ready! Open http://%s.local/update in your browser\n", host);
  893.  
  894.   delay(100);
  895.   Serial.println("HTTP server started");
  896.   delay(20);
  897.   ////////////////////////для часов///////////////////////
  898.   Serial.println("Starting UDP");
  899.   udp.begin(localPort);
  900.   Serial.print("Local port: ");
  901.   Serial.println(udp.localPort());
  902. }
  903.  
  904. void WiFi_AP() {
  905.   //WiFi.mode(WIFI_AP);
  906.   // if ( WiFi.status() != WL_CONNECTED || len_ssid > 32) {
  907.  
  908.   Serial.print("Configuring access point...");
  909.   /* You can remove the password parameter if you want the AP to be open. */
  910.   WiFi.softAP(ssid_ap, pass_ap);// запуск точки доступа
  911.  
  912.   //delay(2000);
  913.   Serial.println("done");
  914.   IPAddress myIP = WiFi.softAPIP();
  915.   Serial.print("AP IP address: ");
  916.   Serial.println(myIP);
  917.  
  918.  
  919.   digitalWrite(led_g, LOW);
  920.   //http_server();
  921.   //}
  922. }
  923.  
  924. void WiFi_STA() {
  925.    
  926.  if (flagconn == 1) {
  927.    evTimeconn = millis();
  928.   flagconn = 0;
  929.   WiFi_AP();// то запускаем точу доступа, раз уж пытаемся подключится к wi-fi роутару
  930.  }
  931.  
  932.   if ((millis() - evTimeconn > 500 && millis() - evTimeconn < 1000)) {    
  933.     digitalWrite(led_g, LOW);
  934.  
  935.   }
  936.  
  937.   if ((millis() - evTimeconn > 1000 && millis() - evTimeconn < 1500)) {    
  938.     digitalWrite(led_g, HIGH);
  939.  
  940.   }
  941.   if (millis() - evTimeconn > 1500 && millis() - evTimeconn < 2000) {    
  942.     digitalWrite(led_g, LOW);
  943.  
  944.   }
  945.   if (millis() - evTimeconn > 2000) {
  946.     if (flagconn == 0)evTimeconn = millis();    
  947.       Serial.print("Connecting to...");
  948.       Serial.println(ssid);
  949.      
  950.       WiFi.begin(ssid.c_str(), pass.c_str()); // пробуем подключится к роутару
  951.       delay(10);
  952.     digitalWrite(led_g, HIGH);
  953.   }
  954.  
  955.   if (WiFi.status() == WL_CONNECTED) {
  956.     digitalWrite(led_g, HIGH);
  957.     Serial.println("WiFi connected");
  958.     Serial.print("Connected to ");
  959.     Serial.println(ssid);
  960.     Serial.print("IP address: ");
  961.     Serial.println(WiFi.localIP());
  962.     flagconn == 1;//для возврата таймера для следующих попытках подключится к wi-fi после разрыва подключения
  963.     http_server();
  964.   }
  965.  
  966. }
  967.  
  968. void WiFi_Scan(){
  969.   WiFi.disconnect();
  970.   delay(10);
  971.   int n = WiFi.scanNetworks();
  972.   wifi_scan = "";
  973.   //wifi_scan += "сканирование wi-fi сетей выполнено ";
  974.   if (n == 0){
  975.     wifi_scan += "<p><font size=\"4\"><font style=\"background-color:#EF2A2A;\">";
  976.     wifi_scan += "нет доступных wi-fi сетей";
  977.     wifi_scan += "</font></font></p>\n\r";
  978.   }else
  979.   {
  980.     wifi_scan += "<p><font size=\"4\"><font style=\"background-color:#3CDB53;\">";
  981.     wifi_scan += (n);
  982.     wifi_scan += " найдено сетей wi-fi";
  983.     wifi_scan += "</font></font></p>\n\r";
  984.     for (int i = 0; i < n; ++i)
  985.     {
  986.       // Print SSID and RSSI for each network found
  987.       wifi_scan += "<p><font size=\"3\"><font style=\"background-color:#888CD9;\">"; //формирует начало html строки
  988.       wifi_scan += (i + 1);
  989.       wifi_scan += ": ";
  990.       wifi_scan += (WiFi.SSID(i));
  991.       wifi_scan += (" (");
  992.       wifi_scan += (WiFi.RSSI(i));
  993.       wifi_scan += (")");
  994.       wifi_scan += ((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
  995.      wifi_scan += "</font></font></p>\n\r";// формирует оканчание html строки
  996.       delay(10);
  997.     }
  998.   }  
  999. }
  1000.  
  1001.  
  1002. void setup(void) {
  1003.   delay(2000);
  1004.   pinMode(16, OUTPUT);
  1005.   pinMode(14, OUTPUT);
  1006.   pinMode(12, OUTPUT);
  1007.   pinMode(13, OUTPUT);
  1008.  
  1009.   digitalWrite(16, HIGH);
  1010.   digitalWrite(14, HIGH);
  1011.   digitalWrite(12, HIGH);
  1012.   digitalWrite(13, HIGH);
  1013.  
  1014.  
  1015.  
  1016.   pinMode(led_r, OUTPUT);
  1017.   pinMode(led_g, OUTPUT);
  1018.   digitalWrite(led_r, LOW);
  1019.   digitalWrite(led_g, LOW);
  1020.  
  1021.   EEPROM.begin(512); // размер eeprom памяти 512 байт
  1022.  
  1023.   def1 = EEPROM.read(115);
  1024.   def2 = EEPROM.read(117);
  1025.   def3 = EEPROM.read(119);
  1026.   def4 = EEPROM.read(121);
  1027.  
  1028.   delay(100);
  1029.   if (def1 == 1) digitalWrite(16, HIGH); // состояние розетки 1 "по умолчанию" - выключено
  1030.   if (def1 == 0) digitalWrite(16, LOW); // состояние розетки 1 "по умолчанию" - включено
  1031.   if (def1 == 2) digitalWrite(16, EEPROM.read(116)); // состояние розетки 1 "по умолчанию" - последнее состояние до выключения напряжения
  1032.  
  1033.   if (def2 == 1) digitalWrite(14, HIGH); // состояние розетки 2 "по умолчанию" - выключено
  1034.   if (def2 == 0) digitalWrite(14, LOW); // состояние розетки 2 "по умолчанию" - включено
  1035.   if (def2 == 2) digitalWrite(14, EEPROM.read(118)); // состояние розетки 2 "по умолчанию" - последнее состояние до выключения напряжения
  1036.  
  1037.   if (def3 == 1) digitalWrite(12, HIGH); // состояние розетки 3 "по умолчанию" - выключено
  1038.   if (def3 == 0) digitalWrite(12, LOW); // состояние розетки 3 "по умолчанию" - включено
  1039.   if (def3 == 2) digitalWrite(12, EEPROM.read(120)); //состояние розетки 3 "по умолчанию" - последнее состояние до выключения напряжения
  1040.  
  1041.   if (def4 == 1) digitalWrite(13, HIGH); // состояние розетки 4 "по умолчанию" - выключено
  1042.   if (def4 == 0) digitalWrite(13, LOW); // состояние розетки 4 "по умолчанию" - включено
  1043.   if (def4 == 2) digitalWrite(13, EEPROM.read(122)); //состояние розетки 4 "по умолчанию" - последнее состояние до выключения напряжения
  1044.   delay(1);
  1045.   alarm1_0 = EEPROM.read(123); //восстанавливаем флаг дня недели на восскресение для 1-ого будильника
  1046.   alarm1_1 = EEPROM.read(124); //восстанавливаем флаг дня недели на понедельник для 1-ого будильника
  1047.   alarm1_2 = EEPROM.read(125); //восстанавливаем флаг дня недели на вторник для 1-ого будильника
  1048.   alarm1_3 = EEPROM.read(126); //восстанавливаем флаг дня недели на среда для 1-ого будильника
  1049.   alarm1_4 = EEPROM.read(127); //восстанавливаем флаг дня недели на четверг для 1-ого будильника
  1050.   alarm1_5 = EEPROM.read(128); //восстанавливаем флаг дня недели на пятница для 1-ого будильника
  1051.   alarm1_6 = EEPROM.read(129); //восстанавливаем флаг дня недели на суббота для 1-ого будильника
  1052.  
  1053.   alarm2_0 = EEPROM.read(130); //восстанавливаем флаг дня недели на восскресение для 2-ого будильника
  1054.   alarm2_1 = EEPROM.read(131); //восстанавливаем флаг дня недели на понедельник для 2-ого будильника
  1055.   alarm2_2 = EEPROM.read(132); //восстанавливаем флаг дня недели на вторник для 2-ого будильника
  1056.   alarm2_3 = EEPROM.read(133); //восстанавливаем флаг дня недели на среда для 2-ого будильника
  1057.   alarm2_4 = EEPROM.read(134); //восстанавливаем флаг дня недели на четверг для 2-ого будильника
  1058.   alarm2_5 = EEPROM.read(135); //восстанавливаем флаг дня недели на пятница для 2-ого будильника
  1059.   alarm2_6 = EEPROM.read(136); //восстанавливаем флаг дня недели на суббота для 2-ого будильника
  1060.  
  1061.   alarm3_0 = EEPROM.read(137); //восстанавливаем флаг дня недели на восскресение для 3-ого будильника
  1062.   alarm3_1 = EEPROM.read(138); //восстанавливаем флаг дня недели на понедельник для 3-ого будильника
  1063.   alarm3_2 = EEPROM.read(139); //восстанавливаем флаг дня недели на вторник для 3-ого будильника
  1064.   alarm3_3 = EEPROM.read(140); //восстанавливаем флаг дня недели на среда для 3-ого будильника
  1065.   alarm3_4 = EEPROM.read(141); //восстанавливаем флаг дня недели на четверг для 3-ого будильника
  1066.   alarm3_5 = EEPROM.read(142); //восстанавливаем флаг дня недели на пятница для 3-ого будильника
  1067.   alarm3_6 = EEPROM.read(143); //восстанавливаем флаг дня недели на суббота для 3-ого будильника
  1068.  
  1069.   alarm4_0 = EEPROM.read(144); //восстанавливаем флаг дня недели на восскресение для 4-ого будильника
  1070.   alarm4_1 = EEPROM.read(145); //восстанавливаем флаг дня недели на понедельник для 4-ого будильника
  1071.   alarm4_2 = EEPROM.read(146); //восстанавливаем флаг дня недели на вторник для 4-ого будильника
  1072.   alarm4_3 = EEPROM.read(147); //восстанавливаем флаг дня недели на среда для 4-ого будильника
  1073.   alarm4_4 = EEPROM.read(148); //восстанавливаем флаг дня недели на четверг для 4-ого будильника
  1074.   alarm4_5 = EEPROM.read(149); //восстанавливаем флаг дня недели на пятница для 4-ого будильника
  1075.   alarm4_6 = EEPROM.read(150); //восстанавливаем флаг дня недели на суббота для 4-ого будильника
  1076.  
  1077.   Serial.begin(115200);
  1078.   delay(1);
  1079.   Serial.println();
  1080.   Serial.println();
  1081.  
  1082.  
  1083.   len_ssid = EEPROM.read(96);
  1084.   len_pass = EEPROM.read(97);
  1085.  
  1086.  
  1087.   if (len_pass > 64) len_pass = 0;
  1088.   //Serial.print("len_ssid = ");
  1089.   //Serial.println(len_ssid);
  1090.  
  1091.   if ((len_ssid < 33) && (len_ssid != 0)) {
  1092.    
  1093.    
  1094.  
  1095.     for (byte i = 0; i < len_ssid; i++)ssid += char(EEPROM.read(i));
  1096.     delay(1);
  1097.    
  1098.    
  1099.     for (byte i = 0; i < len_pass; i++)pass += char(EEPROM.read(i + 32));
  1100.     delay(1);
  1101.     Serial.print("SSID: ");
  1102.     Serial.println(ssid);
  1103.  
  1104.     Serial.print("Password: ");//off
  1105.     Serial.println(pass);//off
  1106.  
  1107.    
  1108.     len_mqtt_server = EEPROM.read(400);
  1109.     len_mqtt_port = EEPROM.read(401);
  1110.     len_mqtt_user = EEPROM.read(402);
  1111.     len_mqtt_pass = EEPROM.read(403);
  1112.  
  1113.     if(len_mqtt_server <= 32){// восстанавливаем url mqtt сервера, но только если длинна len_mqtt_server менее 32 символа
  1114.       for(byte i = 0; i <= len_mqtt_server; i++)mqtt_server += char(EEPROM.read(404 + i));
  1115.     }
  1116.     delay(10);
  1117.    
  1118.     String mqtt_port_ = "";
  1119.     if(len_mqtt_port < 6){//восстанавливаем mqqt порт, но только если длинна менее 6 символов
  1120.       for(byte i = 0; i < len_mqtt_port; i++)mqtt_port_ += char(EEPROM.read(436 + i));    
  1121.     }
  1122.     delay(10);
  1123.     mqtt_port = mqtt_port_.toInt();
  1124.    
  1125.     if(len_mqtt_user <= 16){//восстанавливаем mqqt user
  1126.     for(byte i = 0; i <= len_mqtt_user; i++)mqtt_user += char(EEPROM.read(441 + i));
  1127.     delay(10);
  1128.     }
  1129.    
  1130.     if(len_mqtt_pass <= 32){
  1131.     for(byte i = 0; i <= len_mqtt_pass; i++)mqtt_pass += char(EEPROM.read(457 + i));
  1132.     delay(10);
  1133.     }
  1134.   }
  1135.  
  1136.  
  1137.     Serial.print("MQTT SERVER : ");
  1138.     Serial.println(mqtt_server);
  1139.  
  1140.     Serial.print("MQTT port : ");
  1141.     Serial.println(mqtt_port);
  1142.    
  1143.     Serial.print("MQTT user : ");
  1144.     Serial.println(mqtt_user);
  1145.  
  1146.     Serial.print("MQTT pass : ");
  1147.     Serial.println(mqtt_pass);
  1148.    
  1149. // Режим STATION  
  1150. WiFi.mode( WIFI_STA);
  1151. WiFi_Scan();
  1152.  
  1153. if (len_ssid > 32) { // для первого запуска если не сохранены ssid & pass
  1154.   digitalWrite(led_r, HIGH);
  1155.     WiFi.mode(WIFI_AP);
  1156.     WiFi_AP();    
  1157.   }
  1158.  
  1159.  http_server();
  1160.  
  1161.     digitalWrite(led_g, LOW);
  1162.     digitalWrite(led_r, LOW);
  1163.  client.set_server(mqtt_server, mqtt_port);
  1164.   mySwitch.enableReceive(4);  // радиоприемник подключен к gpio 4
  1165.   eventTime = millis();
  1166.   evTimeClock = millis(); // для обновления часов
  1167.   start_sinh = millis();//для часов, старт интервала с момента удачного онлайн обновления
  1168.   evTimeconn = millis();// для wi-fi подключения раз в 2 секунды если не подключено
  1169. }
  1170.  
  1171. // запрашиваем у NTP сервера время
  1172. unsigned long sendNTPpacket(IPAddress& address)
  1173. {
  1174.   Serial.println("sending NTP packet...");
  1175.   // set all bytes in the buffer to 0
  1176.   memset(packetBuffer, 0, NTP_PACKET_SIZE);
  1177.   // Initialize values needed to form NTP request
  1178.   // (see URL above for details on the packets)
  1179.   packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  1180.   packetBuffer[1] = 0;     // Stratum, or type of clock
  1181.   packetBuffer[2] = 6;     // Polling Interval
  1182.   packetBuffer[3] = 0xEC;  // Peer Clock Precision
  1183.   // 8 bytes of zero for Root Delay & Root Dispersion
  1184.   packetBuffer[12]  = 49;
  1185.   packetBuffer[13]  = 0x4E;
  1186.   packetBuffer[14]  = 49;
  1187.   packetBuffer[15]  = 52;
  1188.  
  1189.   // all NTP fields have been given values, now
  1190.   // you can send a packet requesting a timestamp:
  1191.   udp.beginPacket(address, 123); //NTP requests are to port 123
  1192.   udp.write(packetBuffer, NTP_PACKET_SIZE);
  1193.   udp.endPacket();
  1194.   delay(1);
  1195. }
  1196.  
  1197.  
  1198. void receiv_time_clock() {
  1199.   int cb = udp.parsePacket();
  1200.   if (!cb || WiFi.status() != WL_CONNECTED) {
  1201.    
  1202.       secsSince1900 = secsSince1900_2 + ((millis()  - start_sinh)/1000);//часы оффлайн
  1203.       evTimeClock = millis();
  1204.      
  1205.     Serial.println("no packet yet");    
  1206.   }else {
  1207.    
  1208.    
  1209.    
  1210.    
  1211.     Serial.print("packet received, length=");
  1212.     Serial.println(cb);  
  1213.     // We've received a packet, read the data from it
  1214.     udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
  1215.     //the timestamp starts at byte 40 of the received packet and is four bytes,
  1216.     // or two words, long. First, esxtract the two words:
  1217.      highWord = word(packetBuffer[40], packetBuffer[41]);
  1218.      lowWord = word(packetBuffer[42], packetBuffer[43]);
  1219.     // combine the four bytes (two words) into a long integer
  1220.     // this is NTP time (seconds since Jan 1 1900):
  1221.     secsSince1900 = (highWord << 16 | lowWord) + ((millis()  - evTimeClock)/1000);
  1222.     secsSince1900_2 = secsSince1900;
  1223.     start_sinh = millis();
  1224.     evTimeClock = millis();
  1225.     }
  1226.  
  1227.  
  1228.  
  1229.    
  1230.  
  1231.    
  1232.     Serial.print("Seconds since Jan 1 1900 = " );
  1233.     Serial.println(secsSince1900);
  1234.  
  1235.     // now convert NTP time into everyday time:
  1236.     Serial.print("Unix time = ");
  1237.     // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
  1238.     const unsigned long seventyYears = 2208988800UL;
  1239.    
  1240.     // subtract seventy years:
  1241.     epoch = (secsSince1900 - seventyYears) + (3600 * GMT);
  1242.     // print Unix time:
  1243.     Serial.println(epoch);
  1244.  
  1245.  
  1246.     count_day = epoch / 86400L;// прошедшее количество дней с 1 яанваря 1970 года
  1247.     Serial.print("count day on Jan 1 1970: ");
  1248.     Serial.println(count_day);
  1249.    
  1250.     year = 1970;// старт отсчета лет
  1251.     for (int i = 0; i <= count_day; i ++) {
  1252.  
  1253.       if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400) == 0) { //если год високосный
  1254.         v_year = 366; // то количество дней в високосном году 366      
  1255.       } else {
  1256.         v_year = 365;//иначе количество дней в НЕ високосном году 365      
  1257.       }
  1258.  
  1259.       if (i <= v_year) {
  1260.         next_year = v_year;
  1261.       }
  1262.  
  1263.       if (i == next_year) {
  1264.         year++;
  1265.         if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400) == 0) { //если год високосный
  1266.         v_year = 366; // то количество дней в високосном году 366      
  1267.       } else {
  1268.         v_year = 365;//иначе количество дней в НЕ високосном году 365      
  1269.       }
  1270.         next_year = next_year + v_year;
  1271.       }
  1272.     }
  1273. delay(1);
  1274.     count_day_curent_year = (count_day - (next_year - v_year))+1; // сколько прошло дней сначала этого (текущего) года (не полных, наверное по этому +1).
  1275.    
  1276.     month = 1;
  1277. for(int m = 0; m <= count_day_curent_year; m ++){
  1278.   if(month == 1)month_days = 31;
  1279.  
  1280.   if(m <= month_days)next_month = month_days;
  1281.  
  1282.   if(m > next_month){
  1283.   month ++;
  1284.   if(v_year == 366 && month == 2)month_days = 29;
  1285.   if(v_year == 365 && month == 2)month_days = 28;
  1286.   if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month ==  12)month_days = 31;
  1287.   if(month == 4 || month == 6 || month == 9 || month == 11)month_days = 30;
  1288.    
  1289.   next_month = next_month + month_days;
  1290.    
  1291.   }  
  1292. }
  1293.  
  1294. day = count_day_curent_year - (next_month - month_days);
  1295.     Serial.print("count_day_curent_year: ");
  1296.     Serial.println(count_day_curent_year);
  1297.    
  1298.     Serial.print("Tekushchiy god visokosnay?: ");    
  1299.     if(v_year == 365)Serial.println("No");
  1300.     if(v_year == 366)Serial.println("Yes");
  1301.  
  1302.    // Serial.print("next_year: "); //количество дней с 1970 года 1 яанваря, что бы начался новый год или закончился текущий
  1303.    // Serial.println(next_year);
  1304.    
  1305.    // Serial.print("next_month: ");// количество дней с начала текущего года, для того что бы начался новый месяц или закончился текущий
  1306.    // Serial.println(next_month);
  1307.    
  1308.    // Serial.print("year: "); //текущий год
  1309.    // Serial.println(year);
  1310.  
  1311.     //Serial.print("month: "); //текущий месяц
  1312.    // Serial.println(month);
  1313.  
  1314.    // Serial.print("day: "); //текущий день месяца
  1315.    // Serial.println(day);
  1316.  
  1317.     weekday = (count_day - 3) % 7;
  1318.    // Serial.print("weekday: "); //день недели
  1319.    // Serial.println(weekday);
  1320.    curent_time = "";
  1321.            
  1322.   // Serial.print(day);
  1323.    curent_time += String(day);
  1324.    curent_time += ".";
  1325.    
  1326.   // Serial.print(" / ");
  1327.    //curent_time += String(month);
  1328.    if(month == 1)curent_time += "яан.";
  1329.    if(month == 2)curent_time += "фев.";
  1330.    if(month == 3)curent_time += "март";
  1331.    if(month == 4)curent_time += "апр.";
  1332.    if(month == 5)curent_time += "май";
  1333.    if(month == 6)curent_time += "июнь";
  1334.    if(month == 7)curent_time += "июль";
  1335.    if(month == 8)curent_time += "авг.";
  1336.    if(month == 9)curent_time += "сен.";
  1337.    if(month == 10)curent_time += "окт.";
  1338.    if(month == 11)curent_time += "ноя.";
  1339.    if(month == 12)curent_time += "дек.";
  1340.   // Serial.print(month);
  1341.    curent_time += ".";
  1342.   // Serial.print(" / ");
  1343.    curent_time += String(year);
  1344.   // Serial.print(year);
  1345.    curent_time += " --";
  1346.    if(weekday == 0)curent_time += "Вс";
  1347.    if(weekday == 1)curent_time += "Пн";
  1348.    if(weekday == 2)curent_time += "Вт";
  1349.    if(weekday == 3)curent_time += "Ср";
  1350.    if(weekday == 4)curent_time += "Чт";
  1351.    if(weekday == 5)curent_time += "Пт";
  1352.    if(weekday == 6)curent_time += "Сб";
  1353.    curent_time += "-- ";
  1354.   // Serial.print(" ---- ");
  1355.        
  1356.     // вывод часов минут секунд:
  1357.    // Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
  1358.    // Serial.print((epoch  % 86400L) / 3600); // вывод часов (86400 секунд в дне)
  1359.     curent_time += String((epoch  % 86400L) / 3600);
  1360.     curent_time += ":";
  1361.    // Serial.print(':');
  1362.     if ( ((epoch % 3600) / 60) < 10 ) {
  1363.       // отображение нуля перед минутами, если их меньше 10
  1364.       curent_time += "0";
  1365.      // Serial.print('0');
  1366.     }
  1367.     curent_time += String((epoch  % 3600) / 60);
  1368.     //Serial.print((epoch  % 3600) / 60); // вывод минут (3600 секунд в одном часе)
  1369.     curent_time += ":";
  1370.     //Serial.print(':');
  1371.     if ( (epoch % 60) < 10 ) {
  1372.       // отображение нуля перед секундами, если их меньше 10
  1373.       curent_time += "0";
  1374.      // Serial.print('0');
  1375.     }
  1376.     curent_time += String(epoch % 60);
  1377.     curent_time += '\n';
  1378.     //Serial.println(epoch % 60); // вывод секунд
  1379.  
  1380.    Serial.println(String(curent_time));
  1381.    if (client.connected())client.publish(CURENT_TIME, String (curent_time));
  1382.    delay(10);
  1383.   }
  1384.  
  1385.  
  1386. void RF_Reciver(){
  1387.   if (mySwitch.available()) {
  1388.  
  1389.     int value = mySwitch.getReceivedValue();
  1390.     if (client.connected())client.publish("relay/RF_code", String (value));
  1391.     delay(5);
  1392.     if (value == KEY_A) {// код клавиши А
  1393.       digitalWrite(16, !digitalRead(16)); // включаем или выключаем светодиод в зависимоти от полученных значений данных
  1394.       mySwitch.resetAvailable();
  1395.       if (client.connected()) { // если подключен к mqtt
  1396.         if (digitalRead(16) == HIGH) {
  1397.           // client.publish("relay/stat1", String ("выкл."));
  1398.           client.publish(OUT1, String ("1"));
  1399.           if (timer_on1 == 1) {
  1400.             evTime1 = millis();
  1401.             timer_start1 = 0;
  1402.           }
  1403.         } else {
  1404.           // client.publish("relay/stat1", String ("вкл."));
  1405.           client.publish(OUT1, String ("0"));
  1406.           if (timer_on1 == 2) {
  1407.             evTime1 = millis();
  1408.             timer_start1 = 0;
  1409.           }
  1410.         }
  1411.         delay(100);
  1412.       }
  1413.     }
  1414.     if (value == KEY_B) {// код клавиши В
  1415.       digitalWrite(14, !digitalRead(14)); // включаем или выключаем светодиод в зависимоти от полученных значений данных
  1416.       mySwitch.resetAvailable();
  1417.       if (client.connected()) { // если подключен к mqtt
  1418.         if (digitalRead(14) == HIGH) {
  1419.           // client.publish("relay/stat2", String ("выкл."));
  1420.           client.publish(OUT2, String ("1"));
  1421.           if (timer_on2 == 1) {
  1422.             evTime2 = millis();
  1423.             timer_start2 = 0;
  1424.           }
  1425.         } else {
  1426.           // client.publish("relay/stat2", String ("вкл."));
  1427.           client.publish(OUT2, String ("0"));
  1428.           if (timer_on2 == 2) {
  1429.             evTime2 = millis();
  1430.             timer_start2 = 0;
  1431.           }
  1432.         }
  1433.         delay(100);
  1434.       }
  1435.     }
  1436.     if (value == KEY_C) {// код клавиши С
  1437.       digitalWrite(12, !digitalRead(12)); // включаем или выключаем светодиод в зависимоти от полученных значений данных
  1438.       mySwitch.resetAvailable();
  1439.       if (client.connected()) { // если подключен к mqtt
  1440.         if (digitalRead(12) == HIGH) {
  1441.           // client.publish("relay/stat3", String ("выкл."));
  1442.           client.publish(OUT3, String ("1"));
  1443.           if (timer_on3 == 1) {
  1444.             evTime3 = millis();
  1445.             timer_start3 = 0;
  1446.           }
  1447.         } else {
  1448.           //client.publish("relay/stat3", String ("вкл."));
  1449.           client.publish(OUT3, String ("0"));
  1450.           if (timer_on3 == 2) {
  1451.             evTime3 = millis();
  1452.             timer_start3 = 0;
  1453.           }
  1454.         }
  1455.         delay(100);
  1456.       }
  1457.     }
  1458.     if (value == KEY_D) { // код клавиши D
  1459.       digitalWrite(13, !digitalRead(13)); // включаем или выключаем светодиод в зависимоти от полученных значений данных
  1460.       mySwitch.resetAvailable();
  1461.       if (client.connected()) { // если подключен к mqtt
  1462.         if (digitalRead(13) == HIGH) {
  1463.           // client.publish("relay/stat4", String ("выкл."));
  1464.           client.publish(OUT4, String ("1"));
  1465.           if (timer_on4 == 1) {
  1466.             evTime4 = millis();
  1467.             timer_start4 = 0;
  1468.           }
  1469.         } else {
  1470.           // client.publish("relay/stat4", String ("вкл."));
  1471.           client.publish(OUT4, String ("0"));
  1472.           if (timer_on4 == 2) {
  1473.             evTime4 = millis();
  1474.             timer_start4 = 0;
  1475.           }
  1476.         }
  1477.         delay(100);
  1478.       }
  1479.     }
  1480.    if (value == KEY_AB){
  1481.     mySwitch.resetAvailable();
  1482.     ESP.reset(); // перезагрузка модуля
  1483.     delay(1000);
  1484.    }
  1485.  
  1486.    if (value == KEY_AC){
  1487.     mySwitch.resetAvailable();
  1488.     for(int i = 0; i < 32; i++)EEPROM.write(i, 255); //стирает ssid
  1489.     delay(100);
  1490.     for(int i = 0; i < 64; i++)EEPROM.write(i + 32, 255);// стирает pass
  1491.     delay(100);
  1492.     for(int i = 0; i < 100; i++)EEPROM.write(i + 400, 255);//стирает все ячейки памяти с 400 по 499, здесь хранятся настройки mqtt
  1493.     EEPROM.write(96, 255);// стирает длину ssid
  1494.     EEPROM.write(97, 255);// стирает длину pass
  1495.     EEPROM.commit();
  1496.     delay(1000);
  1497.     ESP.reset(); // перезагрузка модуля
  1498.     delay(1000);
  1499.    }
  1500.     mySwitch.resetAvailable();  
  1501.   }
  1502. delay(1);
  1503. }
  1504.  
  1505. void loop() {
  1506.  
  1507. loop_start = millis();
  1508. //=================при разрывах wi-fi и для подключения к wi-fi ===========================
  1509.   if (WiFi.status() != WL_CONNECTED && len_ssid < 33) { // при разрывах wi-fi подключения
  1510.     //WiFi.mode(WIFI_OFF);
  1511.     //WiFi.printDiag(Serial);
  1512.     WiFi.mode(WIFI_AP_STA);
  1513.     WiFi_STA();
  1514.     digitalWrite(led_r, LOW);
  1515.   }
  1516. //==================для часов ======================================================================
  1517. if ((millis() - evTimeClock) >= 9900 && state_clock == 1) {// через 10 сек повторяем все сначало.
  1518.     if(WiFi.status() == WL_CONNECTED){
  1519.     WiFi.hostByName(ntpServerName, timeServerIP);
  1520.     sendNTPpacket(timeServerIP); // запрашиваем у NTP сервера время
  1521.     }
  1522.     state_clock = 2;
  1523.   }
  1524.  
  1525.   if ((millis() - evTimeClock) >= 10000 && state_clock == 2) { //ждем секундачку пока NTP сервер ответит сколько время натикало :)
  1526.     receiv_time_clock();
  1527.     state_clock = 1;
  1528.     }
  1529. //========================================================================================================      
  1530.    RF_Reciver();
  1531. //========для перевода установок слайдеров из часов + секунд + минут в милисекунды для таймеров  =================    
  1532.  //if(timer_on1 != 0){
  1533.   set_time1 = set_time1h * 3600000 + set_time1m * 60000 + set_time1s * 1000;
  1534.   delay(1);
  1535.  //}
  1536.  
  1537. //if(timer_on2 != 0){
  1538.   set_time2 = set_time2h * 3600000 + set_time2m * 60000 + set_time2s * 1000;
  1539.   delay(1);
  1540. //}
  1541.  
  1542. //if(timer_on3 != 0){
  1543.   set_time3 = set_time3h * 3600000 + set_time3m * 60000 + set_time3s * 1000;
  1544.   delay(1);
  1545.  //}
  1546.  
  1547.  //if(timer_on4 != 0){
  1548.   set_time4 = set_time4h * 3600000 + set_time4m * 60000 + set_time4s * 1000;
  1549.   delay(1);
  1550.  //}
  1551.  //==================================================================================
  1552.   server.handleClient();
  1553.  
  1554.   // подключаемся к MQTT серверу
  1555.   if (WiFi.status() == WL_CONNECTED) {
  1556.     digitalWrite(led_g, HIGH);
  1557.     WiFi.mode(WIFI_STA);
  1558.    
  1559.     if (!client.connected()) {
  1560.       Serial.println("Connecting to MQTT server ....");// попытка подключится к MQTT брокеру
  1561.       delay(1);
  1562.       if (!client.connected() && len_mqtt_server != 255 && len_mqtt_server != 0){
  1563.       client.connect(MQTT::Connect("Wi-Fi_relay")
  1564.                           .set_clean_session()
  1565.                          .set_auth(mqtt_user, mqtt_pass)
  1566.                          .set_keepalive(30)
  1567.                          );
  1568.       }
  1569.        if (client.connected()){
  1570.         Serial.println("Connected to MQTT server");// удачно подключился к mqtt брокеру
  1571.         digitalWrite(led_r, HIGH);
  1572.         client.set_max_retries(8);//Установите максимальное число повторных попыток при ожидании пакетов ответа
  1573.         client.set_callback(callback);
  1574.         client.subscribe(OUT1); // подписывааемся по топик с данными для реле 1
  1575.         client.subscribe(OUT2); // подписывааемся по топик с данными для реле 2
  1576.         client.subscribe(OUT3); // подписывааемся по топик с данными для реле 3
  1577.         client.subscribe(OUT4); // подписывааемся по топик с данными для реле 4
  1578.  delay(1);
  1579.         client.subscribe(DEF1); // подписывааемся на топик с данными состояния розетки 1 "по умолчанию"
  1580.         client.subscribe(DEF2); // подписывааемся на топик с данными состояния розетки 2 "по умолчанию"
  1581.         client.subscribe(DEF3); // подписывааемся на топик с данными состояния розетки 3 "по умолчанию"
  1582.         client.subscribe(DEF4); // подписывааемся на топик с данными состояния розетки 4 "по умолчанию"
  1583.        
  1584.  delay(1);
  1585.  
  1586.         client.subscribe(TIMER_ON1); // подписатся на топик с данными для вкл \ выкл таймера
  1587.         client.subscribe(TIMER_ON2); // подписатся на топик с данными для вкл \ выкл таймера
  1588.         client.subscribe(TIMER_ON3); // подписатся на топик с данными для вкл \ выкл таймера
  1589.         client.subscribe(TIMER_ON4); // подписатся на топик с данными для вкл \ выкл таймера
  1590.  delay(1);
  1591.         client.subscribe(SET_TIME_1H); // подписатся на топик с данными для установки времени таймера 1
  1592.         client.subscribe(SET_TIME_2H); // подписатся на топик с данными для установки времени таймера 2
  1593.         client.subscribe(SET_TIME_3H); // подписатся на топик с данными для установки времени таймера 3
  1594.         client.subscribe(SET_TIME_4H); // подписатся на топик с данными для установки времени таймера 4
  1595.  delay(1);
  1596.         client.subscribe(SET_TIME_1M); // подписатся на топик с данными для установки времени таймера 1
  1597.         client.subscribe(SET_TIME_2M); // подписатся на топик с данными для установки времени таймера 2
  1598.         client.subscribe(SET_TIME_3M); // подписатся на топик с данными для установки времени таймера 3
  1599.         client.subscribe(SET_TIME_4M); // подписатся на топик с данными для установки времени таймера 4
  1600.  delay(1);
  1601.         client.subscribe(SET_TIME_1S); // подписатся на топик с данными для установки времени таймера 1
  1602.         client.subscribe(SET_TIME_2S); // подписатся на топик с данными для установки времени таймера 2
  1603.         client.subscribe(SET_TIME_3S); // подписатся на топик с данными для установки времени таймера 3
  1604.         client.subscribe(SET_TIME_4S); // подписатся на топик с данными для установки времени таймера 4
  1605.  delay(1);        
  1606.         client.subscribe(WEEKDEY1); //подписка на топик установки дней недели 1-ого будильника
  1607.         client.subscribe(WEEKDEY2); //подписка на топик установки дней недели 2-ого будильника
  1608.         client.subscribe(WEEKDEY3); //подписка на топик установки дней недели 3-ого будильника
  1609.         client.subscribe(WEEKDEY4); //подписка на топик установки дней недели 4-ого будильника
  1610.       } else {
  1611.         Serial.println("Could not connect to MQTT server");
  1612.         digitalWrite(led_r, LOW);
  1613.       }
  1614.  
  1615.     }
  1616.  delay(1);
  1617.    
  1618.   }
  1619.  // RF_Reciver();
  1620.   if (red_led_blink == 1) { //мигаем красным, если настройки ssid и pass сохранены в eeprom
  1621.     digitalWrite(led_r, LOW);
  1622.     delay(1000);
  1623.     digitalWrite(led_r, HIGH);
  1624.     delay(1000);
  1625.   }
  1626.   delay(1);
  1627.  
  1628.  
  1629.   ////////////////////////////////////////////для старта всех таймеров.///////////////////////////////////
  1630.   if (timer_on1 > 0 && timer_on1 < 3) {
  1631.     if (digitalRead(16) == LOW && timer_on1 == 1 && timer_start1 == 0) { //запуск таймера на выключение розетки
  1632.       evTime1 = millis();
  1633.       timer_start1 = 1;
  1634.      
  1635.     }
  1636.     if (digitalRead(16) == HIGH && timer_on1 == 2 && timer_start1 == 0) { //запуск таймера на включение розетки
  1637.       evTime1 = millis();
  1638.       timer_start1 = 1;
  1639.      
  1640.     }
  1641.   }
  1642. delay(1);
  1643.   if (timer_on2 > 0 && timer_on2 < 3) {
  1644.     if (digitalRead(14) == LOW && timer_on2 == 1 && timer_start2 == 0) { //запуск таймера на выключение розетки
  1645.       evTime2 = millis();
  1646.       timer_start2 = 1;
  1647.      
  1648.     }
  1649.     if (digitalRead(14) == HIGH && timer_on2 == 2 && timer_start2 == 0) { //запуск таймера на включение розетки
  1650.       evTime2 = millis();
  1651.       timer_start2 = 1;
  1652.      
  1653.     }
  1654.   }
  1655.   delay(1);
  1656.  
  1657.   if (timer_on3 > 0 && timer_on3 < 3) {
  1658.     if (digitalRead(12) == LOW && timer_on3 == 1 && timer_start3 == 0) { //запуск таймера на выключение розетки
  1659.       evTime3 = millis();
  1660.       timer_start3 = 1;
  1661.      
  1662.     }
  1663.     if (digitalRead(12) == HIGH && timer_on3 == 2 && timer_start3 == 0) { //запуск таймера на включение розетки
  1664.       evTime3 = millis();
  1665.       timer_start3 = 1;
  1666.      
  1667.     }
  1668.   }
  1669. delay(1);
  1670.   if (timer_on4 > 0 && timer_on4 < 3) {
  1671.     if (digitalRead(13) == LOW && timer_on4 == 1 && timer_start4 == 0) { //запуск таймера на выключение розетки
  1672.       evTime4 = millis();
  1673.       timer_start4 = 1;
  1674.      
  1675.     }
  1676.     if (digitalRead(13) == HIGH && timer_on4 == 2 && timer_start4 == 0) { //запуск таймера на включение розетки
  1677.       evTime4 = millis();
  1678.       timer_start4 = 1;
  1679.      
  1680.     }
  1681.   }
  1682.   delay(1);
  1683. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1684.  
  1685.  
  1686.  
  1687.  
  1688.   /////////////////////////////////////////////для остановки всех таймеров//////////////////////////////////
  1689.   if (digitalRead(16) == LOW && timer_on1 == 1 && timer_start1 == 1 && (millis() - evTime1 > set_time1)) { //
  1690.     digitalWrite(16, HIGH);
  1691.     if (client.connected()) {
  1692.       client.publish(STAT1, String ("выкл."));
  1693.       client.publish(MQTT::Publish(TIMER_ON1, String ("0"))
  1694.                                       .set_retain(1)
  1695.                                       //.set_qos(1)
  1696.                                       //.set_dup()
  1697.                                       );
  1698.     }
  1699.     //evTime1 = millis();
  1700.     timer_start1 = 0;
  1701.     timer_on1 = 0;
  1702.    
  1703.   }
  1704.   delay(1);
  1705.  
  1706.   if (digitalRead(16) == HIGH && timer_on1 == 2 && timer_start1 == 1 && (millis() - evTime1 > set_time1)) { //
  1707.     digitalWrite(16, LOW);
  1708.     if (client.connected()) {
  1709.       client.publish(STAT1, String ("вкл."));
  1710.       client.publish(MQTT::Publish(TIMER_ON1, String ("0"))
  1711.       .set_retain(1)
  1712.       );
  1713.     }
  1714.     //evTime1 = millis();
  1715.     timer_start1 = 0;
  1716.     timer_on1 = 0;
  1717.    
  1718.   }
  1719.   delay(1);
  1720.  
  1721.   if (digitalRead(14) == LOW && timer_on2 == 1 && timer_start2 == 1 && (millis() - evTime2 > set_time2)) { //
  1722.     digitalWrite(14, HIGH);
  1723.     if (client.connected()) {
  1724.       client.publish(STAT2, String ("выкл."));
  1725.       client.publish(MQTT::Publish(TIMER_ON2, String ("0"))
  1726.       .set_retain(1)
  1727.       );
  1728.     }
  1729.     //evTime2 = millis();
  1730.     timer_start2 = 0;
  1731.     timer_on2 = 0;
  1732.    
  1733.   }
  1734.   delay(1);
  1735.   if (digitalRead(14) == HIGH && timer_on2 == 2 && timer_start2 == 1 && (millis() - evTime2 > set_time2)) { //
  1736.     digitalWrite(14, LOW);
  1737.     if (client.connected()) {
  1738.       client.publish(STAT2, String ("вкл."));
  1739.       client.publish(MQTT::Publish(TIMER_ON2, String ("0"))
  1740.       .set_retain(1)
  1741.       );
  1742.     }
  1743.     //evTime2 = millis();
  1744.     timer_start2 = 0;
  1745.     timer_on2 = 0;
  1746.    
  1747.   }
  1748.   delay(1);
  1749.  
  1750.   if (digitalRead(12) == LOW && timer_on3 == 1 && timer_start3 == 1 && (millis() - evTime3 > set_time3)) { //
  1751.     digitalWrite(12, HIGH);
  1752.     if (client.connected()) {
  1753.       client.publish(STAT3, String ("выкл."));
  1754.       client.publish(MQTT::Publish(TIMER_ON3, String ("0"))
  1755.      .set_retain(1)
  1756.       );
  1757.     }
  1758.     //evTime3 = millis();
  1759.     timer_start3 = 0;
  1760.     timer_on3 = 0;
  1761.    
  1762.   }
  1763.   delay(1);
  1764.   if (digitalRead(12) == HIGH && timer_on3 == 2 && timer_start3 == 1 && (millis() - evTime3 > set_time3)) { //
  1765.     digitalWrite(12, LOW);
  1766.     if (client.connected()) {
  1767.       client.publish(STAT3, String ("вкл."));
  1768.       client.publish(MQTT::Publish(TIMER_ON3, String ("0"))
  1769.       .set_retain(1)
  1770.       );
  1771.     }
  1772.     //evTime3 = millis();
  1773.     timer_start3 = 0;
  1774.     timer_on3 = 0;
  1775.    
  1776.   }
  1777.   delay(1);
  1778.  
  1779.   if (digitalRead(13) == LOW && timer_on4 == 1 && timer_start4 == 1 && (millis() - evTime4 > set_time4)) { //
  1780.     digitalWrite(13, HIGH);
  1781.     if (client.connected()) {
  1782.       client.publish(STAT4, String ("выкл."));
  1783.       client.publish(MQTT::Publish(TIMER_ON4, String ("0"))
  1784.       .set_retain(1)
  1785.       );
  1786.     }
  1787.     //evTime4 = millis();
  1788.     timer_start4 = 0;
  1789.     timer_on4 = 0;
  1790.    
  1791.   }
  1792. delay(1);
  1793.  
  1794.   if (digitalRead(13) == HIGH && timer_on4 == 2 && timer_start4 == 1 && (millis() - evTime4 > set_time4)) { //
  1795.     digitalWrite(13, LOW);
  1796.     if (client.connected()) {
  1797.       client.publish(STAT4, String ("вкл."));
  1798.       client.publish(MQTT::Publish(TIMER_ON4, String ("0"))
  1799.       .set_retain(1)
  1800.       );
  1801.     }
  1802.     //evTime4 = millis();
  1803.     timer_start4 = 0;
  1804.     timer_on4 = 0;
  1805.    
  1806.   }
  1807.   delay(1);
  1808. //RF_Reciver();
  1809.  
  1810. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1811.  
  1812.  
  1813.  
  1814.  
  1815. ////////////////////////////////для сработки всех будильников/////////////////////////////////////////////
  1816. if(timer_on1 >= 3 && timer_start1 == 0 && ((epoch  % 86400L) / 3600) == set_time1h && (epoch  % 3600) / 60 == set_time1m){// будильник для упр. розетки 1
  1817. if(weekday == 1 && alarm1_1 == 1 ){ //понедельник
  1818. if(timer_on1 == 3){
  1819.   digitalWrite(16, HIGH); //выключаем 1 реле
  1820.   if(client.connected()){
  1821.   client.publish(STAT1, String ("выкл."));
  1822.      
  1823. }
  1824. }
  1825. if(timer_on1 == 4){
  1826.   digitalWrite(16, LOW); //включаем 1 реле
  1827.   if(client.connected()){
  1828.   client.publish(STAT1, String ("вкл."));
  1829.      
  1830. }
  1831. }
  1832. alarm1_1 = 0;
  1833. if(EEPROM.read(124) != alarm1_1){
  1834. EEPROM.write(124, alarm1_1);
  1835. EEPROM.commit();
  1836. }
  1837. alarm1_stat();
  1838.  
  1839. }
  1840.  
  1841. if(weekday == 2 && alarm1_2 == 1 ){ //вторник
  1842. if(timer_on1 == 3){
  1843.   digitalWrite(16, HIGH); //выключаем 1 реле
  1844.   if(client.connected()){
  1845.   client.publish(STAT1, String ("выкл."));
  1846.      
  1847. }
  1848. }
  1849. if(timer_on1 == 4){
  1850.   digitalWrite(16, LOW); //включаем 1 реле
  1851.   if(client.connected()){
  1852.   client.publish(STAT1, String ("вкл."));
  1853.      
  1854. }
  1855. }
  1856. alarm1_2 = 0;
  1857. if(EEPROM.read(125) != alarm1_2){
  1858. EEPROM.write(125, alarm1_2);
  1859. EEPROM.commit();
  1860. }
  1861. alarm1_stat();
  1862.  
  1863. }
  1864.  
  1865. if(weekday == 3 && alarm1_3 == 1 ){ //среда
  1866. if(timer_on1 == 3){
  1867.   digitalWrite(16, HIGH); //выключаем 1 реле
  1868.   if(client.connected()){
  1869.   client.publish(STAT1, String ("выкл."));
  1870.      
  1871. }
  1872. }
  1873. if(timer_on1 == 4){
  1874.   digitalWrite(16, LOW); //включаем 1 реле
  1875.   if(client.connected()){
  1876.   client.publish(STAT1, String ("вкл."));
  1877.      
  1878. }
  1879. }
  1880. alarm1_3 = 0;
  1881. if(EEPROM.read(126) != alarm1_3){
  1882. EEPROM.write(126, alarm1_3);
  1883. EEPROM.commit();
  1884. }
  1885. alarm1_stat();
  1886.  
  1887. }
  1888.  
  1889. if(weekday == 4 && alarm1_4 == 1 ){//четверг
  1890. if(timer_on1 == 3){
  1891.   digitalWrite(16, HIGH); //выключаем 1 реле
  1892.   if(client.connected()){
  1893.   client.publish(STAT1, String ("выкл."));
  1894.      
  1895. }
  1896. }
  1897. if(timer_on1 == 4){
  1898.   digitalWrite(16, LOW); //включаем 1 реле
  1899.   if(client.connected()){
  1900.   client.publish(STAT1, String ("вкл."));
  1901.      
  1902. }
  1903. }
  1904. alarm1_4 = 0;
  1905. if(EEPROM.read(127) != alarm1_4){
  1906. EEPROM.write(127, alarm1_4);
  1907. EEPROM.commit();
  1908. }
  1909. alarm1_stat();
  1910.  
  1911. }
  1912.  
  1913. if(weekday == 5 && alarm1_5 == 1 ){// пятница
  1914. if(timer_on1 == 3){
  1915.   digitalWrite(16, HIGH); //выключаем 1 реле
  1916.   if(client.connected()){
  1917.   client.publish(STAT1, String ("выкл."));
  1918.      
  1919. }
  1920. }
  1921. if(timer_on1 == 4){
  1922.   digitalWrite(16, LOW); //включаем 1 реле
  1923.   if(client.connected()){
  1924.   client.publish(STAT1, String ("вкл."));
  1925.      
  1926. }
  1927. }
  1928. alarm1_5 = 0;
  1929. if(EEPROM.read(128) != alarm1_5){
  1930. EEPROM.write(128, alarm1_5);
  1931. EEPROM.commit();
  1932. }
  1933. alarm1_stat();
  1934.  
  1935. }
  1936. if(weekday == 6 && alarm1_6 == 1 ){//суббота
  1937. if(timer_on1 == 3){
  1938.   digitalWrite(16, HIGH); //выключаем 1 реле
  1939.   if(client.connected()){
  1940.   client.publish(STAT1, String ("выкл."));
  1941.      
  1942. }
  1943. }
  1944. if(timer_on1 == 4){
  1945.   digitalWrite(16, LOW); //включаем 1 реле
  1946.   if(client.connected()){
  1947.   client.publish(STAT1, String ("вкл."));
  1948.      
  1949. }
  1950. }
  1951. alarm1_6 = 0;
  1952. if(EEPROM.read(129) != alarm1_6){
  1953. EEPROM.write(129, alarm1_6);
  1954. EEPROM.commit();
  1955. }
  1956. alarm1_stat();
  1957.  
  1958. }
  1959.  
  1960. if(weekday == 0 && alarm1_0 == 1 ){//воскресенье
  1961. if(timer_on1 == 3){
  1962.   digitalWrite(16, HIGH); //выключаем 1 реле
  1963.   if(client.connected()){
  1964.   client.publish(STAT1, String ("выкл."));
  1965.      
  1966. }
  1967. }
  1968. if(timer_on1 == 4){
  1969.   digitalWrite(16, LOW); //выключаем 1 реле
  1970.   if(client.connected()){
  1971.   client.publish(STAT1, String ("вкл."));
  1972.      
  1973. }
  1974. }
  1975. alarm1_0 = 0;
  1976. if(EEPROM.read(123) != alarm1_0){
  1977. EEPROM.write(123, alarm1_0);
  1978. EEPROM.commit();
  1979. }
  1980. alarm1_stat();
  1981.  
  1982. }
  1983. }
  1984.  
  1985. delay(1);
  1986. if(timer_on2 >= 3 && timer_start2 == 0 && ((epoch  % 86400L) / 3600) == set_time2h && (epoch  % 3600) / 60 == set_time2m){// будильник для упр. розетки 2
  1987. if(weekday == 1 && alarm2_1 == 1 ){ //понедельник
  1988. if(timer_on2 == 3){
  1989.   digitalWrite(14, HIGH); //выключаем 1 реле
  1990.   if(client.connected()){
  1991.   client.publish(STAT2, String ("выкл."));
  1992.      
  1993. }
  1994. }
  1995. if(timer_on2 == 4){
  1996.   digitalWrite(14, LOW); //включаем 1 реле
  1997.   if(client.connected()){
  1998.   client.publish(STAT2, String ("вкл."));
  1999.      
  2000. }
  2001. }
  2002. alarm2_1 = 0;
  2003. if(EEPROM.read(131) != alarm2_1){
  2004. EEPROM.write(131, alarm2_1);
  2005. EEPROM.commit();
  2006. }
  2007. alarm2_stat();
  2008.  
  2009. }
  2010.  
  2011. if(weekday == 2 && alarm2_2 == 1 ){ //вторник
  2012. if(timer_on2 == 3){
  2013.   digitalWrite(14, HIGH); //выключаем 1 реле
  2014.   if(client.connected()){
  2015.   client.publish(STAT2, String ("выкл."));
  2016.      
  2017. }
  2018. }
  2019. if(timer_on2 == 4){
  2020.   digitalWrite(14, LOW); //включаем 1 реле
  2021.   if(client.connected()){
  2022.   client.publish(STAT2, String ("вкл."));
  2023.      
  2024. }
  2025. }
  2026. alarm2_2 = 0;
  2027. if(EEPROM.read(132) != alarm2_2){
  2028. EEPROM.write(132, alarm2_2);
  2029. EEPROM.commit();
  2030. }
  2031. alarm2_stat();
  2032.  
  2033. }
  2034.  
  2035. if(weekday == 3 && alarm2_3 == 1 ){ //среда
  2036. if(timer_on2 == 3){
  2037.   digitalWrite(14, HIGH); //выключаем 1 реле
  2038.   if(client.connected()){
  2039.   client.publish(STAT2, String ("выкл."));
  2040.      
  2041. }
  2042. }
  2043. if(timer_on2 == 4){
  2044.   digitalWrite(14, LOW); //включаем 1 реле
  2045.   if(client.connected()){
  2046.   client.publish(STAT2, String ("вкл."));
  2047.      
  2048. }
  2049. }
  2050. alarm2_3 = 0;
  2051. if(EEPROM.read(133) != alarm2_3){
  2052. EEPROM.write(133, alarm2_3);
  2053. EEPROM.commit();
  2054. }
  2055. alarm2_stat();
  2056.  
  2057. }
  2058.  
  2059. if(weekday == 4 && alarm2_4 == 1 ){//четверг
  2060. if(timer_on2 == 3){
  2061.   digitalWrite(14, HIGH); //выключаем 1 реле
  2062.   if(client.connected()){
  2063.   client.publish(STAT2, String ("выкл."));
  2064.      
  2065. }
  2066. }
  2067. if(timer_on2 == 4){
  2068.   digitalWrite(14, LOW); //включаем 1 реле
  2069.   if(client.connected()){
  2070.   client.publish(STAT2, String ("вкл."));
  2071.      
  2072. }
  2073. }
  2074. alarm2_4 = 0;
  2075. if(EEPROM.read(134) != alarm2_4){
  2076. EEPROM.write(134, alarm2_4);
  2077. EEPROM.commit();
  2078. }
  2079. alarm2_stat();
  2080.  
  2081. }
  2082.  
  2083. if(weekday == 5 && alarm2_5 == 1 ){// пятница
  2084. if(timer_on2 == 3){
  2085.   digitalWrite(14, HIGH); //выключаем 1 реле
  2086.   if(client.connected()){
  2087.   client.publish(STAT2, String ("выкл."));
  2088.      
  2089. }
  2090. }
  2091. if(timer_on2 == 4){
  2092.   digitalWrite(14, LOW); //включаем 1 реле
  2093.   if(client.connected()){
  2094.   client.publish(STAT2, String ("вкл."));
  2095.      
  2096. }
  2097. }
  2098. alarm2_5 = 0;
  2099. if(EEPROM.read(135) != alarm2_5){
  2100. EEPROM.write(135, alarm2_5);
  2101. EEPROM.commit();
  2102. }
  2103. alarm2_stat();
  2104.  
  2105. }
  2106. if(weekday == 6 && alarm2_6 == 1 ){//суббота
  2107. if(timer_on2 == 3){
  2108.   digitalWrite(14, HIGH); //выключаем 1 реле
  2109.   if(client.connected()){
  2110.   client.publish(STAT2, String ("выкл."));
  2111.      
  2112. }
  2113. }
  2114. if(timer_on2 == 4){
  2115.   digitalWrite(14, LOW); //включаем 1 реле
  2116.   if(client.connected()){
  2117.   client.publish(STAT2, String ("вкл."));
  2118.      
  2119. }
  2120. }
  2121. alarm2_6 = 0;
  2122. if(EEPROM.read(136) != alarm2_6){
  2123. EEPROM.write(136, alarm2_6);
  2124. EEPROM.commit();
  2125. }
  2126. alarm2_stat();
  2127.  
  2128. }
  2129.  
  2130. if(weekday == 0 && alarm2_0 == 1 ){//воскресенье
  2131. if(timer_on2 == 3){
  2132.   digitalWrite(14, HIGH); //выключаем 1 реле
  2133.   if(client.connected()){
  2134.   client.publish(STAT2, String ("выкл."));
  2135.      
  2136. }
  2137. }
  2138. if(timer_on2 == 4){
  2139.   digitalWrite(14, LOW); //выключаем 1 реле
  2140.   if(client.connected()){
  2141.   client.publish(STAT2, String ("вкл."));
  2142.      
  2143. }
  2144. }
  2145. alarm2_0 = 0;
  2146. if(EEPROM.read(130) != alarm2_0){
  2147. EEPROM.write(130, alarm2_0);
  2148. EEPROM.commit();
  2149. }
  2150. alarm2_stat();
  2151.  
  2152. }
  2153. }
  2154.  
  2155. delay(1);
  2156. if(timer_on3 >= 3 && timer_start3 == 0 && ((epoch  % 86400L) / 3600) == set_time3h && (epoch  % 3600) / 60 == set_time3m){// будильник для упр. розетки 3
  2157. if(weekday == 1 && alarm3_1 == 1 ){ //понедельник
  2158. if(timer_on3 == 3){
  2159.   digitalWrite(12, HIGH); //выключаем 1 реле
  2160.   if(client.connected()){
  2161.   client.publish(STAT3, String ("выкл."));
  2162.      
  2163. }
  2164. }
  2165. if(timer_on3 == 4){
  2166.   digitalWrite(12, LOW); //включаем 1 реле
  2167.   if(client.connected()){
  2168.   client.publish(STAT3, String ("вкл."));
  2169.      
  2170. }
  2171. }
  2172. alarm3_1 = 0;
  2173. if(EEPROM.read(138) != alarm3_1){
  2174. EEPROM.write(138, alarm3_1);
  2175. EEPROM.commit();
  2176. }
  2177. alarm3_stat();
  2178.  
  2179. }
  2180.  
  2181. if(weekday == 2 && alarm3_2 == 1 ){ //вторник
  2182. if(timer_on3 == 3){
  2183.   digitalWrite(12, HIGH); //выключаем 1 реле
  2184.   if(client.connected()){
  2185.   client.publish(STAT3, String ("выкл."));
  2186.      
  2187. }
  2188. }
  2189. if(timer_on3 == 4){
  2190.   digitalWrite(12, LOW); //включаем 1 реле
  2191.   if(client.connected()){
  2192.   client.publish(STAT3, String ("вкл."));
  2193.      
  2194. }
  2195. }
  2196. alarm3_2 = 0;
  2197. if(EEPROM.read(139) != alarm3_2){
  2198. EEPROM.write(139, alarm3_2);
  2199. EEPROM.commit();
  2200. }
  2201. alarm3_stat();
  2202.  
  2203. }
  2204.  
  2205. if(weekday == 3 && alarm3_3 == 1 ){ //среда
  2206. if(timer_on3 == 3){
  2207.   digitalWrite(12, HIGH); //выключаем 1 реле
  2208.   if(client.connected()){
  2209.   client.publish(STAT3, String ("выкл."));
  2210.      
  2211. }
  2212. }
  2213. if(timer_on3 == 4){
  2214.   digitalWrite(12, LOW); //включаем 1 реле
  2215.   if(client.connected()){
  2216.   client.publish(STAT3, String ("вкл."));
  2217.      
  2218. }
  2219. }
  2220. alarm3_3 = 0;
  2221. if(EEPROM.read(140) != alarm3_3){
  2222. EEPROM.write(140, alarm3_3);
  2223. EEPROM.commit();
  2224. }
  2225. alarm3_stat();
  2226.  
  2227. }
  2228.  
  2229. if(weekday == 4 && alarm3_4 == 1 ){//четверг
  2230. if(timer_on3 == 3){
  2231.   digitalWrite(12, HIGH); //выключаем 1 реле
  2232.   if(client.connected()){
  2233.   client.publish(STAT3, String ("выкл."));
  2234.      
  2235. }
  2236. }
  2237. if(timer_on3 == 4){
  2238.   digitalWrite(12, LOW); //включаем 1 реле
  2239.   if(client.connected()){
  2240.   client.publish(STAT3, String ("вкл."));
  2241.      
  2242. }
  2243. }
  2244. alarm3_4 = 0;
  2245. if(EEPROM.read(141) != alarm3_4){
  2246. EEPROM.write(141, alarm3_4);
  2247. EEPROM.commit();
  2248. }
  2249. alarm3_stat();
  2250.  
  2251. }
  2252.  
  2253. if(weekday == 5 && alarm3_5 == 1 ){// пятница
  2254. if(timer_on3 == 3){
  2255.   digitalWrite(12, HIGH); //выключаем 1 реле
  2256.   if(client.connected()){
  2257.   client.publish(STAT3, String ("выкл."));
  2258.      
  2259. }
  2260. }
  2261. if(timer_on3 == 4){
  2262.   digitalWrite(12, LOW); //включаем 1 реле
  2263.   if(client.connected()){
  2264.   client.publish(STAT3, String ("вкл."));
  2265.      
  2266. }
  2267. }
  2268. alarm3_5 = 0;
  2269. if(EEPROM.read(142) != alarm3_5){
  2270. EEPROM.write(142, alarm3_5);
  2271. EEPROM.commit();
  2272. }
  2273. alarm3_stat();
  2274.  
  2275. }
  2276. if(weekday == 6 && alarm3_6 == 1 ){//суббота
  2277. if(timer_on3 == 3){
  2278.   digitalWrite(12, HIGH); //выключаем 1 реле
  2279.   if(client.connected()){
  2280.   client.publish(STAT3, String ("выкл."));
  2281.      
  2282. }
  2283. }
  2284. if(timer_on3 == 4){
  2285.   digitalWrite(12, LOW); //включаем 1 реле
  2286.   if(client.connected()){
  2287.   client.publish(STAT3, String ("вкл."));
  2288.      
  2289. }
  2290. }
  2291. alarm3_6 = 0;
  2292. if(EEPROM.read(143) != alarm3_6){
  2293. EEPROM.write(143, alarm3_6);
  2294. EEPROM.commit();
  2295. }
  2296. alarm3_stat();
  2297.  
  2298. }
  2299.  
  2300. if(weekday == 0 && alarm3_0 == 1 ){//воскресенье
  2301. if(timer_on3 == 3){
  2302.   digitalWrite(12, HIGH); //выключаем 1 реле
  2303.   if(client.connected()){
  2304.   client.publish(STAT3, String ("выкл."));
  2305.      
  2306. }
  2307. }
  2308. if(timer_on3 == 4){
  2309.   digitalWrite(12, LOW); //выключаем 1 реле
  2310.   if(client.connected()){
  2311.   client.publish(STAT3, String ("вкл."));
  2312.      
  2313. }
  2314. }
  2315. alarm3_0 = 0;
  2316. if(EEPROM.read(137) != alarm3_0){
  2317. EEPROM.write(137, alarm3_0);
  2318. EEPROM.commit();
  2319. }
  2320. alarm3_stat();
  2321.  
  2322. }
  2323. }
  2324.  
  2325. delay(1);
  2326. if(timer_on4 >= 3 && timer_start4 == 0 && ((epoch  % 86400L) / 3600) == set_time4h && (epoch  % 3600) / 60 == set_time4m){// будильник для упр. розетки 4
  2327. if(weekday == 1 && alarm4_1 == 1 ){ //понедельник
  2328. if(timer_on4 == 3){
  2329.   digitalWrite(13, HIGH); //выключаем 1 реле
  2330.   if(client.connected()){
  2331.   client.publish(STAT4, String ("выкл."));
  2332.      
  2333. }
  2334. }
  2335. if(timer_on4 == 4){
  2336.   digitalWrite(13, LOW); //включаем 1 реле
  2337.   if(client.connected()){
  2338.   client.publish(STAT4, String ("вкл."));
  2339.      
  2340. }
  2341. }
  2342. alarm4_1 = 0;
  2343. if(EEPROM.read(145) != alarm4_1){
  2344. EEPROM.write(145, alarm4_1);
  2345. EEPROM.commit();
  2346. }
  2347. alarm4_stat();
  2348.  
  2349. }
  2350.  
  2351. if(weekday == 2 && alarm4_2 == 1 ){ //вторник
  2352. if(timer_on4 == 3){
  2353.   digitalWrite(13, HIGH); //выключаем 1 реле
  2354.   if(client.connected()){
  2355.   client.publish(STAT4, String ("выкл."));
  2356.      
  2357. }
  2358. }
  2359. if(timer_on4 == 4){
  2360.   digitalWrite(13, LOW); //включаем 1 реле
  2361.   if(client.connected()){
  2362.   client.publish(STAT4, String ("вкл."));
  2363.      
  2364. }
  2365. }
  2366. alarm4_2 = 0;
  2367. if(EEPROM.read(146) != alarm4_2){
  2368. EEPROM.write(146, alarm4_2);
  2369. EEPROM.commit();
  2370. }
  2371. alarm4_stat();
  2372.  
  2373. }
  2374.  
  2375. if(weekday == 3 && alarm4_3 == 1 ){ //среда
  2376. if(timer_on4 == 3){
  2377.   digitalWrite(13, HIGH); //выключаем 1 реле
  2378.   if(client.connected()){
  2379.   client.publish(STAT4, String ("выкл."));
  2380.      
  2381. }
  2382. }
  2383. if(timer_on4 == 4){
  2384.   digitalWrite(13, LOW); //включаем 1 реле
  2385.   if(client.connected()){
  2386.   client.publish(STAT4, String ("вкл."));
  2387.      
  2388. }
  2389. }
  2390. alarm4_3 = 0;
  2391. if(EEPROM.read(147) != alarm4_3){
  2392. EEPROM.write(147, alarm4_3);
  2393. EEPROM.commit();
  2394. }
  2395. alarm4_stat();
  2396.  
  2397. }
  2398.  
  2399. if(weekday == 4 && alarm4_4 == 1 ){//четверг
  2400. if(timer_on4 == 3){
  2401.   digitalWrite(13, HIGH); //выключаем 1 реле
  2402.   if(client.connected()){
  2403.   client.publish(STAT4, String ("выкл."));
  2404.      
  2405. }
  2406. }
  2407. if(timer_on4 == 4){
  2408.   digitalWrite(13, LOW); //включаем 1 реле
  2409.   if(client.connected()){
  2410.   client.publish(STAT4, String ("вкл."));
  2411.      
  2412. }
  2413. }
  2414. alarm4_4 = 0;
  2415. if(EEPROM.read(148) != alarm4_4){
  2416. EEPROM.write(148, alarm4_4);
  2417. EEPROM.commit();
  2418. }
  2419. alarm4_stat();
  2420.  
  2421. }
  2422.  
  2423. if(weekday == 5 && alarm4_5 == 1 ){// пятница
  2424. if(timer_on4 == 3){
  2425.   digitalWrite(13, HIGH); //выключаем 1 реле
  2426.   if(client.connected()){
  2427.   client.publish(STAT4, String ("выкл."));
  2428.      
  2429. }
  2430. }
  2431. if(timer_on4 == 4){
  2432.   digitalWrite(13, LOW); //включаем 1 реле
  2433.   if(client.connected()){
  2434.   client.publish(STAT4, String ("вкл."));
  2435.      
  2436. }
  2437. }
  2438. alarm4_5 = 0;
  2439. if(EEPROM.read(149) != alarm4_5){
  2440. EEPROM.write(149, alarm4_5);
  2441. EEPROM.commit();
  2442. }
  2443. alarm4_stat();
  2444.  
  2445. }
  2446. if(weekday == 6 && alarm4_6 == 1 ){//суббота
  2447. if(timer_on4 == 3){
  2448.   digitalWrite(13, HIGH); //выключаем 1 реле
  2449.   if(client.connected()){
  2450.   client.publish(STAT4, String ("выкл."));
  2451.      
  2452. }
  2453. }
  2454. if(timer_on4 == 4){
  2455.   digitalWrite(13, LOW); //включаем 1 реле
  2456.   if(client.connected()){
  2457.   client.publish(STAT4, String ("вкл."));
  2458.      
  2459. }
  2460. }
  2461. alarm4_6 = 0;
  2462. if(EEPROM.read(150) != alarm4_6){
  2463. EEPROM.write(150, alarm4_6);
  2464. EEPROM.commit();
  2465. }
  2466. alarm4_stat();
  2467.  
  2468. }
  2469.  
  2470. if(weekday == 0 && alarm4_0 == 1 ){//воскресенье
  2471. if(timer_on4 == 3){
  2472.   digitalWrite(13, HIGH); //выключаем 1 реле
  2473.   if(client.connected()){
  2474.   client.publish(STAT4, String ("выкл."));
  2475.      
  2476. }
  2477. }
  2478. if(timer_on4 == 4){
  2479.   digitalWrite(13, LOW); //выключаем 1 реле
  2480.   if(client.connected()){
  2481.   client.publish(STAT4, String ("вкл."));
  2482.      
  2483. }
  2484. }
  2485. alarm4_0 = 0;
  2486. if(EEPROM.read(144) != alarm4_0){
  2487. EEPROM.write(144, alarm4_0);
  2488. EEPROM.commit();
  2489. }
  2490. alarm4_stat();
  2491.  
  2492. }
  2493. }
  2494.  
  2495. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2496. if(timer_on1 == 0)timer_start1 = 0;
  2497. if(timer_on2 == 0)timer_start2 = 0;
  2498. if(timer_on3 == 0)timer_start3 = 0;
  2499. if(timer_on4 == 0)timer_start4 = 0;
  2500.  
  2501. //////////////////////////////////обратная связь для прошедшего времени таймеров ////////////////////////////////
  2502.   if (timer_start1 == 1) {
  2503.  
  2504.     buf_ss1 = (millis() - evTime1) / 1000  ; // секунды из миллисикунд
  2505.    
  2506.  
  2507.  
  2508.  
  2509.     time1 = "";// создаем пустую строку для вывода в ее часов: минут: секунд
  2510.     time1 += "Прошло.: ";
  2511.     time1 += String((buf_ss1  % 86400L) / 3600); //добовляем бит часов    
  2512.     time1 += ": "; // добовляем ":"
  2513.    
  2514.     if (((buf_ss1 % 3600)/60) < 10 ) {
  2515.       time1 += '0';
  2516.     }
  2517.     time1 += String((buf_ss1 % 3600) / 60);// добовляем бит минут    
  2518.     time1 += ": ";// добовляем ":"
  2519.    
  2520.     if ( (buf_ss1 % 60) < 10 ) {
  2521.      time1 += '0';
  2522.     }
  2523.     time1 += String(buf_ss1 % 60); // добовляем бит секунд
  2524.     time1 += '\n';// завершаем строку спецсимволом
  2525.   }
  2526.   delay(1);
  2527.  
  2528.   if (timer_start2 == 1) {
  2529.  
  2530.     buf_ss2 = (millis() - evTime2) / 1000; // секунды из миллисикунд
  2531.  
  2532.    
  2533.  
  2534.     time2 = "";
  2535.     time2 += "Прошло.: ";
  2536.     time2 += String((buf_ss2  % 86400L) / 3600); //добовляем бит часов    
  2537.     time2 += ": "; // добовляем ":"
  2538.    
  2539.     if ( ((buf_ss2 % 3600) / 60) < 10 ) {
  2540.       time2 += '0';
  2541.     }
  2542.     time2 += String((buf_ss2 % 3600) / 60);// добовляем бит минут    
  2543.     time2 += ": ";// добовляем ":"
  2544.    
  2545.     if ((buf_ss2 % 60) < 10 ) {
  2546.      time2 += '0';
  2547.     }
  2548.     time2 += String(buf_ss2 % 60); // добовляем бит секунд
  2549.     time2 += '\n';// завершаем строку спецсимволом
  2550.  
  2551.  
  2552.   }
  2553.   delay(1);
  2554.  
  2555.   if (timer_start3 == 1) {
  2556.  
  2557.     buf_ss3 = (millis() - evTime3) / 1000; // секунды из миллисикунд
  2558.  
  2559.    
  2560.  
  2561.     time3 = "";
  2562.     time3 += "Прошло.: ";
  2563.     time3 += String((buf_ss3  % 86400L) / 3600); //добовляем бит часов    
  2564.     time3 += ": "; // добовляем ":"
  2565.    
  2566.     if (((buf_ss3 % 3600) / 60) < 10 ) {
  2567.       time3 += '0';
  2568.     }
  2569.     time3 += String((buf_ss3 % 3600) / 60);// добовляем бит минут    
  2570.     time3 += ": ";// добовляем ":"
  2571.    
  2572.     if ( (buf_ss3 % 60) < 10 ) {
  2573.      time3 += '0';
  2574.     }
  2575.     time3 += String(buf_ss3 % 60); // добовляем бит секунд
  2576.     time3 += '\n';// завершаем строку спецсимволом
  2577.   }
  2578.   delay(1);
  2579.  
  2580.   if (timer_start3 == 1) {
  2581.  
  2582.     buf_ss4 = (millis() - evTime4) / 1000; // секунды из миллисикунд
  2583.  
  2584.    
  2585.  
  2586.     time4 = "";
  2587.     time4 += "Прошло: ";
  2588.     time4 += String((buf_ss4  % 86400L) / 3600); //добовляем бит часов    
  2589.     time4 += ": "; // добовляем ":"
  2590.    
  2591.     if ( ((buf_ss4 % 3600) / 60) < 10 ) {
  2592.       time4 += '0';
  2593.     }
  2594.     time4 += String((buf_ss4 % 3600) / 60);// добовляем бит минут    
  2595.     time4 += ": ";// добовляем ":"
  2596.    
  2597.     if ( (buf_ss4 % 60) < 10 ) {
  2598.      time4 += '0';
  2599.     }
  2600.     time4 += String(buf_ss4 % 60); // добовляем бит секунд
  2601.     time4 += '\n';// завершаем строку спецсимволом
  2602.  
  2603.   }
  2604.   delay(1);
  2605.  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2606.  
  2607.  
  2608.   if (timer_start1 == 0 || timer_on1 == 0) {
  2609.    
  2610.     evTime1 = millis();
  2611.    
  2612.   }
  2613.   if (timer_start2 == 0 || timer_on2 == 0) {
  2614.    
  2615.     evTime2 = millis();
  2616.   }
  2617.   if (timer_start3 == 0 || timer_on3 == 0) {
  2618.    
  2619.     evTime3 = millis();
  2620.   }
  2621.   if (timer_start4 == 0 || timer_on4 == 0) {
  2622.    
  2623.     evTime4 = millis();
  2624.   }
  2625. delay(1);
  2626.  
  2627.  
  2628.   if (digitalRead(16) != EEPROM.read(116)) {
  2629.     EEPROM.write(116, digitalRead(16));
  2630.     EEPROM.commit();
  2631.     delay(1);
  2632.   }
  2633.  
  2634.   if (digitalRead(14) != EEPROM.read(118)) {
  2635.     EEPROM.write(118, digitalRead(14));
  2636.     EEPROM.commit();
  2637.     delay(1);
  2638.   }
  2639.  
  2640.   if (digitalRead(12) != EEPROM.read(120)) {
  2641.     EEPROM.write(120, digitalRead(12));
  2642.     EEPROM.commit();
  2643.     delay(1);
  2644.   }
  2645.  
  2646.   if (digitalRead(13) != EEPROM.read(122)) {
  2647.     EEPROM.write(122, digitalRead(13));
  2648.     EEPROM.commit();
  2649.     delay(1);  
  2650.   }
  2651.  
  2652.   delay(1);
  2653.  
  2654.  loop_end = millis();
  2655.  if (client.connected()) { // если подключен к mqtt
  2656.     if ((millis() - eventTime) > 5000) { // обновлять текущие статусы реле каждые 5 сек.
  2657.      
  2658. if(step_mqtt_send == 10){    
  2659.       if (digitalRead(16) == HIGH) {
  2660.         client.publish(STAT1, String ("выкл."));
  2661.       } else {
  2662.         client.publish(STAT1, String ("вкл."));
  2663.       }
  2664.       delay(1);
  2665. eventTime = millis();
  2666. step_mqtt_send = 0;
  2667. }
  2668. if(step_mqtt_send == 9){      
  2669.       if (digitalRead(14) == HIGH) {
  2670.         client.publish(STAT2, String ("выкл."));
  2671.       } else {
  2672.         client.publish(STAT2, String ("вкл."));
  2673.       }
  2674.       delay(1);
  2675. step_mqtt_send = step_mqtt_send + 1;
  2676. }
  2677.  
  2678.  if(step_mqtt_send == 8){    
  2679.       if (digitalRead(12) == HIGH) {
  2680.         client.publish(STAT3, String ("выкл."));
  2681.       } else {
  2682.         client.publish(STAT3, String ("вкл."));
  2683.       }
  2684.       delay(1);
  2685. step_mqtt_send = step_mqtt_send + 1;      
  2686.  }
  2687.  
  2688.  
  2689.  if(step_mqtt_send == 7){    
  2690.       if (digitalRead(13) == HIGH) {
  2691.         client.publish(STAT4, String ("выкл."));
  2692.       } else {
  2693.         client.publish(STAT4, String ("вкл."));
  2694.       }
  2695.       delay(1);
  2696. step_mqtt_send = step_mqtt_send + 1;      
  2697.  }
  2698.  
  2699. if(step_mqtt_send == 6){      
  2700.       client.publish(ONLINE, String ("1"));
  2701.       delay(1);
  2702. step_mqtt_send = step_mqtt_send + 1;
  2703. }
  2704.      
  2705. if(step_mqtt_send == 5){
  2706.   client.publish("relay/heap", String (ESP.getFreeHeap()));
  2707. step_mqtt_send = step_mqtt_send + 1;  
  2708. }
  2709.      
  2710.  if(step_mqtt_send == 4){    
  2711.       if (timer_on1 > 0 ) {
  2712.         client.publish(TIME1, time1);
  2713.  
  2714.       } else {
  2715.         client.publish(TIME1, String ("выкл"));
  2716.       }
  2717.       delay(1);
  2718. step_mqtt_send = step_mqtt_send + 1;      
  2719.  }
  2720.  
  2721.  
  2722.  if(step_mqtt_send == 3){    
  2723.       if (timer_on2 > 0) {
  2724.         client.publish(TIME2, time2);
  2725.  
  2726.       } else {
  2727.         client.publish(TIME2, String ("выкл"));
  2728.       }
  2729.       delay(1);
  2730. step_mqtt_send = step_mqtt_send + 1;      
  2731.  }
  2732.  
  2733. if(step_mqtt_send == 2){      
  2734.       if (timer_on3 > 0 ) {
  2735.         client.publish(TIME3, time3);
  2736.  
  2737.       } else {
  2738.         client.publish(TIME3, String ("выкл"));
  2739.       }
  2740.       delay(1);
  2741. step_mqtt_send = step_mqtt_send + 1;      
  2742. }
  2743.  
  2744. if(step_mqtt_send == 1){      
  2745.       if (timer_on4 > 0) {
  2746.         client.publish(TIME4, time4);
  2747.  
  2748.       } else {
  2749.         client.publish(TIME4, String ("выкл"));
  2750.       }
  2751.       delay(1);
  2752.   step_mqtt_send = step_mqtt_send + 1;    
  2753. }
  2754.  
  2755. if(step_mqtt_send == 0){      
  2756.       client.publish("relay/time_loop", String (loop_end - loop_start));
  2757.       delay(1);
  2758.      
  2759.      step_mqtt_send = step_mqtt_send + 1;
  2760.     }
  2761.    
  2762.   }
  2763.  
  2764.  if (client.connected()) {
  2765.      // delay(100);
  2766.       client.loop();    
  2767.     }
  2768.  delay(50);
  2769. }
  2770. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement