Trong dự án này, bạn sẽ xây dựng Máy chủ web điều nhiệt ESP32 ESP8266 với trường đầu vào để đặt giá trị ngưỡng nhiệt độ. Điều này cho phép bạn tự động điều khiển đầu ra dựa trên chỉ số nhiệt độ hiện tại. Đầu ra sẽ được đặt thành bật nếu nhiệt độ cao hơn hoặc đặt thành tắt nếu nó dưới ngưỡng điều này có thể được sử dụng để xây dựng một dự án điều chỉnh nhiệt đơn giản.
Trang 1Máy ch web đi u nhi t ESP32 / ESP8266 - Ki m soát ủ ề ệ ể
đ u ra d a trên nhi t đ ầ ự ệ ộ
Trong d án này, b n sẽ xây d ng Máy ch web đi u nhi t ESP32 / ESP8266 v i tr ngự ạ ự ủ ề ệ ớ ườ đ uầ vào để đ tặ giá trị ng ngưỡ nhi tệ đ ộ Đi uề này cho phép b nạ tự đ ngộ đi uề khi nể đ uầ ra d aự trên chỉ số nhi tệ độ hi nệ t i.ạ Đ uầ
ra sẽ đ cượ đ tặ thành b tậ n uế nhi tệ độ cao h nơ ho cặ đ tặ thành t tắ n uế nó d iướ ng ngưỡ - đi uề này có thể đ cượ
sử d ngụ để xây d ngự m tộ dự án đi uề ch nhỉ nhi tệ đ nơ gi n.ả
Trang 2Ví d ,ụ chúng ta sẽ đ cọ nhi tệ độ b ngằ c mả bi nế nhi tệ độ DS18B20 B nạ có thể sử d ngụ b tấ kỳ c mả bi nế
nhi tệ độ nào khác như DHT11 / DHT22, BME280 ho cặ LM35
Để hi uể rõ h nơ về cách th cứ ho tạ đ ngộ c aủ dự án này, chúng tôi khuyên b nạ nên đ cọ các h ngướ d nẫ
sau:
Nh pậ dữ li uệ trên máy chủ web HTML Form ESP32 / ESP8266 (Arduino IDE) ESP32 v iớ
DS18B20 (m tộ c mả bi n,ế nhi uề c mả bi n,ế máy chủ web)
ESP8266 NodeMCU v iớ DS18B20 (m tộ c mả bi n,ế nhi uề c mả bi n,ế máy chủ web) Máy chủ
Web ESP32 ho cặ Máy chủ Web ESP8266 NodeMCU
T ng quan d án ổ ự
Hình nhả sau đây cho th yấ t ngổ quan c pấ cao về dự án mà chúng tôi sẽ xây d ng.ự
ESP32 / ESP8266 l uư trữ m tộ máy chủ web hi nể thị các bài đ cọ nhi tệ độ m iớ nh tấ từ c mả bi nế
nhi tệ đ ộ DS18B20
Có m tộ tr ngườ đ uầ vào để thi tế l pậ giá trị ng ngưỡ nhi tệ đ ộ Khi nhi tệ độ v tượ quá ng ng,ưỡ đ uầ ra sẽ
tự đ ngộ đ cượ b t.ậ B nạ có thể đ oả ng cượ logic này tùy thu cộ vào ngứ d ngụ dự án c aủ b n.ạ
Khi nhi tệ độ xu ngố d iướ ng ng,ưỡ đ uầ ra sẽ bị t t.ắ
H th ng có th ệ ố ể đ c ượ kích ho t ho c h y kích ho t thông qua máy ch web N uạ ặ ủ ạ ủ ế b nạ ch nọ h yủ kích ho tạ hệ th ng,ố đ uầ ra sẽ giữ tr ngạ thái c aủ nó, b tấ kể giá trị nhi tệ đ ộ
Trang 3Hình nhả sau đây cho th yấ trang máy chủ web trông như thế nào.
Đi u ki n tiên quy t ề ệ ế
Hãy ch cắ ch nắ r ngằ b nạ ki mể tra t ngừ đi uề ki nệ tiên quy tế sau đây tr cướ khi ti pế t cụ dự án này
1 Ti n ệ ích b sung ổ ESP32 ho c ặ ESP8266 Arduino IDE
D án này t ng thích v i c b ng ESP32 và ESP8266 Chúng tôi sẽ l p trình các boự ươ ớ ả ả ậ m chạ này b ngằ Arduino IDE, vì v yậ hãy đ mả b oả b nạ đã cài đ tặ các ti nệ ích bổ sung c nầ thi t:ế
2 Th vi n máy ch web không đ ng b ư ệ ủ ồ ộ
Để xây d ngự máy chủ web không đ ngồ b ,ộ b nạ c nầ cài đ tặ các thư vi nệ này
ESP32: cài đ tặ ESPAsyncWebServer và các thư vi nệ AsyncTCP
ESP8266: cài đ tặ ESPAsyncWebServer và các thư vi nệ ESPAsyncTCP
Các thư vi n nàyệ không có s nẵ để cài đ tặ thông qua Trình qu nả lý thư vi nệ Arduino, vì v yậ b nạ c nầ
sao chép các t pệ thư vi nệ vào thư m cụ Thư vi nệ cài đ tặ Arduino Ngoài ra, trong Arduino IDE, b nạ
có thể vào Sketch > Include Library > Add zip Library và ch nọ các thư vi nệ b nạ v aừ t iả
xu ng.ố
3 Các b ph n c n thi t ộ ậ ầ ế
Trang 4Để làm theo h ngướ d nẫ này, b nạ c nầ các ph nầ sau:
ESP32 ( đ cọ b ngả ESP32 t tố nh t)ấ ho cặ ESP8266 (đ cọ b ngả ESP8266 t tố nhất ) D NẪ
Đi n tr 220 Ohmệ ở
Đi nệ trở 4.7k Ohm
Dây nh yả
Breadboard
S đ ơ ồ
Tr cướ khi ti pế t c,ụ hãy n iố c mả bi nế nhi tệ độ DS18B20 vào b ngả c aủ b n.ạ
ESP32 v i DS18B20 và LED ớ
N uế b nạ đang sử d ngụ ESP32, hãy n iố dây c mả bi nế nhi tệ độ DS18B20 như thể hi nệ trong sơ đồ sau,
v iớ chân dữ li uệ đ cượ k tế n iố v iớ GPIO 4
Trang 5ESP8266 v i DS18B20 và LED ớ
N uế b nạ đang sử d ngụ ESP8266, hãy n iố dây c mả bi nế nhi tệ độ DS18B20 như thể hi nệ trong sơ đồ sau,
v iớ chân dữ li uệ đ cượ k tế n iố v iớ GPIO 4 (D2)
Trang 6Mã - Máy ch web đi u nhi t v i đ u vào ng ủ ề ệ ớ ầ ưỡ ng
Sao chép mã sau vào Arduino IDE c aủ b n,ạ nh ngư ch aư t iả nó lên B nạ c nầ th cự hi nệ m t sộ ố thay đ iổ
để làm cho nó ho tạ đ ngộ cho b n B nạ ạ c nầ chèn thông tin đăng nh pậ m ngạ và giá tr ịng ngưỡ m cặ đ nhị
c aủ mình
Trang 7/********* Rui
Santos
Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-
thermostat-web-server/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files.
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/
#ifdef ESP32 #include
<WiFi.h>
#include <AsyncTCP.h> #else
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebServer.h> #include
<Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// REPLACE WITH YOUR NETWORK CREDENTIALS
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Default Threshold Temperature Value String
inputMessage = "25.0";
String lastTemperature;
String enableArmChecked = "checked"; String
inputMessage2 = "true";
// HTML web page to handle 2 input fields (threshold_input, enable_arm_input) const char index_html[]
PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
<title>Temperature Threshold Output Control</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head><body>
<h2>DS18B20 Temperature</h2>
<h3>%TEMPERATURE% °C</h3>
<h2>ESP Arm Trigger</h2>
<form action="/get">
Temperature Threshold <input type="number" step="0.1" name="threshold_input" value="%THRESHOLD%" required><br>
Arm Trigger <input type="checkbox" name="enable_arm_input" value="true"
%ENABLE_ARM_INPUT%><br><br>
<input type="submit" value="Submit">
</form>
</body></html>)rawliteral";
void notFound(AsyncWebServerRequest *request) {
request->send(404, "text/plain", "Not found");
}
Trang 8AsyncWebServer server(80);
// Replaces placeholder with DS18B20 values String
processor(const String& var){
//Serial.println(var); if(var ==
"TEMPERATURE"){
return lastTemperature;
}
else if(var == "THRESHOLD"){ return
inputMessage;
}
else if(var == "ENABLE_ARM_INPUT"){ return
enableArmChecked;
}
return String();
}
// Flag variable to keep track if triggers was activated or not bool triggerActive = false;
const char* PARAM_INPUT_1 = "threshold_input"; const char*
PARAM_INPUT_2 = "enable_arm_input";
// Interval between sensor readings Learn more about ESP32 timers:
https://RandomNerdTutorials.com/esp32-pir-motion-sensor-interrupts-timers/ unsigned long
previousMillis = 0;
const long interval = 5000;
// GPIO where the output is connected to const int output =
2;
// GPIO where the DS18B20 is connected to const int
oneWireBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices OneWire
oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor DallasTemperature
sensors(&oneWire);
void setup() { Serial.begin(115200);
WiFi.mode(WIFI_STA); WiFi.begin(ssid,
password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("WiFi Failed!");
return;
}
Serial.println();
Serial.print("ESP IP Address: http://");
Serial.println(WiFi.localIP());
pinMode(output, OUTPUT); digitalWrite(output,
LOW);
// Start the DS18B20 sensor sensors.begin();
Trang 9// Send web page to client
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
// Receive an HTTP GET request at <ESP_IP>/get?threshold_input=
<inputMessage>&enable_arm_input=<inputMessage2>
server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
// GET threshold_input value on <ESP_IP>/get?threshold_input=<inputMessage> if
(request->hasParam(PARAM_INPUT_1)) {
inputMessage = request->getParam(PARAM_INPUT_1)->value();
// GET enable_arm_input value on <ESP_IP>/get?enable_arm_input=
<inputMessage2>
if (request->hasParam(PARAM_INPUT_2)) {
inputMessage2 = request->getParam(PARAM_INPUT_2)->value(); enableArmChecked = "checked";
}
else {
inputMessage2 = "false";
enableArmChecked = "";
}
}
Serial.println(inputMessage);
Serial.println(inputMessage2);
request->send(200, "text/html", "HTTP GET request sent to your ESP.<br><a href=\"/\">Return to Home
Page</a>");
});
server.onNotFound(notFound); server.begin();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis;
sensors.requestTemperatures();
// Temperature in Celsius degrees
float temperature = sensors.getTempCByIndex(0); Serial.print(temperature);
Serial.println(" *C");
// Temperature in Fahrenheit degrees
/*float temperature = sensors.getTempFByIndex(0); Serial.print(temperature);
Serial.println(" *F");*/ lastTemperature =
String(temperature);
// Check if temperature is above threshold and if it needs to trigger output if(temperature >
inputMessage.toFloat() && inputMessage2 == "true" &&
!triggerActive){
String message = String("Temperature above threshold Current temperature:
") +
String(temperature) + String("C"); Serial.println(message);
triggerActive = true;
Trang 10digitalWrite(output, HIGH);
}
// Check if temperature is below threshold and if it needs to trigger output else if((temperature <
inputMessage.toFloat()) && inputMessage2 == "true" &&
triggerActive) {
String message = String("Temperature below threshold Current temperature:
") +
}
String(temperature) + String(" C"); Serial.println(message);
triggerActive = false; digitalWrite(output, LOW);
}
}
Xem mã thô
Mã ho t đ ng nh th nào ạ ộ ư ế
Ti pế t cụ đ cọ để tìm hi uể cách mã ho tạ đ ngộ ho cặ chuy nể đ nế ph nầ Trình di n.ễ
Th vi n ư ệ
B tắ đ uầ b ngằ cách nh pậ các thư vi nệ c nầ thi t.ế WiFi (ho cặ ESP8266WiFi), AsyncTCP (ho cặ
ESPAsyncTCP) và ESPAsyncWebServer đ cượ yêu c uầ để xây d ngự máy chủ web
OneWire và DallasTemperature đ cượ yêu c uầ để giao ti pế v iớ DS18B20
Mã tự đ ngộ nh pậ các thư vi nệ phù h pợ v iớ b ngả đã ch nọ (ESP32 ho cặ ESP8266)
#ifdef ESP32 #include
<WiFi.h>
#include <AsyncTCP.h> #else
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebServer.h> #include
<Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
Thông tin đăng nh p m ng ậ ạ
Chèn thông tin đăng nh pậ m ngạ c aủ b nạ vào các dòng sau:
// REPLACE WITH YOUR NETWORK CREDENTIALS
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Giá tr ng ị ưỡ ng nhi t đ m c đ nh ệ ộ ặ ị
Trang 11Trong bi nế inputMessage, chèn giá trị ng ngưỡ nhi tệ độ m cặ đ nhị c aủ b n.ạ Chúng tôi đang đ tặ nó thành
25.0, nh ngư b nạ có thể đ tặ nó yo b tấ kỳ giá trị nào khác
String inputMessage = "25.0";
Bi n ph tr ế ụ ợ
Bi nế lastTemperature sẽ giữ số đ cọ nhi tệ độ m iớ nh tấ để so sánh v iớ giá trị ng ng.ưỡ
String lastTemperature;
Bi nế enableArmChecked sẽ cho chúng ta bi tế h pộ ki mể để tự đ ngộ ki mể soát đ uầ ra có đ cượ ch nọ hay không
String enableArmChecked = "checked";
Trong tr ngườ h pợ nó đ cượ ch n,ọ giá trị đ cượ l uư trên inputMessage2 ph iả đ cượ đ tặ thành true
String inputMessage2 = "true";
Văn b n HTML ả
Sau đó, chúng tôi có m tộ số văn b nả HTML cơ b nả để xây d ngự m tộ trang v iớ hai tr ngườ đ uầ vào: tr ngườ
nh pậ ng ngưỡ nhi tệ độ và h pộ ki mể để b tậ ho cặ t tắ tự đ ngộ ki mể soát đ uầ ra
Trang web cũng hi nể thị số đ cọ nhi tệ độ m iớ nh tấ từ c mả bi nế nhi tệ độ DS18B20 Các dòng sau đây
hi nể thị nhi tệ đ :ộ
<h2>DS18B20 Temperature</h2>
<h3>%TEMPERATURE% °C</h3>
%TEMPERATURE% là trình giữ chỗ sẽ đ cượ thay thế b ngằ giá trị nhi tệ độ th cự tế khi ESP32/ESP8266 phân ph iố trang
Sau đó, chúng tôi có m tộ bi uể m uẫ v iớ hai tr ngườ nh pậ li uệ và nút "G i".ử Khi ng iườ dùng nh pậ m tộ số
dữ li uệ và nh pấ vào nút "G i",ử các giá trị đó sẽ đ cượ g iử đ nế ESP để c pậ nh tậ các bi n.ế
<form action="/get">
Temperature Threshold <input type="number" step="0.1" name="threshold_input" value="%THRESHOLD%"
required><br>
Arm Trigger <input type="checkbox" name="enable_arm_input" value="true"
%ENABLE_ARM_INPUT%><br><br>
<input type="submit" value="Submit">
</form>
Tr ng nh p đ u tiên làườ ậ ầ s lo i và tr ng nh pố ạ ườ ậ th hai là h p ki m.ứ ộ ể Đ tìm hi u thêm vể ể ề các tr ngườ đ uầ vào, chúng tôi khuyên b nạ nên xem các tài nguyên sau c aủ trang web
w3schools:
Trang 12Thu cộ tính hành đ ngộ c aủ bi uể m uẫ chỉ đ nhị n iơ g iử dữ li uệ đ cượ chèn vào bi uể m uẫ sau khi nh nấ g i.ử
Trong tr ngườ h pợ này, nó th cự hi nệ m tộ yêu c uầ HTTP GET đ :ể
/get?threshold_input=value&enable_arm_input=value
Giá trị đề c pậ đ nế văn b nả b nạ nh pậ vào m iỗ tr ngườ nh p.ậ Để tìm hi uể thêm về cách xử lý các tr ng ườ đ uầ
vào v i ESP32 / ESP8266, hãyớ đ c: Nh p d li u trênọ ậ ữ ệ Máy ch Webủ HTML Form ESP32 / ESP8266
b ngằ Arduino IDE
b x lý() ộ ử
Hàm processor() thay thế t tấ cả các chỗ dành s nẵ trong văn b nả HTML b ngằ các giá trị th cự t ế
% NHI TỆ ĐỘ » lastNhi tệ độ
%THRESHOLD% » inputMessage
String processor(const String& var){
//Serial.println(var); if(var ==
"TEMPERATURE"){
return lastTemperature;
}
else if(var == "THRESHOLD"){ return
inputMessage;
}
else if(var == "ENABLE_ARM_INPUT"){ return
enableArmChecked;
}
return String();
}
Tham s tr ố ườ ng đ u vào ầ
Các bi n sau đây sẽ đ c s d ng đ ki m tra xem chúng ta đã nh n đ c yêu c uế ượ ử ụ ể ể ậ ượ ầ HTTP GET t ừ các
tr ngườ đ u ầ vào đó hay ch aư và l uư các giá tr ịthành các bi nế t ngươ ng.ứ
const char* PARAM_INPUT_1 = "threshold_input"; const char*
PARAM_INPUT_2 = "enable_arm_input";
Kho ng th i gian gi a các bài đ c ả ờ ữ ọ
Cứ sau 5000 mili giây (5 giây), chúng ta sẽ nh nậ đ cượ k tế quả đ cọ nhi tệ độ m iớ từ c mả bi nế nhi tệ độ
DS18B20 và so sánh nó v iớ giá trị ng ng.ưỡ Để theo dõi th iờ gian, chúng tôi sử d ngụ bộ h nẹ giờ
Thay đ iổ bi nế kho ngả th iờ gian n uế b nạ mu nố thay đ iổ th iờ gian gi aữ m iỗ l nầ đ cọ c mả bi n.ế
unsigned long previousMillis = 0; const long interval
= 5000;
Trang 13Đ u ra GPIO ầ
Trong ví dụ này, chúng ta sẽ ki mể soát GPIO 2 GPIO này đ cượ k tế n iố v iớ đèn LED tích h p ESP32ợ và ESP8266, vì v yậ nó cho phép chúng tôi dễ dàng ki mể tra xem dự án có ho tạ đ ngộ như mong đ iợ
hay không B nạ có thể ki mể soát b tấ kỳ đ uầ ra nào khác và đ iố v iớ nhi uề ngứ d ng,ụ b nạ sẽ mu nố đi uề
khi nể mô-đun chuy nể ti pế
// GPIO where the output is connected to const int output =
2;
C m bi n nhi t đ DS18B20 Init ả ế ệ ộ
Kh iở t oạ c mả bi nế nhi tệ độ DS18B20
// GPIO where the DS18B20 is connected to const int
oneWireBus = 4;
// Setup a oneWire instance to communicate with any OneWire devices OneWire
oneWire(oneWireBus);
// Pass our oneWire reference to Dallas Temperature sensor DallasTemperature
sensors(&oneWire);
Để tìm hi uể thêm về cách giao ti pế c mả bi nế nhi tệ độ DS18B20 v iớ b ngả ESP, hãy đ c:ọ
C mả bi nế nhi tệ độ ESP32 DS18B20
C mả bi nế nhi tệ độ ESP8266 NodeMCU DS18B20
Thi t l p() ế ậ
Trong setup(), k tế n iố v iớ Wi-Fi ở chế độ tr mạ và in đ aị chỉ IP ESP:
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("WiFi Failed!");
return;
}
Serial.println();
Serial.print("ESP IP Address: http://");
Serial.println(WiFi.localIP());
Đ tặ GPIO 2 làm đ uầ ra và đ tặ nó thành TH PẤ khi ESP kh iở đ ngộ l nầ đ uầ tiên
pinMode(output, OUTPUT);
digitalWrite(output, LOW);
Kh i t o c mở ạ ả bi n nhi t đế ệ ộ DS18B20:
sensors.begin();
X lý máy ch web ử ủ