На базе wi-fi модуля NodeMcu v3 с чипом ESP8266 (ESP-12e) можно сделать терморегулятор с удаленным управлением (по локальной сети или Интернет), помимо терморегулятора можно управлять несколькими цифровыми выходами.
Предлагаемое для повторения уст-во содержит в себе несколько компонентов:
- wi-fi модуль NodeMcu v3 с чипом ESP8266 (ESP-12e)
- 18B20 — цифровой датчик температуры, для измерения температуры от 0 до 125 ºС
- DS3231 — часы реального времени
Терморегулятор
В качестве датчика терморегулятора служит датчик 18B20 который питается напряжением 3,3 В непосредственно от wi-fi модуля NodeMcu, цифровой выход датчика подключен ко цифровому входу модуля D5.
Управление терморегулятором осуществляется через WEB страницу, выводится показания температуры датчика, форма для редактирования температуры терморегулятора, а так же показания температуры и времени модуля DS3231. Так же WEB страница содержит служебную информацию, такую как IP адрес, название Wi-Fi сети к которой подключен модуль NodeMcu, уровень сигнала, МАС адрес и время браузера.
Управление реле
Раздел «Управление реле» предназначен для управления реле, в нем можно включать или отключать реле (модуль реле) используя для этого цифровые выходы D0, D3, D6, D7, D8.
Реле времени
Те же самые цифровые выходы, что используются в «Управление реле» можно использовать как реле времени, необходимо задать время включения и выключения для каждого реле. Если время включения и выключения установлено на 00 ч 00 мин, то реле времени не активировано и может использоваться в разделе «Управление реле», если для реле задано время, то оно станет не активным в разделе «Управление реле».
Текущее время для раздела «Реле времени» берется из часов реального времени DS3231.
Все три раздела WEB страницы работают независимо, можно использовать одновременно терморегулятор, реле времени и управление реле.
Если Вы установили все необходимые значения времени, состояния выходов и температуру регулирования, то можно сохранить все эти значения в энергонезависимой памяти, для этого необходимо перейти в раздел терморегулятора и нажать кнопку «YES» в строке «Cохранить настройки в энергонезависимую память: »
D0 | реле 1 |
D1 | SCL (DS3231) |
D2 | SDA (DS3231) |
D3 | реле 2 |
D4 | выход для реле терморегулятора |
D5 | датчик 18B20 |
D6 | реле 3 |
D7 | реле 4 |
D8 | реле 5 |
Контакты Wi-Fi модуля NodeMcu v3
Для управления wi-fi модулем NodeMcu через Интернет необходимо иметь постоянный IP адрес и осуществить переброску портов в маршрутизаторе. Более подробно об управлении через Интернет написано — wi-fi модуль NodeMcu v3 с чипом ESP8266 (ESP-12e)(Удаленное управление нагрузкой).
Если Вы не знаете как прошить модуль NodeMcu v3, то ознакомьтесь со следующей статьей wi-fi модуль NodeMcu v3 с чипом ESP8266 (ESP-12e)(Arduino IDE).
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <ESP8266mDNS.h> #include <OneWire.h> #include <DallasTemperature.h> #include <EEPROM.h> OneWire oneWire(14);// D5 вход датчика 18b20 DallasTemperature t(&oneWire); MDNSResponder mdns; const char* ssid = "Имя_сети_Wi-Fi"; const char* password = "Пароль"; ESP8266WebServer server(80); #include <Wire.h> #include <DS3231.h>//https://github.com/jarzebski/Arduino-DS3231/archive/master.zip DS3231 clock;// Связываем объект clock с библиотекой DS3231 RTCDateTime DateTime;// Определяем сущность структуры RTCDateTime (описанной в библиотеке DS3231) для хранения считанных с часов даты и времени int time1_sum,time1of_sum,time2_sum,time2of_sum,time3_sum,time3of_sum,time4_sum,time4of_sum,time5_sum,time5of_sum; int time_ds,temper,reg_t,gis=1,res=1000,list=1; String d0="OFF",d1="OFF",d2="OFF",d3="OFF",d4="OFF",ind; int stop_d0,stop_d3,stop_d6,stop_d7,stop_d8; int h1,m1,h1of,m1of,h2,m2,h2of,m2of,h3,m3,h3of,m3of,h4,m4,h4of,m4of,h5,m5,h5of,m5of; int socket16,socket0,socket12,socket13,socket15; void setup(void){ EEPROM.begin(512); reg_t=EEPROM.read(0); socket16=EEPROM.read(1);socket0=EEPROM.read(2);socket12=EEPROM.read(3);socket13=EEPROM.read(4);socket15=EEPROM.read(5); h1=EEPROM.read(10);m1=EEPROM.read(11);h1of=EEPROM.read(12);m1of=EEPROM.read(13); h2=EEPROM.read(14);m2=EEPROM.read(15);h2of=EEPROM.read(16);m2of=EEPROM.read(17); h3=EEPROM.read(18);m3=EEPROM.read(19);h3of=EEPROM.read(20);m3of=EEPROM.read(21); h4=EEPROM.read(22);m4=EEPROM.read(23);h4of=EEPROM.read(24);m4of=EEPROM.read(25); h5=EEPROM.read(26);m5=EEPROM.read(27);h5of=EEPROM.read(28);m5of=EEPROM.read(29); pinMode(2, OUTPUT); // D4 выход управления нагрузкой pinMode(16, OUTPUT);digitalWrite(16, LOW);//D0 реле 1 pinMode(0, OUTPUT);digitalWrite(0, LOW); //D3 реле 2 pinMode(12, OUTPUT);digitalWrite(12, LOW); //D6 реле 3 pinMode(13, OUTPUT);digitalWrite(13, LOW); //D7 реле 4 pinMode(15, OUTPUT);digitalWrite(15, LOW); //D8 реле 5 t.begin();t.setResolution(10);//10 бит Wire.begin(); clock.begin();// Инициализируем работу с объектом библиотеки DS3231 //clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча Serial.begin(115200); delay(1000); WiFi.begin(ssid, password); // localhost Serial.println(""); while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");} Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); Serial.println(); if (mdns.begin("esp8266", WiFi.localIP())) {Serial.println("MDNS responder started");} server.on("/", [](){;web();}); server.on("/temperatura", [](){list=1;web();}); server.on("/rele", [](){list=2;web();}); server.on("/rele_time", [](){list=3;web();}); server.on("/obn", [](){web();}); server.on("/restart_off", [](){res=1000;web();}); server.on("/restart_10_on", [](){res=10;web();}); server.on("/restart_30_on", [](){res=30;web();}); server.on("/restart_60_on", [](){res=60;web();}); server.on("/socket16On", [](){socket16=1;web();}); server.on("/socket16Off", [](){socket16=0;web();}); server.on("/socket0On", [](){socket0=1;web();}); server.on("/socket0Off", [](){socket0=0;web();}); server.on("/socket12On", [](){socket12=1;web();}); server.on("/socket12Off", [](){socket12=0;web();}); server.on("/socket13On", [](){socket13=1;web();}); server.on("/socket13Off", [](){socket13=0;web();}); server.on("/socket15On", [](){socket15=1;web();}); server.on("/socket15Off", [](){socket15=0;web();}); server.on("/eeprom", [](){res=1000;EEPROM.begin(512);EEPROM.write(0,reg_t); EEPROM.write(1,socket16);EEPROM.write(2,socket0);EEPROM.write(3,socket12);EEPROM.write(4,socket13);EEPROM.write(5,socket15); EEPROM.write(10,h1);EEPROM.write(11,m1);EEPROM.write(12,h1of);EEPROM.write(13,m1of); EEPROM.write(14,h2);EEPROM.write(15,m2);EEPROM.write(16,h2of);EEPROM.write(17,m2of); EEPROM.write(18,h3);EEPROM.write(19,m3);EEPROM.write(20,h3of);EEPROM.write(21,m3of); EEPROM.write(22,h4);EEPROM.write(23,m4);EEPROM.write(24,h4of);EEPROM.write(25,m4of); EEPROM.write(26,h5);EEPROM.write(27,m5);EEPROM.write(28,h5of);EEPROM.write(29,m5of); EEPROM.commit();web();}); server.begin(); Serial.println("HTTP server started"); } void loop(void){ sumbit(); t.requestTemperatures();temper=t.getTempCByIndex(0); // измерение температуры 18B20 DateTime = clock.getDateTime(); if(reg_t >= temper + gis){digitalWrite(2,HIGH);} if(reg_t <= temper - gis){digitalWrite(2,LOW);} time_ds=DateTime.hour*100+DateTime.minute;// время как число time1_sum=h1*100+m1; time1of_sum=h1of*100+m1of; time2_sum=h2*100+m2; time2of_sum=h2of*100+m2of; time3_sum=h3*100+m3; time3of_sum=h3of*100+m3of; time4_sum=h4*100+m4; time4of_sum=h4of*100+m4of; time5_sum=h5*100+m5; time5of_sum=h5of*100+m5of; if(time1_sum==time1of_sum){stop_d0=1;} else{stop_d0=0;if(time_ds>=time1_sum&&time_ds<time1of_sum){digitalWrite(16,HIGH);}else{digitalWrite(16,LOW);}} if(time2_sum==time2of_sum){stop_d3=1;} else{stop_d3=0;if(time_ds>=time2_sum&&time_ds<time2of_sum){digitalWrite(0,HIGH);}else{digitalWrite(0,LOW);}} if(time3_sum==time3of_sum){stop_d6=1;} else{stop_d6=0;if(time_ds>=time3_sum&&time_ds<time3of_sum){digitalWrite(12,HIGH);}else{digitalWrite(12,LOW);}} if(time4_sum==time4of_sum){stop_d7=1;} else{stop_d7=0;if(time_ds>=time4_sum&&time_ds<time4of_sum){digitalWrite(13,HIGH);}else{digitalWrite(13,LOW);}} if(time5_sum==time5of_sum){stop_d8=1;} else{stop_d8=0;if(time_ds>=time5_sum&&time_ds<time5of_sum){digitalWrite(15,HIGH);}else{digitalWrite(15,LOW);}} if(socket16==1&&stop_d0==1){digitalWrite(16, HIGH);}if(socket16==0&&stop_d0==1){digitalWrite(16, LOW);} if(socket0==1&&stop_d3==1){digitalWrite(0, HIGH);}if(socket0==0&&stop_d3==1){digitalWrite(0, LOW);} if(socket12==1&&stop_d6==1){digitalWrite(12, HIGH);}if(socket12==0&&stop_d6==1){digitalWrite(12, LOW);} if(socket13==1&&stop_d7==1){digitalWrite(13, HIGH);}if(socket13==0&&stop_d7==1){digitalWrite(13, LOW);} if(socket15==1&&stop_d8==1){digitalWrite(15, HIGH);}if(socket15==0&&stop_d8==1){digitalWrite(15, LOW);} server.handleClient(); } void web(){ sumbit(); String webPage = "<!DOCTYPE HTML><html>"; webPage += "<script src='//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js'></script>"; webPage += "<meta charset='utf-8'><meta name='viewport' content='width=480, user-scalable=no' />"; webPage += "<meta http-equiv='Refresh' content='"; webPage += res; webPage += "; URL=/obn' />"; //style webPage += "<head><style>.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}"; webPage += "#menu1{list-style:none; width:100%; padding:0 0 0 0 ; margin: 0 0 0 0;background: #999;}"; webPage += "#menu1 li{float:left; font:bold 14px Arial;text-shadow: 1px 1px 0px #000;}"; webPage += "#menu1 a{color:#fff; display:block; height:36px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}"; webPage += "#menu1 a:hover{color:#fff; background:#555;}"; webPage += "#menu1 b{color:#fff; display:block; height:25px; line-height:36px; padding:10px 10px 10px 10px; background:#4682B4; text-decoration:none;}"; webPage += "</style></head>"; // end style // menu webPage += "<table bgcolor='#4682B4' align='center' width='470' border='0' cellspacing='0' cellpadding='0' ><td>"; webPage += "<ul id='menu1'>"; webPage += "<li><a <a href=\"temperatura\">Терморегулятор</a></a></li>"; webPage += "<li><a href=\"rele\">Управление реле</a></li>"; webPage += "<li><a href=\"rele_time\">Реле времени</a></li>"; webPage += "<li><b>ESP8266</b></li>"; webPage += "</ul></td>"; webPage += "</table><br>"; // end nemu if(list==1){ // temperatura if(reg_t<=0){reg_t=0;}if(reg_t>=125){reg_t=125;} if(reg_t >= temper + gis){ind=" ВКЛ";} if(reg_t <= temper - gis){ind=" ВЫКЛ";} webPage += "<TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='5'><td colspan='3' align='center'>"; webPage += "<h1>Терморегулятор 0...125 °C</td><tr></h1>"; webPage += "<td align='center'>Температура</td><td align='center'><a href=\"obn\"><button>Обновить</button></a></td><td align='center'><b>"; webPage += temper; webPage += " °C</b></td>"; webPage += "<tr><td align='center'>Регулировка температуры</td>"; webPage +="<form action='' method='post'>"; webPage += "<td align='center'><input type='text' name='reg_t' autocomplete='off' maxlength='3' size='1'></input> "; webPage += "<a href=\"temperatura\"><button>Подтвердить</button></a></td>"; webPage +="</form>"; webPage +="<td align='center'><b>"; webPage += reg_t; webPage += " °C</b></td>"; webPage += "<tr><td colspan='3' align='center'>Нагрев: "; webPage += ind; webPage += "</td>"; webPage +="<tr><td colspan='3'> IP адрес: "; webPage += WiFi.localIP().toString(); webPage +="<br> Сеть Wi-Fi: "; webPage += ssid; webPage += "<br> Уровень сигнала: "; webPage += WiFi.RSSI(); webPage += " дБм<br>MAC адрес: "; webPage += WiFi.macAddress(); webPage += "<br>"; webPage += "<script src='//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js'></script>"; webPage += "<script type='text/javascript'>"; webPage += "var days = ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'];"; webPage += "var months = ['Января', 'Февраля', 'Марта', 'Апреля', 'Мая', 'Июня', 'Июля', 'Августа', 'Сентября', 'Октября', 'Ноября', 'Декабря'];"; webPage += "var myDate = new Date();var fullDate = myDate.getDate() + ' ' + months[myDate.getMonth()] + ' ' + myDate.getFullYear() + ' ' + days[myDate.getDay()];"; webPage += "document.write(fullDate);"; webPage += "var hour = myDate.getHours();var minute = myDate.getMinutes();var second = myDate.getSeconds();"; webPage += "if (hour < 10) {hour = '0' + hour;}if (minute < 10) {minute = '0' + minute;}if (second < 10) {second = '0' + second;}"; webPage += "document.write(' ' + hour + ':' + minute + ':' + second);</script>"; webPage += "<tr><td colspan='3'>Время DS3231: "; webPage += clock.dateFormat("H:i:s ", DateTime);// ds3231 часы, минуты и секунды webPage += " "; webPage += clock.dateFormat("D d M Y", DateTime);// ds3231 день недели, дату, месяц и год webPage += "<br>Температура DS3231: <b>"; webPage += clock.readTemperature(); // температура ds3231 webPage += " °C</b></td><tr>"; webPage += "<td align='center' colspan='3'> Автообновление страницы <a href=\"restart_off\"><button> OFF </button></a> "; webPage += " <a href=\"restart_10_on\"><button> 10 c </button></a> <a href=\"restart_30_on\"><button> 30 c</button></a> <a href=\"restart_60_on\"><button> 60 c </button></a> "; if(res==1000){webPage += "OFF";}else{webPage += res;webPage += " c";} webPage +="</td><tr>"; webPage += "<td align='center' colspan='3'> Cохранить настройки в энергонезависимую память: <a href=\"eeprom\"><button> YES </button></a></td> "; webPage +="</table>"; } if(list==2) { // rele webPage += "<TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='5'>"; webPage += "<td colspan='3' align='center'><h1>Управление реле</h1></td><tr>"; webPage += "<td align='center'>Номер реле (выхода)</td><td align='center'>Вкл/Выкл</td><td align='center'>Выход реле</td>"; webPage += "<tr><td align='center'>Реле 1 (D0)</td>"; if(stop_d0==1){ if(socket16==1){d0=" ON";}if(socket16==0){d0=" OFF";} webPage += "<td align='center'><a href=\"socket16On\"><button>ON</button></a>"; webPage += "<a href=\"socket16Off\"><button>OFF</button></a></td>";}else{webPage += "<td align='center'>Реле времени</td>";d0="N/A";} webPage += "<td align='center'>"; webPage += d0; webPage += "</td><tr><td align='center'>Реле 2 (D3)</td>"; if(stop_d3==1){ if(socket0==1){d1=" ON";}if(socket0==0){d1=" OFF";} webPage += "<td align='center'><a href=\"socket0On\"><button>ON</button></a>"; webPage += "<a href=\"socket0Off\"><button>OFF</button></a></td>";}else{webPage += "<td align='center'>Реле времени</td>";d1="N/A";} webPage += "<td align='center'>"; webPage += d1; webPage += "</td><tr><td align='center'>Реле 3 (D6)</td>"; if(stop_d6==1){ if(socket12==1){d2=" ON";}if(socket12==0){d2=" OFF";} webPage += "<td align='center'><a href=\"socket12On\"><button>ON</button></a>"; webPage += "<a href=\"socket12Off\"><button>OFF</button></a></td>";}else{webPage += "<td align='center'>Реле времени</td>";d2="N/A";} webPage += "<td align='center'>"; webPage += d2; webPage += "</td><tr><td align='center'>Реле 4 (D7)</td>"; if(stop_d7==1){ if(socket13==1){d3=" ON";}if(socket13==0){d3=" OFF";} webPage += "<td align='center'><a href=\"socket13On\"><button>ON</button></a>"; webPage += "<a href=\"socket13Off\"><button>OFF</button></a></td>";}else{webPage += "<td align='center'>Реле времени</td>";d3="N/A";} webPage += "<td align='center'>"; webPage += d3; webPage += "</td><tr><td align='center'>Реле 5 (D8)</td>"; if(stop_d8==1){ if(socket15==1){d4=" ON";}if(socket15==0){d4=" OFF";} webPage += "<td align='center'><a href=\"socket15On\"><button>ON</button></a>"; webPage += "<a href=\"socket15Off\"><button>OFF</button></a></td>";}else{webPage += "<td align='center'>Реле времени</td>";d4="N/A";} webPage += "<td align='center'>"; webPage += d4; webPage += "</td><tr>"; webPage += "<td align='center' colspan='3'> Автообновление страницы <a href=\"restart_off\"><button> OFF </button></a> "; webPage += " <a href=\"restart_10_on\"><button> 10 c </button></a> <a href=\"restart_30_on\"><button> 30 c</button></a> <a href=\"restart_60_on\"><button> 60 c </button></a> "; if(res==1000){webPage += "OFF";}else{webPage += res;webPage += " c";} webPage +="</td></table>"; } if(list==3){ // rele time webPage += "<TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='5'>"; webPage += "<td colspan='3' align='center'><h3>Реле времени</h3></td>"; // реле 1 webPage += "<form action='' method='post'>"; webPage += "<tr><td colspan='3' align='center'><b>Реле 1 (D0)</b></td><tr>"; webPage += "<td> Время включения "; if(h1<10){webPage += "0";}if(h1>23){h1=0;}webPage += h1; webPage += ":"; if(m1<10){webPage += "0";}if(m1>59){m1=0;}webPage += m1; webPage += "</td><td align='center'><input type='text' name='h1' autocomplete='off' maxlength='2' size='1'></input>:"; webPage += "<input type='text' name='m1' autocomplete='off' maxlength='2' size='1'> </input> "; webPage += "</td><td align='center'><a href=\"obn\"><button type='submit'>Подтвердить</button></a></td>"; webPage +="</form>"; webPage += "<form action='' method='post'>"; webPage += "<tr><td>Время выключения "; if(h1of<10){webPage += "0";if(h1of>23){h1of=0;}}webPage += h1of; webPage += ":"; if(m1of<10){webPage += "0";}if(m1of>59){m1of=0;}webPage += m1of; webPage += "</td><td align='center'><input type='text' name='h1of' autocomplete='off' maxlength='2' size='1'></input>:"; webPage += "<input type='text' name='m1of' autocomplete='off' maxlength='2' size='1'> </input> "; webPage += "</td><td align='center'><a href=\"obn\"><button type='submit'>Подтвердить</button></a></td>"; webPage +="</form>"; // реле 2 webPage += "<form action='' method='post'>"; webPage += "<tr><td colspan='3' align='center'><b>Реле 2 (D3)</b></td><tr>"; webPage += "<td> Время включения "; if(h2<10){webPage += "0";}if(h2>23){h2=0;}webPage += h2; webPage += ":"; if(m2<10){webPage += "0";}if(m2>59){m2=0;}webPage += m2; webPage += "</td><td align='center'><input type='text' name='h2' autocomplete='off' maxlength='2' size='1'></input>:"; webPage += "<input type='text' name='m2' autocomplete='off' maxlength='2' size='1'> </input> "; webPage += "</td><td align='center'><a href=\"obn\"><button type='submit'>Подтвердить</button></a></td>"; webPage +="</form>"; webPage += "<form action='' method='post'>"; webPage += "<tr><td>Время выключения "; if(h2of<10){webPage += "0";if(h2of>23){h2of=0;}}webPage += h2of; webPage += ":"; if(m2of<10){webPage += "0";}if(m2of>59){m2of=0;}webPage += m2of; webPage += "</td><td align='center'><input type='text' name='h2of' autocomplete='off' maxlength='2' size='1'></input>:"; webPage += "<input type='text' name='m2of' autocomplete='off' maxlength='2' size='1'> </input> "; webPage += "</td><td align='center'><a href=\"obn\"><button type='submit'>Подтвердить</button></a></td>"; webPage +="</form>"; // реле 3 webPage += "<form action='' method='post'>"; webPage += "<tr><td colspan='3' align='center'><b>Реле 3 (D6)</b></td><tr>"; webPage += "<td> Время включения "; if(h3<10){webPage += "0";}if(h3>23){h3=0;}webPage += h3; webPage += ":"; if(m3<10){webPage += "0";}if(m3>59){m3=0;}webPage += m3; webPage += "</td><td align='center'><input type='text' name='h3' autocomplete='off' maxlength='2' size='1'></input>:"; webPage += "<input type='text' name='m3' autocomplete='off' maxlength='2' size='1'> </input> "; webPage += "</td><td align='center'><a href=\"obn\"><button type='submit'>Подтвердить</button></a></td>"; webPage +="</form>"; webPage += "<form action='' method='post'>"; webPage += "<tr><td>Время выключения "; if(h3of<10){webPage += "0";if(h3of>23){h3of=0;}}webPage += h3of; webPage += ":"; if(m3of<10){webPage += "0";}if(m3of>59){m3of=0;}webPage += m3of; webPage += "</td><td align='center'><input type='text' name='h3of' autocomplete='off' maxlength='2' size='1'></input>:"; webPage += "<input type='text' name='m3of' autocomplete='off' maxlength='2' size='1'> </input> "; webPage += "</td><td align='center'><a href=\"obn\"><button type='submit'>Подтвердить</button></a></td>"; webPage +="</form>"; // реле 4 webPage += "<form action='' method='post'>"; webPage += "<tr><td colspan='3' align='center'><b>Реле 4 (D7)</b></td><tr>"; webPage += "<td> Время включения "; if(h4<10){webPage += "0";}if(h4>23){h4=0;}webPage += h4; webPage += ":"; if(m4<10){webPage += "0";}if(m4>59){m4=0;}webPage += m4; webPage += "</td><td align='center'><input type='text' name='h4' autocomplete='off' maxlength='2' size='1'></input>:"; webPage += "<input type='text' name='m4' autocomplete='off' maxlength='2' size='1'> </input> "; webPage += "</td><td align='center'><a href=\"obn\"><button type='submit'>Подтвердить</button></a></td>"; webPage +="</form>"; webPage += "<form action='' method='post'>"; webPage += "<tr><td>Время выключения "; if(h4of<10){webPage += "0";if(h4of>23){h4of=0;}}webPage += h4of; webPage += ":"; if(m4of<10){webPage += "0";}if(m4of>59){m4of=0;}webPage += m4of; webPage += "</td><td align='center'><input type='text' name='h4of' autocomplete='off' maxlength='2' size='1'></input>:"; webPage += "<input type='text' name='m4of' autocomplete='off' maxlength='2' size='1'> </input> "; webPage += "</td><td align='center'><a href=\"obn\"><button type='submit'>Подтвердить</button></a></td>"; webPage +="</form>"; // реле 5 webPage += "<form action='' method='post'>"; webPage += "<tr><td colspan='3' align='center'><b>Реле 5 (D8)</b></td><tr>"; webPage += "<td> Время включения "; if(h5<10){webPage += "0";}if(h5>23){h5=0;}webPage += h5; webPage += ":"; if(m5<10){webPage += "0";}if(m5>59){m5=0;}webPage += m5; webPage += "</td><td align='center'><input type='text' name='h5' autocomplete='off' maxlength='2' size='1'></input>:"; webPage += "<input type='text' name='m5' autocomplete='off' maxlength='2' size='1'> </input> "; webPage += "</td><td align='center'><a href=\"obn\"><button type='submit'>Подтвердить</button></a></td>"; webPage +="</form>"; webPage += "<form action='' method='post'>"; webPage += "<tr><td>Время выключения "; if(h5of<10){webPage += "0";if(h5of>23){h5of=0;}}webPage += h5of; webPage += ":"; if(m5of<10){webPage += "0";}if(m5of>59){m5of=0;}webPage += m5of; webPage += "</td><td align='center'><input type='text' name='h5of' autocomplete='off' maxlength='2' size='1'></input>:"; webPage += "<input type='text' name='m5of' autocomplete='off' maxlength='2' size='1'> </input> "; webPage += "</td><td align='center'><a href=\"obn\"><button type='submit'>Подтвердить</button></a></td>"; webPage +="</form>"; webPage += "<tr><td align='center' colspan='3'> Автообновление страницы <a href=\"restart_off\"><button> OFF </button></a> "; webPage += " <a href=\"restart_10_on\"><button> 10 c </button></a> <a href=\"restart_30_on\"><button> 30 c</button></a> <a href=\"restart_60_on\"><button> 60 c </button></a> "; if(res==1000){webPage += "OFF";}else{webPage += res;webPage += " c";} webPage +="</td></table></html>"; } server.send(200, "text/html", webPage);delay(300); } void sumbit(){ if (server.args() > 0 ) { for ( uint8_t i = 0; i < server.args(); i++ ) { if (server.argName(i) == "h1"){h1 = server.arg(i).toInt();} if (server.argName(i) == "m1"){m1 = server.arg(i).toInt();} if (server.argName(i) == "h1of"){h1of = server.arg(i).toInt();} if (server.argName(i) == "m1of"){m1of = server.arg(i).toInt();} if (server.argName(i) == "h2"){h2 = server.arg(i).toInt();} if (server.argName(i) == "m2"){m2 = server.arg(i).toInt();} if (server.argName(i) == "h2of"){h2of = server.arg(i).toInt();} if (server.argName(i) == "m2of"){m2of = server.arg(i).toInt();} if (server.argName(i) == "h3"){h3 = server.arg(i).toInt();} if (server.argName(i) == "m3"){m3 = server.arg(i).toInt();} if (server.argName(i) == "h3of"){h3of = server.arg(i).toInt();} if (server.argName(i) == "m3of"){m3of = server.arg(i).toInt();} if (server.argName(i) == "h4"){h4 = server.arg(i).toInt();} if (server.argName(i) == "m4"){m4 = server.arg(i).toInt();} if (server.argName(i) == "h4of"){h4of = server.arg(i).toInt();} if (server.argName(i) == "m4of"){m4of = server.arg(i).toInt();} if (server.argName(i) == "h5"){h5 = server.arg(i).toInt();} if (server.argName(i) == "m5"){m5 = server.arg(i).toInt();} if (server.argName(i) == "h5of"){h5of = server.arg(i).toInt();} if (server.argName(i) == "m5of"){m5of = server.arg(i).toInt();} if (server.argName(i) == "reg_t"){reg_t = server.arg(i).toInt();} }} }
Для получения IP адреса откройте монитор порта и нажмите кнопку «RST» на модуле NodeMcu.
Для работы часов реального времени используйте библиотеку DS3231.h https://github.com/jarzebski/Arduino-DS3231/archive/master.zip.
Если время на часах реального времени не установлено то раскомментируйте строчку:
//clock.setDateTime(__DATE__, __TIME__);
после чего обновите прошивку, далее закомментируйте эту строчку и заново обновите прошивку.