| Ваш IP: 44.197.197.23 | Online(32) - гости: 11, боты: 21 | Загрузка сервера: 0.74 ::::::::::::

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

Ранее на странице https://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");
  }
}

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

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

Случайные статьи

  • Узкополосный приемный тракт на КФ1066ХА2

    КФ1066ХА2 (аналог К174ХА26) — в данной схеме предпочтительно использовать КФ1066ХА2 так как она более приспособлена при работе на ВЧ и потребляет значительно меньший ток и может питаться от 3 до 9 В. В данной статье рассматривается приемный тракт расчитанный на частоту 27,12МГц. Характеристики: Чувствительность при отношении сигн\шум 10дБ не хуже …Подробнее...
  • Дроссель на резисторе МЛТ

    Дроссель на резисторе МЛТ

    Самодельные дроссели основанный на резисторе МЛТ мощность от 0,125 до 2 Вт, является простым и не дорогим способом получить малогабаритный электронный компонент. Витки катушки индуктивности непосредственно наматываются на высокоомный резистор (100 кОм и более). Для расчета необходимого количества витков можно воспользоваться формулой: где: N — необходимое количество витков, L — нужная индуктивность дросселя в …Подробнее...
  • Электронный переключатель реле

    Электронный переключатель реле

    На основе D-триггера 4013 можно сделать простой электронный переключатель реле. Переключение реле происходит при помощи всего одной кнопки, при нажатии на которую включается реле, при повторном нажатии отключается. Источник — https://circuitswiring.com/electronic-toggle-switch/Подробнее...
  • Автомобильный усилитель 20 Вт (моно) на TDA7240А

    Автомобильный усилитель 20 Вт (моно) на TDA7240А

    УМЗЧ на базе TDA7240A является усилителем класса АВ предназначен для автомобильной ауди техники, микросхема имеет защиту от КЗ выходов с корпусом и шиной питания. Усилитель снабжен системой STAND-BY. Усилитель имеет следующие основные характеристики: Напряжение питания 14,4В (напряжение аккумуляторной батареи автомобиля), максимально допустимое напряжение питания до 18В Ток покоя 65мА (14,4В) …Подробнее...
  • LM3670 миниатюрный понижающий DC-DC преобразователь

    LM3670 миниатюрный понижающий DC-DC преобразователь

    LM3670 миниатюрный понижающий DC-DC преобразователь. Преобразователь обеспечивает выходной ток до 350 мА при напряжении питания от 2,5 до 5,5 В. ИМС LM3670 имеет фиксированное выходное напряжение  1.2, 1.5, 1.6, 1.8, 1.875, 2.5, 3.3 В, а так же регулируемое ADJ от 0,7 В. Частота преобразования 1 МГц. КПД 95%. Ток потребления микросхемы не …Подробнее...