Терморегулятор W5500 + DS18B20 (Arduino)

Ранее на странице http://rcl-radio.ru/?p=77830 был показан пример создания простого терморегулятора на DS18B20 с управление через WEB — страницу при помощи сетевого модуля W5500 (Arduino). На этой странице показан пример создания аналогичного терморегулятора но с возможностью программно менять температуру по времени (5 шагов).

Программный цикл рассчитан на одни сутки, который позволяет поддерживать нужную температуру и менять ее по заданным временным отметкам.

На скриншоте показан пример использования рассчитанный на поддержание температуры в течении суток:

  1. 00ч00м — начало программы, установленная температура 20°С
  2. 05ч30м — начало второй программы, повышение температуры до 25°С
  3. 06ч30м — начало третьей программы, понижение температуры до 20°С
  4. 16ч30м — начало четвертой программы, повышение температуры до 25°С
  5. 23ч30м — начало пятой программы, понижение температуры до 20 °С

Далее в 00ч00м пятая программа отключается, так как программы цикл рассчитан на сутки, активируется по времени первая программа.

Следующий пример:

  1. До 06ч00м терморегулятор отключен, выход D3 платы Arduino не активен, в 6 час 30 мин активируется первая программа, температура регулирования 50 °С
  2. 08ч00м — активируется вторая программа, температура регулирования 90 °С
  3. 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(" &#176;C</h1>"
          "</td><tr><td align='center'>Установка температуры регулирования (0...125&#176;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("&#176;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("&#176;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("&#176;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("&#176;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("&#176;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");
  }
}

Добавить комментарий

Войти с помощью: