Má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.
1/19
Ví 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 độ.
2/19
Hì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
3/19
Để 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.
4/19
ESP8266 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).
5/19
Mã - 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.
6/19
/********* Rui Santos Complete project details at thermostat-webserver/
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>
DS18B20 Temperature
%TEMPERATURE% °C
ESP Arm Trigger
<form action="/get"> Temperature Threshold required>
} // 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: 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();
8/19
// 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. <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;
9/19
digitalWrite(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
10/1 9
Trong 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 số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 độ:
DS18B20 Temperature
%TEMPERATURE% °C
%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 required>
Arm Trigger %ENABLE_ARM_INPUT%>
<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:
11/19
Thuộ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
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;
12/19
Đầ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
13/19
Sau đó, xác định điều gì sẽ xảy ra khi ESP32 hoặc ESP8266 nhận được yêu cầu HTTP. Khi chúng tôi nhận được yêu cầu trên thư mục gốc / url, hãy gửi văn bản HTML với bộ xử lý (để các trình giữ chỗ được thay thế bằng các giá trị mới nhất). server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request>send_P(200, "text/html", index_html, processor); });
Khi một biểu mẫu được gửi, ESP nhận được yêu cầu trên URL sau: <ESP_IP>/get?threshold_input=<inputMessage>&enable_arm_input=<inputMessage2>
Vì vậy, chúng tơi kiểm tra xem u cầu có chứa các tham số đầu vào hay khơng và lưu các tham số đó thành các biến: 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)) {
Đây là một phần của mã nơi các biến sẽ được thay thế bằng các giá trị được gửi trên biểu mẫu. Biến inputMessage lưu giá trị ngưỡng nhiệt độ và inputMessage2 lưu xem hộp kiểm có được đánh dấu hay khơng (chúng ta có nên kiểm sốt GPIO hay khơng). Sau khi gửi các giá trị trên biểu mẫu, nó sẽ hiển thị một trang mới cho biết yêu cầu đã được gửi thành công đến bảng của bạn với một liên kết để quay lại trang chủ. request->send(200, "text/html", "HTTP GET request sent to your ESP. <a href=\"/\">Return to Home Page</a>"); });
Cuối cùng, khởi động máy chủ: server.begin();
vòng lặp() Trong loop(), chúng tôi sử dụng bộ hẹn giờ để nhận chỉ số nhiệt độ mới cứ sau 5 giây.
14/19
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);
Sau khi nhận được kết quả đọc nhiệt độ mới, chúng tơi kiểm tra xem nó ở trên hay dưới ngưỡng và bật hoặc tắt đầu ra cho phù hợp. Trong ví dụ này, chúng tơi đặt trạng thái đầu ra thành CAO, nếu tất cả các điều kiện này được đáp ứng: Nhiệt độ hiện tại trên ngưỡng; Điều khiển đầu ra tự động được bật (hộp kiểm được đánh dấu trên trang web); Nếu đầu ra chưa được kích hoạt. // 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; digitalWrite(output, HIGH); }
Sau đó, nếu nhiệt độ xuống dưới ngưỡng, hãy đặt đầu ra thành THẤP. 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); }
Tùy thuộc vào ứng dụng của bạn, bạn có thể muốn thay đổi đầu ra thành THẤP, khi nhiệt độ trên ngưỡng và CAO khi đầu ra dưới ngưỡng.
Trình diễn - Bộ điều nhiệt ESP
15/19
Tải mã lên bảng ESP của bạn (với DS18B20 có dây với bảng ESP32 hoặc ESP8266 của bạn). Mở Màn hình nối tiếp với tốc độ truyền 115200 và nhấn nút RST / EN trên bo mạch. ESP sẽ in địa chỉ IP của nó và nó sẽ bắt đầu hiển thị các giá trị nhiệt độ mới cứ sau 5 giây.
Mở trình duyệt và nhập địa chỉ IP ESP. Một trang web tương tự sẽ tải với các giá trị mặc định (được xác định trong mã của bạn):
16/19
Nếu kích hoạt cánh tay được bật (hộp kiểm đã chọn) và nếu nhiệt độ vượt quá ngưỡng, đèn LED sẽ bật (đầu ra được đặt thành CAO).
Sau đó, nếu nhiệt độ xuống dưới ngưỡng, đầu ra sẽ tắt.
17/19
Bạn có thể sử dụng các trường nhập trang web để thay đổi giá trị ngưỡng hoặc để cánh tay và vơ hiệu hóa việc kiểm sốt đầu ra. Để bất kỳ thay đổi nào có hiệu lực, bạn chỉ cần nhấn nút "Gửi". Đồng thời, bạn sẽ nhận được các trường đầu vào mới trong Serial Monitor.
Tổng kết Trong dự án này, bạn đã tìm hiểu cách tạo một máy chủ web với giá trị ngưỡng để tự động kiểm soát đầu ra phù hợp với máy chủ web bộ điều nhiệt đọc nhiệt độ hiện tại). Ví dụ, chúng tơi đã điều khiển một đèn LED. Đối với các ứng dụng trong thế giới thực, có
18/19
thể bạn sẽ muốn điều khiển một mô-đun chuyển tiếp. Bạn có thể đọc các hướng dẫn sau để tìm hiểu cách điều khiển rơle bằng ESP: Mô-đun rơle ESP32 - Thiết bị AC điều khiển (Máy chủ web) ESP8266 Mô-đun chuyển tiếp NodeMCU - Thiết bị AC điều khiển (Máy chủ Web) Chúng tôi đã sử dụng văn bản HTML thô, để làm cho dự án dễ theo dõi hơn. Chúng tôi khuyên bạn nên thêm một số CSS để tạo kiểu cho trang web của bạn để làm cho nó trơng đẹp hơn. Bạn cũng có thể muốn thêm thơng báo qua email vào dự án này. Nếu bạn muốn tìm hiểu thêm về ESP32 và ESP8266, hãy thử các dự án và tài nguyên của chúng tơi: Học ESP32 với Arduino IDE Tự động hóa gia đình sử dụng ESP8266 Lập trình MicroPython với ESP32 và ESP8266 Thêm tài nguyên ESP32... Thêm tài nguyên ESP8266... Cảm ơn bạn đã đọc.