1

Тема: W5500 - терморегулятор

Основная статья - http://rcl-radio.ru/?p=77830

Оптимизация памяти

http://forum.rcl-radio.ru/uploads/images/2020/05/ae1ac72192fd43163f0d40dcfa15eb71.png

Скетч использует 16708 байт (51%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 498 байт (24%) динамической памяти, оставляя 1550 байт для локальных переменных. Максимум: 2048 байт.

#include <SPI.h>
#include <Ethernet2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
  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,w,flag;
  String readString = String(30);
  const byte gis = 1; // гистерезис 1 градус
 
void setup() { 
  Serial.begin(9600);
  t.begin(); 
  t.setResolution(12);// 12 bit 18b20
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP: ");
  pinMode(3, OUTPUT); // D3 управление реле нагревательного элемента
  reg = EEPROM.read(0);
}
 
 
void loop() {
  t.requestTemperatures();
  temp = t.getTempCByIndex(0);
  if(reg >= (int)temp + gis){digitalWrite(3,HIGH);flag=1;} 
  if(reg <= (int)temp - gis){digitalWrite(3,LOW);flag=0;} 
 
  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;
        a = readString.indexOf("?temp=");if(a>0){reg = readString.substring(a+6, a+9).toInt();w=1;
        if(reg<0){reg=0;}if(reg>125){reg=125;}}
 
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println(F("Connection: close"));
          client.println(F("Refresh: 10")); // время обновления страницы 
          client.println();
          client.println(F("<!DOCTYPE HTML>"));
          client.println(F("<html><meta charset='UTF-8'>"));
          client.println(F("<style>.tab1 {background-color:#F5F5F5;border-radius: 5px;margin: auto;}</style>"
          "<br><TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='10'>"
          "<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><input type='text' name='temp' autocomplete='off' size='1'></input>  "
          "<button>Подтвердить</button></form></td><tr>"));
 
          client.println(F("<td><center>Температура регулировки: <b>"));
          client.println(reg);
          client.println(F("&#176;C</b><br>"));
 
          if(flag==1){client.print(F("ON"));}
          if(flag==0){client.print(F("OFF"));}
 
          client.println(F("</td></table></center>"));
          client.println(F("</html>"));
          readString="";
          break; 
        }
      }
    }
     if(w==1){w=0;EEPROM.update(0,reg);}
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}

2

Re: W5500 - терморегулятор

Добавлена опция - время обновления страницы

http://forum.rcl-radio.ru/uploads/images/2020/05/83f3bd327f588a588d78032172b9e2b6.png


#include <SPI.h>
#include <Ethernet2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>
  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,w,flag,obn;
  String readString = String(30);
  const byte gis = 1; // гистерезис 1 градус
 
void setup() { 
  Serial.begin(9600);
  t.begin(); 
  t.setResolution(12);// 12 bit 18b20
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP: ");
  pinMode(3, OUTPUT); // D3 управление реле нагревательного элемента
  reg = EEPROM.read(0);obn = EEPROM.read(1);
}
 
 
void loop() {
  t.requestTemperatures();
  temp = t.getTempCByIndex(0);
  if(reg >= (int)temp + gis){digitalWrite(3,HIGH);flag=1;} 
  if(reg <= (int)temp - gis){digitalWrite(3,LOW);flag=0;} 
 
  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,b;
        a = readString.indexOf("?temp=");if(a>0){reg = readString.substring(a+6, a+9).toInt();w=1;
        if(reg<0){reg=0;}if(reg>125){reg=125;}}      
        b = readString.indexOf("?ob="); if(b>0){obn = readString.substring(b+4, b+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>"));
          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: 5px;margin: auto;}</style>"
          "<br><TABLE class='tab1' align='center' width='470' BORDER='1' cellspacing='0' cellpadding='10'>"
          "<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><input type='text' name='temp' autocomplete='off' size='1'></input>  "
          "<button>Подтвердить</button></form></td><tr>"));
 
          client.println(F("<td><center>Температура регулировки: <b>"));
          client.println(reg);
          client.println(F("&#176;C</b><br>"));
 
          if(flag==1){client.print(F("ON"));}
          if(flag==0){client.print(F("OFF"));}

          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,reg);EEPROM.update(1,obn);}
    delay(1);
    client.stop();
    Serial.println("client disconnected");
  }
}

3

Re: W5500 - терморегулятор

Приветствую.  Почему отказались от изготовления последних проектов на модуле ENC28J60 ?  Возможно ли это ?  Интересует Терморегулятор W5500 + DS18B20 (Arduino).

4

Re: W5500 - терморегулятор

Почему отказались от изготовления последних проектов на модуле ENC28J60 ?

Я не отказался, просто сделал то что хотел на ENC28J60, а это передача данных на веб страницу, отправка данных в ардуино с веб страницы, кнопки управления. Все работает как на ардуино, так и на stm32.

5

Re: W5500 - терморегулятор

Терморегулятор W5500 + DS18B20 (Arduino) можно переделать на ENC28J60 + Nano ?  ENC28J60 модуль для мелких веб страниц мне показался.

6

Re: W5500 - терморегулятор

Терморегулятор W5500 + DS18B20 (Arduino) можно переделать на ENC28J60 + Nano ?  ENC28J60 модуль для мелких веб страниц мне показался.

Это с пятью программами? На ардуино не выйдет (только простой терморегулятор), памяти не хватить, только на stm32, в ней памяти много.

7

Re: W5500 - терморегулятор

Этот http://rcl-radio.ru/?p=78352.   Он же сделан на Nano + W5500 ?

8

Re: W5500 - терморегулятор

В W5500 свой кеш, а в ENC28J60 нет кеша (буффер), он его берет и памяти ардуино.