Помогите разобраться в скетче терморегулятора

goya4

New member
Схема и скетч взяты отсюда. Нужно настроить терморегулятор на нагрев. Например
"температура включения" = 76.5c
"температура отключения" = 78.0с

или

"температура включения" = 76.5c
"гистерезис" =1.5с
Автор молчит :(
код:


Код:
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <EEPROM.h>

/////////////////////////////////////////////////////////////////////////////////////
const char* ssid = "Название вашей сети";                       // Название Вашей WiFi сети
const char* password = "Пароль от вашей сети";                      // Пароль от Вашей WiFi сети
////////////////// Если необходимо статический IP ESP8266 ///////////////////////////
IPAddress ip(192,168,2,110);                             // Статический IP ESP8266
IPAddress gateway(192,168,2,1);                          // Статический IP роутера
IPAddress subnet(255,255,255,0);                         // Маска сети
/////////////////////////////////////////////////////////////////////////////////////

String inputMessage = "";                            //
String lastTemperature;

/////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////// HTML веб-страница /////////////////////////////////
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
  <title>Терморегулятор на ESP8266</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta charset='UTF-8'>
  </head><body>
  <h2>Температура: %TEMPERATURE% &deg;C</h2>
  <form action="/get">
  Температура включения: <input type="number" step="0.1" name="threshold_input" value="%THRESHOLD%" required><br>
   </head><body>
  <input type="submit" value="Сохранить">
  </form>
</body></html>)rawliteral";
/////////////////////////////////////////////////////////////////////////////////////

void notFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain", "Not found");
}

AsyncWebServer server(80);

String processor(const String& var){
  Serial.println(var);
  if(var == "TEMPERATURE"){
    return lastTemperature;
  }
  else if(var == "THRESHOLD"){
    return inputMessage;
  }
  return String();
}

const char* PARAM_INPUT = "threshold_input";

/////////////Интервал между обновлением показаний датчика DS18B20////////////////////
unsigned long previousMillis = 0;    
const long interval = 1000;  

/////////////////////////////////////////////////////////////////////////////////////
const int output = 4;                   // Вывод GPIO куда подключено реле
const int oneWireBus = 2;               // Вывод GPIO куда подключен DS18B20    
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);
/////////////////////////////////////////////////////////////////////////////////////

void setup()
{
EEPROM.begin(512);                                    
Serial.begin(115200);                                    // Создаем последовательную связь на скорости 115200
WiFi.mode(WIFI_STA);                                    
WiFi.begin(ssid, password);                              // Передаем данные о WiFI сети
WiFi.config(ip, gateway, subnet);                        // Передаем данные о WiFI сети

///////////////////////  Проверка подключение к Wi-Fi сети  /////////////////////////
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("WiFi Failed!");
    return;}
/////////////////////////////////////////////////////////////////////////////////////

  Serial.println();                                       // Новая строка              
  Serial.print("ESP IP Address: http://");                // Печать текста
  Serial.println(WiFi.localIP());                         // Отправка IP
  pinMode(output, OUTPUT);                                // Установка вывода output, как выход
  digitalWrite(output, LOW);                              // Устанавливаем output в LOW
  sensors.begin();                                        // Инициализация DS18B20

//////////////////////////  Оправка WEB страницы клиенту  //////////////////////////
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html, processor);});
/////////////////////////////////////////////////////////////////////////////////////

///////////////////////////  Получение данных cо страницы  //////////////////////////
  server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
    if (request->hasParam(PARAM_INPUT))
    {
     inputMessage = request->getParam(PARAM_INPUT)->value();
     EEPROM.put(0,inputMessage);                         // Запись данных в EEPROM
     EEPROM.commit();                                  
    }
request->send(200, "text/html", "<meta charset='UTF-8'>" "Запрос отправлен на ESP.<br><a href=\"/\">Назад </a>");
  });

  server.onNotFound(notFound);
  server.begin();
}

void loop()
{
EEPROM.get(0, inputMessage);                                           // Чтение данных с EEPROM
unsigned long currentMillis = millis();                                // Записываем данные в currentMillis

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    sensors.requestTemperatures();                                     // Чтение даных о температуре
    float temperature = sensors.getTempCByIndex(0);                    // Запись данных температуры в temperature
    Serial.print(temperature);                                         // Отправка данных о температуре
    Serial.println(" *C");                                             // Печать текста
    lastTemperature = String(temperature);                            

////////////////////////////////////  Включение реле  ///////////////////////////////
    if(temperature < inputMessage.toFloat()){
       digitalWrite(output, LOW);
       Serial.println("Relay ON");}
/////////////////////////////////////////////////////////////////////////////////////      

////////////////////////////////////  Выключение реле  //////////////////////////////
    else if(temperature > inputMessage.toFloat()) {
       digitalWrite(output, HIGH);
       Serial.println("Relay OFF");}
/////////////////////////////////////////////////////////////////////////////////////
  }
}
 

esp340

Active member
Нужно настроить терморегулятор на нагрев. Например
"температура включения" = 76.5c
"температура отключения" = 78.0с

или

"температура включения" = 76.5c
"гистерезис" =1.5с
Код:
 ////////////////////////////////////  Выключение реле  //////////////////////////////
 else if(temperature > inputMessage.toFloat()+гистерезис) {
 

goya4

New member
Спасибо esp340, но не совсем понятно, как это реализовать через веб-интерфейс.
Может есть схема простого термостата, для обычного нагревателя, который греет до достижения T уставки и выключает нагреватель, с гистерезисом, заданным константой. В веб-меню должна быть прописана установка и текущая температура, кнопки плюс и минус с шагом в один градус.
 

esp340

Active member
В веб-меню должна быть прописана установка и текущая температура, кнопки плюс и минус с шагом в один градус.
В таком случае это называется не " ... разобраться в скетче терморегулятора", а написать все с нуля. Открываете умные книжки, читаете, смотрите примеры и пишете код. Если что-то не будет получаться - обращаетесь на форум за советами. Или идете в платный раздел где вам, возможно, кто-то согласится за вознаграждение написать код.
 

goya4

New member
Уважаемый esp340. Во первых, мне действительно непонятен этот скетч с его веб интерфейсом. Во вторых, если не удастся его запустить в нужном режиме, то, возможно у кого на примете есть другая схема ну очень простого терморегулятора. Схем данных девайсов (бесплатно!) в инете полно, но они для меня имеют избыточный функционал. Мне не нужна куча таймеров, mqtt и т.п. Просто Вкл. и Выкл. по заданной температуре.
 

esp340

Active member
схема ну очень простого терморегулятора. Просто Вкл. и Выкл. по заданной температуре.
Ну так а чем этот не подходит? Задали через web-панель температуру включения, температура выключения автоматом рассчитается по заданному в скетче гистерезису. Проще по-моему некуда.
 

Ф.И.О.

New member
Есть хороший урок для управления через вэб. страницу. Я на него опирался тыц... Только немного доработал под свои нужды. В оригинале порог включения-отключения один. У меня на включение один порог, на отключение другой порог. То есть их 2.
 

Ф.И.О.

New member
Можно еще тут мосмотреть. Это я перенес на SPIFFS, заменил термодатчик, сделал русские коментарии.
 
Сверху Снизу