1. Trang chủ
  2. » Công Nghệ Thông Tin

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

19 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Máy Chủ Web Điều Nhiệt Esp32 Esp8266 Kiểm Soát Đầu Ra Dựa Trên Nhiệt Độ
Trường học Trường Đại Học Khoa Học Công Nghệ
Chuyên ngành Công Nghệ Thông Tin
Thể loại Đồ Án Tốt Nghiệp
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 19
Dung lượng 607,61 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

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.ả

Trang 2

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ệ đ ộ

Trang 3

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 ộ ậ ầ ế

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 5

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)

Trang 6

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

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% &deg;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 8

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:

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 10

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 ệ ộ ặ ị

Trang 11

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ể 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% &deg;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 12

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;

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 ử ủ

Ngày đăng: 09/04/2023, 20:45

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w