Ранее на странице http://rcl-radio.ru/?p=77830 был показан пример создания простого терморегулятора на DS18B20 с управление через WEB — страницу при помощи сетевого модуля W5500 (Arduino). На этой странице показан пример создания аналогичного терморегулятора но с возможностью программно менять температуру по времени (5 шагов).
Программный цикл рассчитан на одни сутки, который позволяет поддерживать нужную температуру и менять ее по заданным временным отметкам.
На скриншоте показан пример использования рассчитанный на поддержание температуры в течении суток:
- 00ч00м — начало программы, установленная температура 20°С
- 05ч30м — начало второй программы, повышение температуры до 25°С
- 06ч30м — начало третьей программы, понижение температуры до 20°С
- 16ч30м — начало четвертой программы, повышение температуры до 25°С
- 23ч30м — начало пятой программы, понижение температуры до 20 °С
Далее в 00ч00м пятая программа отключается, так как программы цикл рассчитан на сутки, активируется по времени первая программа.
Следующий пример:
- До 06ч00м терморегулятор отключен, выход D3 платы Arduino не активен, в 6 час 30 мин активируется первая программа, температура регулирования 50 °С
- 08ч00м — активируется вторая программа, температура регулирования 90 °С
- 16ч30м — активируется третья программа, температура регулирования 20 °С, далее осуществляется поддержание температуры до 00ч00м, так как программы 4 и 5 не активны
Чтобы сделать программу не активной, достаточно установить 0 °С и 00ч00м (надо нажать кнопку «Подтвердить» не заполняя форму). Это условие не распространяется на программу №1, так же время установки каждой последующей программы не должно быть меньше предыдущей.
На следующем скриншоте показан пример использования терморегулятора для поддержания одной заданной температуры в течении суток (постоянное поддержание заданной температуры)
Все температурные и временные отметки заносятся в энергонезависимую память, для поддержания точного времени используются часы реального времени DS1302 (можно использовать другие с небольшими правками скетча). Терморегулятор не нуждается в постоянном мониторинге через WEB-страницу, установленные величины времени и температуры применяются в регулировании автономно от WEB-интерфейса.
Для нормальной загрузки скетча Вам понадобится библиотеки:
#include <SPI.h> #include <Ethernet2.h> #include <OneWire.h> #include <DallasTemperature.h> #include <EEPROM.h> #include <iarduino_RTC.h> iarduino_RTC time(RTC_DS1302, 6, 7, 8); // RST, CLK, DAT OneWire oneWire(A0); DallasTemperature t(&oneWire); byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress ip(10,42,0,100); EthernetServer server(80); float temp; int reg,ttt,reg0 = 0,reg1,w,flag,obn,h1,m1,reg2,h2,m2,reg3,reg4,reg5,h3,m3,h4,m4,h5,m5,wrem,yyy; String readString = String(30); const byte gis = 1; // гистерезис 1 градус void setup() { Serial.begin(9600); time.begin(); // time.settime(0,41,17,24,10,19,4); // Записываем время в модуль: сек, мин, час, дата, месяц, год (2019 = 19), день недели (пон = 1). t.begin(); t.setResolution(12);// 12 bit 18b20 Ethernet.begin(mac, ip); server.begin(); Serial.print("IP: "); pinMode(3, OUTPUT); // D3 управление реле нагревательного элемента reg1 = EEPROM.read(0);obn = EEPROM.read(1);reg2 = EEPROM.read(2);h1 = EEPROM.read(3);m1 = EEPROM.read(4); h2 = EEPROM.read(5);m2 = EEPROM.read(6);reg3 = EEPROM.read(7);reg4 = EEPROM.read(8);reg5 = EEPROM.read(9); h3 = EEPROM.read(10);m3 = EEPROM.read(11);h4 = EEPROM.read(12);m4 = EEPROM.read(13);h5 = EEPROM.read(14);m5 = EEPROM.read(15); } void loop() { time.gettime(); t.requestTemperatures(); temp = t.getTempCByIndex(0); wrem = time.Hours*100+time.minutes; if(wrem<h1*100+m1){ttt=0;reg=reg0;} if(wrem>=h1*100+m1 && (wrem<h2*100+m2 || h2*100+m2==0)){ttt=1;reg=reg1;} if(h2*100+m2!=0 && wrem>=h2*100+m2 && (wrem<h3*100+m3 || h3*100+m3==0)){ttt=2;reg=reg2;} if(h3*100+m3!=0 && wrem>=h3*100+m3 && (wrem<h4*100+m4 || h4*100+m4==0)){ttt=3;reg=reg3;} if(h4*100+m4!=0 && wrem>=h4*100+m4 && (wrem<h5*100+m5 || h5*100+m5==0)){ttt=4;reg=reg4;} if(h5*100+m5!=0 && wrem>=h5*100+m5){ttt=5;reg=reg5;} if(ttt==1){ if(reg1 >= temp + gis){digitalWrite(3,HIGH);flag=1;} if(reg1 <= temp - gis){digitalWrite(3,LOW);flag=0;}} if(ttt==2){ if(reg2 >= temp + gis){digitalWrite(3,HIGH);flag=1;} if(reg2 <= temp - gis){digitalWrite(3,LOW);flag=0;}} if(ttt==3){ if(reg3 >= temp + gis){digitalWrite(3,HIGH);flag=1;} if(reg3 <= temp - gis){digitalWrite(3,LOW);flag=0;}} if(ttt==4){ if(reg4 >= temp + gis){digitalWrite(3,HIGH);flag=1;} if(reg4 <= temp - gis){digitalWrite(3,LOW);flag=0;}} if(ttt==5){ if(reg5 >= temp + gis){digitalWrite(3,HIGH);flag=1;} if(reg5 <= temp - gis){digitalWrite(3,LOW);flag=0;}} if(reg==0){digitalWrite(3,LOW);flag=0;} Serial.println(reg); Serial.println(flag); EthernetClient client = server.available(); if (client) { Serial.println("new client"); while (client.connected()) { if (client.available()) { char c = client.read(); if (readString.length() < 30){readString.concat(c);}//Serial.print(c); if (c == '\n') { int a,a2,a3,a4,a5,b,d,d1,r,r1,x,x1,y,y1,z,z1; a = readString.indexOf("?temp1=");if(a>0){reg1 = readString.substring(a+7, a+10).toInt();w=1; if(reg1<0){reg1=0;}if(reg1>125){reg1=125;}} a2 = readString.indexOf("?temp2=");if(a2>0){reg2 = readString.substring(a2+7, a2+10).toInt();w=1; if(reg2<0){reg2=0;}if(reg2>125){reg2=125;}} a3 = readString.indexOf("?temp3=");if(a3>0){reg3 = readString.substring(a3+7, a3+10).toInt();w=1; if(reg3<0){reg3=0;}if(reg3>125){reg3=125;}} a4 = readString.indexOf("?temp4=");if(a4>0){reg4 = readString.substring(a4+7, a4+10).toInt();w=1; if(reg4<0){reg4=0;}if(reg4>125){reg4=125;}} a5 = readString.indexOf("?temp5=");if(a5>0){reg5 = readString.substring(a5+7, a5+10).toInt();w=1; if(reg5<0){reg5=0;}if(reg5>125){reg5=125;}} b = readString.indexOf("?ob="); if(b>0){obn = readString.substring(b+4, b+6).toInt();w=1;} d = readString.indexOf("hh1=");if(d>0){h1 = readString.substring(d+4, d+6).toInt();w=1;} d1 = readString.indexOf("mm1=");if(d1>0){m1 = readString.substring(d1+4, d1+6).toInt();w=1;} r = readString.indexOf("hh2=");if(r>0){h2 = readString.substring(r+4, r+6).toInt();w=1;} r1 = readString.indexOf("mm2=");if(r1>0){m2 = readString.substring(r1+4, r1+6).toInt();w=1;} x = readString.indexOf("hh3=");if(x>0){h3 = readString.substring(x+4, x+6).toInt();w=1;} x1 = readString.indexOf("mm3=");if(x1>0){m3 = readString.substring(x1+4, x1+6).toInt();w=1;} y = readString.indexOf("hh4=");if(y>0){h4 = readString.substring(y+4, y+6).toInt();w=1;} y1 = readString.indexOf("mm4=");if(y1>0){m4 = readString.substring(y1+4, y1+6).toInt();w=1;} z = readString.indexOf("hh5=");if(z>0){h5 = readString.substring(z+4, z+6).toInt();w=1;} z1 = readString.indexOf("mm5=");if(z1>0){m5 = readString.substring(z1+4, z1+6).toInt();w=1;} client.println(F("HTTP/1.1 200 OK")); client.println(F("Content-Type: text/html")); client.println(F("Connection: close")); client.println(); client.println(F("<!DOCTYPE HTML><meta http-equiv='Cache-Control' content='private'>")); client.print(F("<meta http-equiv='refresh' content='")); client.print(obn); client.println(F("'/>")); client.println(F("<html><meta charset='UTF-8'>")); client.println(F("<style>.tab1 {background-color:#F5F5F5;border-radius: 3px;margin: auto;}</style>" "<br><TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='5'>" "<td><center><big><b>Терморегулятор DS18B20</b></big></td><tr><td><center>")); client.println(F("<h1>Температура: ")); client.println(temp); client.println(F(" °C</h1>" "</td><tr><td align='center'>Установка температуры регулирования (0...125°C)")); client.println(F("<form action='' method='GET'>" "<br><b>1. </b>Темп. рег. <input type='text' name='temp1' autocomplete='off' size='1'></input> " " Время (ч:м) <input type='text' name='hh1' autocomplete='off' size='1'></input> : " "<input type='text' name='mm1' autocomplete='off' size='1'></input> " "<button>Подтвердить</button></form>")); client.println(F("<form action='' method='GET'>" "<br><b>2. </b>Темп. рег. <input type='text' name='temp2' autocomplete='off' size='1'></input> " " Время (ч:м) <input type='text' name='hh2' autocomplete='off' size='1'></input> : " "<input type='text' name='mm2' autocomplete='off' size='1'></input> " "<button>Подтвердить</button></form>")); client.println(F("<form action='' method='GET'>" "<br><b>3. </b>Темп. рег. <input type='text' name='temp3' autocomplete='off' size='1'></input> " " Время (ч:м) <input type='text' name='hh3' autocomplete='off' size='1'></input> : " "<input type='text' name='mm3' autocomplete='off' size='1'></input> " "<button>Подтвердить</button></form>")); client.println(F("<form action='' method='GET'>" "<br><b>4. </b>Темп. рег. <input type='text' name='temp4' autocomplete='off' size='1'></input> " " Время (ч:м) <input type='text' name='hh4' autocomplete='off' size='1'></input> : " "<input type='text' name='mm4' autocomplete='off' size='1'></input> " "<button>Подтвердить</button></form>")); client.println(F("<form action='' method='GET'>" "<br><b>5. </b>Темп. рег. <input type='text' name='temp5' autocomplete='off' size='1'></input> " " Время (ч:м) <input type='text' name='hh5' autocomplete='off' size='1'></input> : " "<input type='text' name='mm5' autocomplete='off' size='1'></input> " "<button>Подтвердить</button></form></td><tr>")); ///////////////////// 1 /////////////////////////////////////////////////////////////// client.println(F("<td><center><b>1.</b> Темп. рег: <b>")); client.println(reg1); client.println(F("°C</b> | ")); client.println(F(" Время применения: <b>")); client.print(h1/10);client.print(h1%10); client.print(F(":")); client.print(m1/10);client.print(m1%10); client.println(F("</b><br>")); ///////////////////// 2 /////////////////////////////////////////////////////////////// client.println(F("<center><b>2.</b> Темп. рег: <b>")); client.println(reg2); client.println(F("°C</b> | ")); client.println(F(" Время применения: <b>")); client.print(h2/10);client.print(h2%10); client.print(F(":")); client.print(m2/10);client.print(m2%10); client.println(F("</b><br>")); ///////////////////// 3 /////////////////////////////////////////////////////////////// client.println(F("<center><b>3.</b> Темп. рег: <b>")); client.println(reg3); client.println(F("°C</b> | ")); client.println(F(" Время применения: <b>")); client.print(h3/10);client.print(h3%10); client.print(F(":")); client.print(m3/10);client.print(m3%10); client.println(F("</b><br>")); ///////////////////// 4 /////////////////////////////////////////////////////////////// client.println(F("<center><b>4.</b> Темп. рег: <b>")); client.println(reg4); client.println(F("°C</b> | ")); client.println(F(" Время применения: <b>")); client.print(h4/10);client.print(h4%10); client.print(F(":")); client.print(m4/10);client.print(m4%10); client.println(F("</b><br>")); ///////////////////// 5 /////////////////////////////////////////////////////////////// client.println(F("<center><b>5.</b> Темп. рег: <b>")); client.println(reg5); client.println(F("°C</b> | ")); client.println(F(" Время применения: <b>")); client.print(h5/10);client.print(h5%10); client.print(F(":")); client.print(m5/10);client.print(m5%10); client.println(F("</b><br>")); client.print(F("<hr>Нагрев: ")); if(flag==1){client.print(F("ON | "));} if(flag==0){client.print(F("OFF | "));} client.print(F("Программа ")); client.print(ttt); client.print(" | Темп. регул: "); client.print(reg); client.println(F("<tr><td><center>Время: ")); client.print(time.Hours / 10); client.print(time.Hours % 10); client.print(":"); client.print(time.minutes / 10); client.print(time.minutes % 10); client.println(F("</td></center>")); client.println(F("<tr><td><center>Время обновленя страницы: ")); client.print(obn); client.print(F(" сек ")); client.print(F("<br><a href='/?ob=5'>5 сек</a> | <a href='/?ob=10'>10 сек</a> | <a href='/?ob=30'>30 сек</a> | <a href='/?ob=60'>1 мин</a><b>")); client.println(F("</td></table></center>")); client.println(F("</html>")); readString=""; break; } } } if(w==1){w=0;EEPROM.update(0,reg1);EEPROM.update(1,obn);EEPROM.update(2,reg2);EEPROM.update(3,h1);EEPROM.update(4,m1); EEPROM.update(5,h2);EEPROM.update(6,m2);EEPROM.update(7,reg3);EEPROM.update(8,reg4);EEPROM.update(9,reg5); EEPROM.update(10,h3);EEPROM.update(11,m3);EEPROM.update(12,h4);EEPROM.update(13,m4);EEPROM.update(14,h5);EEPROM.update(15,m5); } delay(1); client.stop(); Serial.println("client disconnected"); } }