Tải bản đầy đủ (.docx) (19 trang)

Máy chủ web điều nhiệt ESP32 ESP8266 Kiểm soát đầu ra dựa trên nhiệt độ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (607.82 KB, 19 trang )

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>

Arm Trigger %ENABLE_ARM_INPUT%>


<input type="submit" value="Submit">
</form>
</body></html>)rawliteral";
void notFound(AsyncWebServerRequest *request) { request>send(404, "text/plain", "Not found");
}

7/19


AsyncWebServer 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:
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

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;

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)) {

inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
enableArmChecked = "checked";
}
else {
inputMessage2 = "false"; enableArmChecked
= "";
}
}

Đâ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.

19/19



×