Терморегулятор на ESP8266 (Термостат)
Сегодня расскажу как с помощью модуля NodeMCU (ESP8266), реле и датчика DS18B20 сделать простой терморегулятор, для поддержания заданной температуры в помещении.
Необходимые детали:
► Контроллер NodeMCU v.2 (ESP8266) x 1 шт.
► Провода DuPont, 2,54 мм, 20 см x 1 шт.
► Датчик температуры DS18B20 x 1 шт.
► Модуль реле 2-х канальный x 1 шт.
Описание.
Алгоритм программы прост, c помощью NodeMCU считываем температуру с датчика DS18B20 и полученные данные отображаем на WEB сервере. Так же, на WEB есть дополнительное поле, где можем задать температуру выключения реле, по сути получаем терморегулятор, для обогрева (можно сделать для охлаждения помещения, смотрите описание скетча). Все данные сохраняются в EEPROM.
Подключение.
В данном примере используется контроллер NodeMCU v.2 (ESP8266), двух канальное реле и датчик DS18B20. Подключение датчика DS18B20 осуществляется по интерфейсу 1-Wire (однопроводной линии), который подключаемся к модулю NodeMCU (вывод GPIO4), так-же, для работы интерфейса 1-Wire необходим подтягивающий резистор на 4.7 кОм. Далее подключаем двух канальное реле, вывод IN1 к модулю NodeMCU (вывод GPIO2), вывод GND и VCC подключаем к выводам VCC и GND на модуль NodeMCU.
Установка библиотеки:
В данном примере используем сторонние библиотеки «ESPAsyncTCP», «ESPAsyncWebServer» «DallasTemperature» скачать их можно в конце статьи. Так же, не забываем что необходимо установить NodeMCU в среду разработки Arduino IDE, для этого воспользуйтесь этой статьей. После установки библиотек перезапустите, среду разработки Arduino IDE.
Программа:
Теперь, у нас все готово, копируем скетч в Arduino IDE или скачайте готовый файл и загружаем его в NodeMCU, незабываем указать свои данные сети.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
#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% °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");} ///////////////////////////////////////////////////////////////////////////////////// } } |
Определение IP (ESP8266):
В примере используется статический IP, но можно убрать строчки 13,14 и 15 и получим динамический IP. Чтобы узнать какой у NoDEMCU IP, откроем мониторинг порта с выставленной скоростью «115200», в моем случаи сеть выдала «192.168.2.110».
Открываем любой браузер (компьютер должен находиться в той же сети, что и ESP8266 модуль), вводим IP-адрес (192.168.2.110) и нажимаем Enter.
Ссылки:
Библиотека ESPAsyncTCP
Библиотека ESPAsyncWebServer
Библиотека DallasTemperature
Библиотека OneWire v.2.2
Купить на Aliexpress
Плата NodeMCU V2
Провода DuPont, 2,54 мм, 20 см
Модуль реле 2-х канальный
Датчик температуры DS18b20
Купить в Самаре и области
Плата NodeMCU V2
Провода DuPont, 2,54 мм, 20 см
Модуль реле 2-х канальный
Датчик температуры DS18b20
не работает
зашилось норм
температуру показывает , но реле переключает только когда отключить двтчик и показания будут -127
Доброго дня. проблема в записи и чтении в еепром. если вместо него подставить простую переменную, то все работает.
на самом деле достаточно строку «EEPROM.get(0, inputMessage);» из основного цикла переместить в «setup». и все заработало.
Уважаемый СЕРГЕЙ! Прошу уточнить, как сделать переключение на нагрев. Для «чайника» 🙂
Здравствуйте, поменяйте в строке 123 на if(temperature > inputMessage.toFloat()) и 129 else if(temperature < inputMessage.toFloat())
Уважаемый автор!
Не понял, как настроить Терморегулятор на нагрев
Добрый день , первые 3 библиотеки не могу найти. Ссылки нерабочие.
Здравствуйте, добавил
Добрый день.
Собрал термостат по этой схеме. Обнаружил некоторую странность. У меня он работает только в том случае, если удается установить связь с точкой доступа по Wi-Fi. А если связи нет, то и реле не переключается Возникает вопрос, так должно быть?! Я ожидал, что через сеть я буду только конфигурировать значение уставки и наблюдать (при необходимости) измеренное значение. А как быть в случае автономной работы? Я хочу увезти его в деревню, где нет сети, но надо, чтобы он продолжал работать по уставке, которая хранится в его памяти. Буду благодарен за Ваш ответ.
Здравствуйте, можно попробовать удалить строк проверки подключении к вай фай сети
Очень интересный и нужный проект, Спасибо.
Тут нет никакой ошибки ?
const int output = 4; // Вывод GPIO куда подключено реле
const int oneWireBus = 2; // Вывод GPIO куда подключен DS18B20
Ведь реле подключается на 2й контакт, или я не так схему понял ?….
Промучался весь вечер с Wi-Fi ESP8266 NodeMCU V3, не конектится к Wi-fi. надеюсь с ESP 32 всё получится запустить.
Добрый день, если кто знает как можно сделать, так что бы достигая определенной температуры реле выключалось.
Работает штука . Но ставить на что то ответственное нельзя , так как качество этих китайских комплектующих с алиэкспрес очень низкое и за стабильность ручаться не приходится . Сделал жене инкубатор для цыплят все работало хорошо а осталось 2 дня до вылупления какой то сбой произошел , перегрел яйца , хотя сам работает по прежнему . Сами понимаете слезы рекой . Безделушки это все не стабильные.
Добрый день! Скетч заработал, только изменение температуры видно если каждый раз обновлять страницу. Можно ли видеть текущую температуру не обновляя каждый раз страницу?
Посмотрите GyverHub
const int output = 4; // Вывод GPIO куда подключено реле
const int oneWireBus = 2; // Вывод GPIO куда подключен DS18B20
Однозначно ошибка