![ESP8266 управление на релета през WEB или бутони и изчитане на DHT22 и напрежение](http://ardudevelop.eu/wp-content/uploads/2024/12/ESP8266-управление-на-релета-през-WEB-или-бутони-и-изчитане-на-DHT22-и-напрежение.png)
Въведение
Тази статия представя подробно ръководство за проект, базиран на ESP8266 D1 Mini, който комбинира управление на релета през WEB или бутони, измерване на температура и влажност с DHT22, и изчитане на напрежение в диапазон 0-30v. Устройството може да се използва за домашна автоматизация или интелигентен дом. Създаден е така, че да бъде лесно програмиран да работи с всяка WiFi мрежа, като сме използвали WiFi мениджър за първоначално обучение.
Устройство и Приложение
ESP8266 е основният микроконтролер в проекта, който осигурява безжична свързаност и обработка на данните. Проектът включва:
- ESP8266 D1 mini: Може да прочетете повече в нашето ревю за него: ESP8266 D1 Mini – Малък, но Мощен Wi-Fi Микроконтролер.
- DHT22 сензор: За измерване на температура и влажност.
- Релета: За управление на електрически уреди.
- Бутонен модул: Локален контрол на релетата.
- Аналогов вход (A0): За измерване на напрежение чрез делител.
- Уеб интерфейс: За отдалечено управление.
Използвани библиотеки
- ESP8266WiFi.h: Осигурява WiFi свързаност.
- ESP8266WebServer.h: За изграждане на уеб сървър. Първите две библиотеки се добавят заедно с поддръжката на този процесор в Arduino IDE. Може да прочетете как се добавя този процесор в Arduino IDE в статията ни: Добавяне на ESP8266 в Arduino IDE: Стъпка по стъпка.
- WiFiManager.h: За лесно конфигуриране WiFi мрежата. Може да свалите тази библиотека от ТУК, а как да добавите тази библиотека в Arduino IDE може да прочетете в статията ни Arduino IDE бърз преглед.
- DHT.h: Библиотека за работа със сензора DHT22. Тази библиотека може да свалите от DHT22lib, а в статията ни Изчитане на DHT11 и DHT22 с ESP8266 може да разберете как се използва.
КОД
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#include <WiFiManager.h>
// Пинове за релетата
#define RELAY_1 D0
#define RELAY_2 D6
#define RELAY_3 D7
#define RELAY_4 D8
// Пинове за бутоните
#define BUTTON_1 D4
#define BUTTON_2 D3
#define BUTTON_3 D2
#define BUTTON_4 D1
// Аналогов вход
#define ANALOG_IN A0
int R1 = 120000; // 120kΩ
int R2 = 15000; // 15kΩ
// Пин за DHT22
#define DHTPIN D5
//#define DHTTYPE DHT11
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Пин RX за рестартиране
#define WIFI_RESET_PIN RX // RX пинът ще се използва за рестартиране
ESP8266WebServer server(80);
// Променливи за състоянията на релетата
bool relay1State = false;
bool relay2State = false;
bool relay3State = false;
bool relay4State = false;
// Променливи за състоянията на бутоните и броячи
int button1Counter = 0;
int button2Counter = 0;
int button3Counter = 0;
int button4Counter = 0;
// Променливи за време и дебаунс
unsigned long lastButtonPress1 = 0;
unsigned long lastButtonPress2 = 0;
unsigned long lastButtonPress3 = 0;
unsigned long lastButtonPress4 = 0;
const unsigned long debounceDelay = 250; // 250 ms debounce delay
// WiFiManager
WiFiManager wm;
void setup() {
Serial.begin(115200);
// Настройка на релетата като изходи и изключването им
pinMode(RELAY_1, OUTPUT);
pinMode(RELAY_2, OUTPUT);
pinMode(RELAY_3, OUTPUT);
pinMode(RELAY_4, OUTPUT);
// Настройваме релетата да са изключени по подразбиране при рестарт (LOW = изключено)
digitalWrite(RELAY_1, LOW);
digitalWrite(RELAY_2, LOW);
digitalWrite(RELAY_3, LOW);
digitalWrite(RELAY_4, LOW);
// Настройка на бутоните като входове с активирани вътрешни pull-up резистори
pinMode(BUTTON_1, INPUT_PULLUP);
pinMode(BUTTON_2, INPUT_PULLUP);
pinMode(BUTTON_3, INPUT_PULLUP);
pinMode(BUTTON_4, INPUT_PULLUP);
// Настройка на ресет пин за WiFi
pinMode(WIFI_RESET_PIN, INPUT_PULLUP);
// Проверка дали е натиснат WiFi ресет бутон при стартиране
if (digitalRead(WIFI_RESET_PIN) == LOW) {
wm.resetSettings(); // Изтрива съхранените WiFi настройки
}
// Опит за автоматично свързване с WiFi
bool res = wm.autoConnect("AutoConnectAP", "password");
if (!res) {
Serial.println("Failed to connect to WiFi");
// Може да рестартирате ESP ако няма връзка
// ESP.restart();
} else {
Serial.println("Connected to WiFi");
}
// Инициализация на DHT
dht.begin();
// Уеб интерфейс за управление
server.on("/", handleRoot);
server.on("/toggleRelay1", toggleRelay1);
server.on("/toggleRelay2", toggleRelay2);
server.on("/toggleRelay3", toggleRelay3);
server.on("/toggleRelay4", toggleRelay4);
// Пътища за четене на състояния
server.on("/readButtons", readButtons);
server.on("/readAnalog", readAnalog);
server.on("/readRelays", readRelays);
server.on("/readDHT", readDHT);
server.begin();
}
void loop() {
// Проверка за натискане на бутоните с дебаунс
checkButton(BUTTON_1, button1Counter, lastButtonPress1, RELAY_1, relay1State);
checkButton(BUTTON_2, button2Counter, lastButtonPress2, RELAY_2, relay2State);
checkButton(BUTTON_3, button3Counter, lastButtonPress3, RELAY_3, relay3State);
checkButton(BUTTON_4, button4Counter, lastButtonPress4, RELAY_4, relay4State);
// Обработка на заявки от уеб сървъра
server.handleClient();
}
// Проверка на бутон с дебаунс логика
void checkButton(int buttonPin, int &counter, unsigned long &lastPress, int relayPin, bool &relayState) {
if (digitalRead(buttonPin) == LOW) {
if (millis() - lastPress > debounceDelay) {
counter++;
if (counter == 2) counter = 0; // Нулиране на брояча след две натискания
lastPress = millis();
relayState = (counter % 2 == 1); // Променяме състоянието на релето според брояча (вкл/изкл)
digitalWrite(relayPin, relayState ? HIGH : LOW); // LOW = изключено, HIGH = включено
}
}
}
// Главна страница с HTML интерфейс за управление на релетата и показване на състоянието на бутоните и аналоговия вход
void handleRoot() {
String html = "<!DOCTYPE html><html><head>";
html += "<style>";
html += "body { font-family: Arial; text-align: center; background-color: #f4f4f4; padding: 20px; }";
html += "table { margin: auto; border-collapse: collapse; width: 80%; }";
html += "table, th, td { border: 1px solid #ccc; padding: 10px; }";
html += "button { padding: 10px 20px; font-size: 16px; border: none; background-color: #007bff; color: white; border-radius: 5px; }";
html += "button:hover { background-color: #0056b3; }";
html += "</style>";
html += "</head><body>";
html += "<h1>ESP8266 Relay & WEB & Button Control + DHT & analogIN</h1>";
// Създаване на таблица с релета, бутони и сензори
html += "<table>";
html += "<tr><th>Component</th><th>Status</th><th>Action</th></tr>";
// Показване на състоянието на релетата
html += "<tr><td>Relay 1</td><td>" + String(relay1State ? "ON" : "OFF") + "</td>";
html += "<td><button id='relay1Btn' onclick=\"location.href='/toggleRelay1'\">Toggle</button></td></tr>";
html += "<tr><td>Relay 2</td><td>" + String(relay2State ? "ON" : "OFF") + "</td>";
html += "<td><button id='relay2Btn' onclick=\"location.href='/toggleRelay2'\">Toggle</button></td></tr>";
html += "<tr><td>Relay 3</td><td>" + String(relay3State ? "ON" : "OFF") + "</td>";
html += "<td><button id='relay3Btn' onclick=\"location.href='/toggleRelay3'\">Toggle</button></td></tr>";
html += "<tr><td>Relay 4</td><td>" + String(relay4State ? "ON" : "OFF") + "</td>";
html += "<td><button id='relay4Btn' onclick=\"location.href='/toggleRelay4'\">Toggle</button></td></tr>";
// Показване на броячите на бутоните
html += "<tr><td>Button 1</td><td>" + String(button1Counter) + "</td><td></td></tr>";
html += "<tr><td>Button 2</td><td>" + String(button2Counter) + "</td><td></td></tr>";
html += "<tr><td>Button 3</td><td>" + String(button3Counter) + "</td><td></td></tr>";
html += "<tr><td>Button 4</td><td>" + String(button4Counter) + "</td><td></td></tr>";
// Четене на аналогов вход и преобразуване в напрежение
int analogValue = analogRead(ANALOG_IN);
float vIn = (analogValue * 3.3) / 1024.0; // Напрежение на A0 (0-3.3V)
float voltage = vIn / 0.11111; // Пресмятане на реалното напрежение преди делителя
//String volt = String(voltage);
// Показване на реалното напрежение
html += "<tr><td>Analog Voltage</td><td>" + String(voltage) + " V</td><td></td></tr>";
// Показване на температурата и влажността от DHT
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
html += "<tr><td>Temperature</td><td>" + String(temperature) + " *C</td><td></td></tr>";
html += "<tr><td>Humidity</td><td>" + String(humidity) + " %</td><td></td></tr>";
html += "</table>";
html += "</body></html>";
server.send(200, "text/html", html);
}
// Функции за управление на релетата от уеб интерфейса
void toggleRelay1() {
relay1State = !relay1State;
button1Counter = relay1State ? 1 : 0; // Актуализиране на брояча
digitalWrite(RELAY_1, relay1State ? HIGH : LOW);
handleRoot();
}
void toggleRelay2() {
relay2State = !relay2State;
button2Counter = relay2State ? 1 : 0;
digitalWrite(RELAY_2, relay2State ? HIGH : LOW);
handleRoot();
}
void toggleRelay3() {
relay3State = !relay3State;
button3Counter = relay3State ? 1 : 0;
digitalWrite(RELAY_3, relay3State ? HIGH : LOW);
handleRoot();
}
void toggleRelay4() {
relay4State = !relay4State;
button4Counter = relay4State ? 1 : 0;
digitalWrite(RELAY_4, relay4State ? HIGH : LOW);
handleRoot();
}
// Четене на състоянието на бутоните
void readButtons() {
String message = "";
message += "Button 1 Counter: " + String(button1Counter) + "\n";
message += "Button 2 Counter: " + String(button2Counter) + "\n";
message += "Button 3 Counter: " + String(button3Counter) + "\n";
message += "Button 4 Counter: " + String(button4Counter) + "\n";
server.send(200, "text/plain", message);
}
// Четене на аналоговия вход
void readAnalog() {
float analogIN = 0;
float voltage = 0;
int numSamples = 50; // Брой осреднени проби
// Осредняване на измерванията
for (int i = 0 ; i < numSamples ; i++) {
analogIN += analogRead(ANALOG_IN);
}
analogIN = analogIN / numSamples; // Средна стойност
// Пресмятане на напрежението в оригиналната точка (преди делителя)
float vIn = (analogIN * 3.3) / 1024.0; // Преобразуване на стойността в напрежение (0-3.3V)
// Компенсация за делителя на напрежение
voltage = vIn / 0.11111;
// Изпращане на резултата до уеб сървъра
server.send(200, "text/plain", String(voltage));
}
// Четене на състоянието на релетата
void readRelays() {
String message = "";
message += "Relay 1: " + String(relay1State ? "ON" : "OFF") + "\n";
message += "Relay 2: " + String(relay2State ? "ON" : "OFF") + "\n";
message += "Relay 3: " + String(relay3State ? "ON" : "OFF") + "\n";
message += "Relay 4: " + String(relay4State ? "ON" : "OFF") + "\n";
server.send(200, "text/plain", message);
}
// Четене на температурата и влажността от DHT
void readDHT() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
String message = "Temperature: " + String(temperature) + " ℃\n";
message += "Humidity: " + String(humidity) + " %\n";
server.send(200, "text/plain", message);
}
За този проект сме използвали идея от наша предишна статия: Проект с ESP8266 D1 Mini: Контрол на четири релета чрез бутони и WEB интерфейс и изчитане на сензори. Преработили сме кода в тази статия така, че да може свържете устройството към вашата безжична мрежа чрез WiFi мениджър. Тази процедура е лесна като следвате следните стъпки:
- Включете устройството в захранването. ESP8266 ще стартира и влезе в режим Access Point.
- Свържете телефона си с WiFi мрежата на устройството. Тя ще се казва например “AutoConnectAP“, а паролата е “password” (може да промените името и паролата на AP в кода).
- Отворете браузър на телефона и въведете адреса
192.168.4.1
. Това ще зареди уеб портал за настройка. - Изберете вашата WiFi мрежа от списъка с налични мрежи.
- Въведете паролата за вашата WiFi мрежа.
- Натиснете “Запази”. Устройството ще рестартира и автоматично ще се свърже с избраната мрежа.
Вашето устройство вече е свързано към вашата WiFi мрежа. В DHCP на вашия рутер може да видите IP адреса който ESP8266 е вземало. След въвеждане на IP адреса във вашия браузър ще видите WEB интерфейса.
![Проект с ESP8266 D1 Mini Контрол на четири релета чрез бутони и WEB интерфейс и изчитане на сензори Визуализация](http://ardudevelop.eu/wp-content/uploads/2024/09/Проект-с-ESP8266-D1-Mini-Контрол-на-четири-релета-чрез-бутони-и-WEB-интерфейс-и-изчитане-на-сензори-Визуализация-1024x518.png)
Endpoints
в този код:
В този код са включени endpoints
, които позволяват устройството да бъде управлявано чрез HTTP заявки. Това означава, че може лесно да се интегрира със скриптове или приложения, които изпращат команди към сървъра. Благодарение на тези точки, устройството може да се използва като част от по-големи IoT системи, предоставяйки контрол върху релетата, мониторинг на сензорите и извличане на данни в реално време. Това прави проекта гъвкав и лесен за автоматизация.
/
(главна страница)- Описание: Зарежда уеб интерфейса за управление.
- Използване: Показва състоянието на релетата, бутоните, DHT сензора и аналоговия вход.
/toggleRelay1
,/toggleRelay2
,/toggleRelay3
,/toggleRelay4
- Описание: Превключва състоянието (включено/изключено) на съответното реле.
- Използване: Управлява реле от уеб интерфейса.
/readButtons
- Описание: Чете броячите на бутоните.
- Използване: Проследява колко пъти е натиснат всеки бутон.
/readAnalog
- Описание: Чете аналоговия вход и изчислява напрежението.
- Използване: Следи стойността на напрежението на аналоговия вход.
/readRelays
- Описание: Връща състоянието на всички релета.
- Използване: Проверява дали релетата са включени или изключени.
/readDHT
- Описание: Чете температурата и влажността от DHT22.
- Използване: Мониторинг на климатични условия.
Разработихме подробен скрипт за управление и наблюдение на ESP8266 в статията ни: Проект на Python за управление на ESP8266: Контрол на релета и сензори чрез бутони и WEB интерфейс. Скриптът е написан на Python с помощта на библиотеката PySide6
и предоставя удобен графичен интерфейс за взаимодействие с устройството.
Основни функции на скрипта:
- Чете температура и влажност от DHT22.
- Показва състоянието на релета и бутони.
- Обновява аналоговите данни в реално време.
- Позволява включване и изключване на релета с един клик.
С този инструмент можете лесно да управлявате вашето устройство директно от компютър.
Снимки на проекта
![ESP8266 управление на релета през WEB или бутони и изчитане на DHT22 и напрежение 2](http://ardudevelop.eu/wp-content/uploads/2024/12/ESP8266-управление-на-релета-през-WEB-или-бутони-и-изчитане-на-DHT22-и-напрежение-2.jpg)
![ESP8266 управление на релета през WEB или бутони и изчитане на DHT22 и напрежение 1](http://ardudevelop.eu/wp-content/uploads/2024/12/ESP8266-управление-на-релета-през-WEB-или-бутони-и-изчитане-на-DHT22-и-напрежение-1.jpg)
Схемотехника
Схемите включват пет основни блока:
Processor Part ESP8266 D1 Mini
Processor-Part-ESP8266-D1-miniPower Supply Part
Power-Sypplay-PertRelay Part
Relay-PartButton Part
Button-PartDHT22 + Voltage Meter
DHT22-Voltage-MeterИзглед на платката
Този проект е разработен с ясна структура на компонентите. Включен е преглед на всички хардуерни връзки и разположението на платката.
![ESP8266 управление на релета през WEB или бутони и изчитане на DHT22 и напрежение Fritzing PCB](http://ardudevelop.eu/wp-content/uploads/2024/12/ESP8266-управление-на-релета-през-WEB-или-бутони-и-изчитане-на-DHT22-и-напрежение-Fritzing-PCB-1013x1024.jpg)
Заключение
Проектът демонстрира как ESP8266 може да бъде използван за интегриране на множество функции в единна система. В следващата статия ще покажем как да добавите допълнителни сензори или функции за още по-голяма гъвкавост. В бъдеще можем да доработим кода така, че при зареждане в браузъра да изисква ИМЕ и ПАРОЛА за оторизация.