Tải bản đầy đủ (.pdf) (20 trang)

ESP8266 Máy chủ web NodeMCU với BME680 Trạm thời tiết (Arduino IDE)

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 (863.46 KB, 20 trang )

ESP8266 Máy chủ web NodeMCU với BME680 - Trạm
thời tiết (Arduino IDE)
Hướng dẫn này chỉ ra cách xây dựng trạm thời tiết máy chủ web với ESP8266 NodeMCU
để hiển thị các chỉ số cảm biến từ cảm biến môi trường BME680: khí (chất lượng khơng
khí), nhiệt độ, độ ẩm và áp suất. Các bài đọc được cập nhật tự động trên máy chủ web
bằng cách sử dụng Sự kiện do Máy chủ Gửi (SSE). Bo mạch ESP8266 sẽ được lập trình
bằng Arduino IDE.

Để xây dựng máy chủ web, chúng ta sẽ sử dụng thư viện Máy chủ Web ESP Async cung
cấp một cách dễ dàng để xây dựng một máy chủ web không đồng bộ.

Cảm biến môi trường BME680
BME680 là một cảm biến mơi trường kết hợp cảm biến khí, nhiệt độ, độ ẩm và áp suất.
Cảm biến khí có thể phát hiện một loạt các loại khí như các hợp chất hữu cơ dễ bay hơi
(VOC). Vì lý do này, BME680 có thể được sử dụng trong kiểm sốt chất lượng khơng khí
trong nhà.

1/20


BME680 chứa cảm biến MOX (Metal-oxide) phát hiện VOC trong khơng khí. Cảm biến
này cung cấp cho bạn một ý tưởng định tính về tổng VOC / chất gây ơ nhiễm trong
khơng khí xung quanh. Là một tín hiệu thơ, BME680 xuất ra các giá trị điện trở. Các giá
trị này thay đổi do sự thay đổi nồng độ VOC:

Nồng độ VOC cao hơn » Điện trở thấp hơn
Nồng độ VOC thấp hơn » Điện trở cao hơn

2/20



Để biết thêm thông tin về BME680, hãy đọc hướng dẫn bắt đầu của chúng tôi: ESP8266
NodeMCU: Cảm biến môi trường BME680 sử dụng Arduino IDE (Khí, Áp suất, Độ ẩm,
Nhiệt độ).

Các bộ phận cần thiết

Để hoàn thành hướng dẫn này, bạn cần các phần sau:
Mô-đun cảm biến BME680
ESP8266 (đọc bảng phát triển ESP8266 tốt nhất)
Breadboard
Dây nhảy

Sơ đồ - ESP8266 với BME680
BME680 có thể giao tiếp bằng các giao thức truyền thông I2C hoặc SPI. Trong hướng
dẫn này, chúng ta sẽ sử dụng giao thức truyền thông I2C.
Thực hiện theo sơ đồ tiếp theo để nối BME680 với ESP8266 bằng các chân I2C mặc
định.

3/20


Đề xuất đọc: Tham khảo sơ đồ chân ESP8266: Bạn nên sử dụng chân GPIO nào?

Chuẩn bị Arduino IDE
Chúng tôi sẽ lập trình bo mạch ESP8266 bằng Arduino IDE. Vì vậy, hãy đảm bảo rằng
bạn đã cài đặt tiện ích bổ sung ESP8266. Thực hiện theo hướng dẫn tiếp theo:
Cài đặt bảng ESP8266 trong Arduino IDE
Bạn cũng cần cài đặt các thư viện sau.
Làm theo hướng dẫn tiếp theo để cài đặt chúng.


Cài đặt Thư viện BME680
Để có được các bài đọc từ mô-đun cảm biến BME680, chúng tôi sẽ sử dụng thư viện
Adafruit_BME680. Làm theo các bước tiếp theo để cài đặt thư viện trong Arduino IDE
của bạn:
Mở Arduino IDE của bạn và đi tới Sketch > Include Library > Manage Libraries. Trình
quản lý thư viện sẽ mở.
Tìm kiếm "adafruit bme680" trên hộp Tìm kiếm và cài đặt thư viện.

4/20


Cài đặt Thư viện Adafruit_Sensor
Để sử dụng thư viện BME680, bạn cũng cần cài đặt thư viện Adafruit_Sensor. Làm theo
các bước tiếp theo để cài đặt thư viện trong Arduino IDE của bạn:
Truy cập Sketch > Include Library > Manage Libraries và nhập "Adafruit Unified
Sensor" vào hộp tìm kiếm. Cuộn xuống để tìm thư viện và cài đặt nó.

Cài đặt thư viện ESPAsyncWebServer

5/20


Thư viện ESPAsyncWebServer khơng có sẵn để cài đặt trong Trình quản lý thư viện
Arduino IDE. Vì vậy, bạn cần cài đặt nó bằng tay.
Làm theo các bước tiếp theo để cài đặt thư viện ESPAsyncWebServer:
1. Bấm vào đây để tải xuống thư viện ESPAsyncWebServer. Bạn sẽ có một thư mục
.zip trong thư mục Tải xuống của mình
2. Giải nén thư mục .zip và bạn sẽ nhận được thư mục ESPAsyncWebServer-master
3. Đổi tên thư mục của bạn từ ESPAsyncWebServer-master thành
ESPAsyncWebServer

4. Di chuyển thư mục ESPAsyncWebServer vào thư mục thư viện cài đặt Arduino IDE
của bạn
Ngoài ra, trong Arduino IDE, bạn có thể vào Sketch > Include Library > Add .zip Library
và chọn thư viện bạn vừa tải xuống.

Cài đặt Thư viện TCP ESPAsync
Thư viện ESPAsyncWebServer yêu cầu thư viện ESPAsyncTCP hoạt động. Làm theo
các bước tiếp theo để cài đặt thư viện đó:
1. Bấm vào đây để tải xuống thư viện ESPAsyncTCP. Bạn sẽ có một thư mục .zip
trong thư mục Tải xuống của mình
2. Giải nén thư mục .zip và bạn sẽ nhận được thư mục ESPAsyncTCP-master
3. Đổi tên thư mục của bạn từ ESPAsyncTCP-master thành ESPAsyncTCP
4. Di chuyển thư mục ESPAsyncTCP vào thư mục thư viện cài đặt Arduino IDE của
bạn
5. Cuối cùng, mở lại Arduino IDE của bạn
Ngồi ra, trong Arduino IDE, bạn có thể vào Sketch > Include Library > Add .zip Library
và chọn thư viện bạn vừa tải xuống.

Mã máy chủ Web ESP8266 BME680
Mở Arduino IDE của bạn và sao chép mã sau. Để làm cho nó hoạt động, bạn cần chèn
thơng tin đăng nhập mạng của mình: SSID và mật khẩu.

6/20


/*********

Rui Santos

Complete project details at />

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.

*********/

#include
#include
#include
#include
#include
#include

<Wire.h>

<SPI.h>

<Adafruit_Sensor.h>

"Adafruit_BME680.h"

<ESP8266WiFi.h>

"ESPAsyncWebServer.h"


// Replace with your network credentials


const char* ssid = "REPLACE_WITH_YOUR_SSID";

const char* password = "REPLACE_WITH_YOUR_PASSWORD";

//Uncomment if using SPI

/*#define BME_SCK 14

#define BME_MISO 12

#define BME_MOSI 13

#define BME_CS 15*/

Adafruit_BME680 bme; // I2C

//Adafruit_BME680 bme(BME_CS); // hardware SPI

//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);

float
float
float
float

temperature;

humidity;


pressure;

gasResistance;


AsyncWebServer server(80);

AsyncEventSource events("/events");

unsigned long lastTime = 0;

unsigned long timerDelay = 30000;

// send readings timer


void getBME680Readings(){

// Tell BME680 to begin measurement.

unsigned long endTime = bme.beginReading();

if (endTime == 0) {

Serial.println(F("Failed to begin reading :("));

return;

}


if (!bme.endReading()) {

Serial.println(F("Failed to complete reading :("));

return;

}

temperature = bme.temperature;

7/20


pressure = bme.pressure / 100.0;

humidity = bme.humidity;

gasResistance = bme.gas_resistance / 1000.0;

}

String processor(const String& var){

getBME680Readings();

//Serial.println(var);

if(var == "TEMPERATURE"){

return String(temperature);


}

else if(var == "HUMIDITY"){

return String(humidity);

}

else if(var == "PRESSURE"){

return String(pressure);

}

else if(var == "GAS"){

return String(gasResistance);

}

return String();

}

const char index_html[] PROGMEM = R"rawliteral(

<!DOCTYPE HTML><html>

<head>


<title>BME680 Web Server</title>

<meta name="viewport" content="width=device-width, initial-scale=1">

href=" integrity="sha384fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr"
crossorigin="anonymous">

<link rel="icon" href="data:,">

<style>

html {font-family: Arial; display: inline-block; text-align: center;}

p { font-size: 1.2rem;}

body { margin: 0;}

.topnav { overflow: hidden; background-color: #4B1D3F; color: white; fontsize: 1.7rem; }

.content { padding: 20px; }

.card { background-color: white; box-shadow: 2px 2px 12px 1px
rgba(140,140,140,.5); }

.cards { max-width: 700px; margin: 0 auto; display: grid; grid-gap: 2rem;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }

.reading { font-size: 2.8rem; }


.card.temperature { color: #0e7c7b; }

.card.humidity { color: #17bebb; }

.card.pressure { color: #3fca6b; }

.card.gas { color: #d62246; }

</style>

</head>

<body>

<div class="topnav">

BME680 WEB SERVER



</div>

<div class="content">

8/20


<div class="cards">

<div class="card temperature">


<i class="fas fa-thermometer-half"></i> TEMPERATURE

class="reading"><span id="temp">%TEMPERATURE%</span> °C</span>



</div>

<div class="card humidity">

<i class="fas fa-tint"></i> HUMIDITY

<span class="reading">
<span id="hum">%HUMIDITY%</span> %</span>



</div>

<div class="card pressure">

<i class="fas fa-angle-double-down"></i> PRESSURE

class="reading"><span id="pres">%PRESSURE%</span> hPa</span>



</div>

<div class="card gas">

<i class="fas fa-wind"></i> GAS

<span class="reading">id="gas">%GAS%</span> KΩ</span>



</div>

</div>

</div>


<script>

if (!!window.EventSource) {

var source = new EventSource('/events');



source.addEventListener('open', function(e) {

console.log("Events Connected");

}, false);

source.addEventListener('error', function(e) {

if (e.target.readyState != EventSource.OPEN) {

console.log("Events Disconnected");

}

}, false);



source.addEventListener('message', function(e) {

console.log("message", e.data);


}, false);



source.addEventListener('temperature', function(e) {

console.log("temperature", e.data);

document.getElementById("temp").innerHTML = e.data;

}, false);



source.addEventListener('humidity', function(e) {

console.log("humidity", e.data);

document.getElementById("hum").innerHTML = e.data;

}, false);



source.addEventListener('pressure', function(e) {

console.log("pressure", e.data);

document.getElementById("pres").innerHTML = e.data;


}, false);



source.addEventListener('gas', function(e) {

console.log("gas", e.data);

document.getElementById("gas").innerHTML = e.data;

}, false);

}

9/20


</script>

</body>

</html>)rawliteral";

void setup() {

Serial.begin(115200);

// Set the device as a Station and Soft Access Point simultaneously

WiFi.mode(WIFI_AP_STA);


// Set device as a Wi-Fi Station

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {

delay(1000);

Serial.println("Setting as a Wi-Fi Station..");

}

Serial.print("Station IP Address: ");

Serial.println(WiFi.localIP());

Serial.println();

// Init BME680 sensor

if (!bme.begin()) {

Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));

while (1);

}

// Set up oversampling and filter initialization


bme.setTemperatureOversampling(BME680_OS_8X);

bme.setHumidityOversampling(BME680_OS_2X);

bme.setPressureOversampling(BME680_OS_4X);

bme.setIIRFilterSize(BME680_FILTER_SIZE_3);

bme.setGasHeater(320, 150); // 320*C for 150 ms

// Handle Web Server

server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){

request->send_P(200, "text/html", index_html, processor);

});

// Handle Web Server Events

events.onConnect([](AsyncEventSourceClient *client){

if(client->lastId()){

Serial.printf("Client reconnected! Last message ID that it got is: %u\n",
client->lastId());

}


// send event with message "hello!", id current millis

// and set reconnect delay to 1 second

client->send("hello!", NULL, millis(), 10000);

});

server.addHandler(&events);

server.begin();

}

void loop() {

if ((millis() - lastTime) > timerDelay) {

getBME680Readings();

Serial.printf("Temperature = %.2f ºC \n", temperature);

Serial.printf("Humidity = %.2f % \n", humidity);

10/20


Serial.printf("Pressure = %.2f hPa \n", pressure);

Serial.printf("Gas Resistance = %.2f KOhm \n", gasResistance);


Serial.println();

// Send Events to the Web Server with the Sensor Readings

events.send("ping",NULL,millis());

events.send(String(temperature).c_str(),"temperature",millis());

events.send(String(humidity).c_str(),"humidity",millis());

events.send(String(pressure).c_str(),"pressure",millis());

events.send(String(gasResistance).c_str(),"gas",millis());



lastTime = millis();

}

}


Xem mã thô
Chèn thông tin đăng nhập mạng của bạn vào các biến sau và mã sẽ hoạt động ngay lập
tức.
const char* ssid = "REPLACE_WITH_YOUR_SSID";

const char* password = "REPLACE_WITH_YOUR_PASSWORD";


Mã hoạt động như thế nào
Đọc phần này để tìm hiểu cách mã hoạt động hoặc chuyển sang phần tiếp theo.

Bao gồm cả thư viện
Bắt đầu bằng cách bao gồm các thư viện cần thiết. Thư viện Wire là cần thiết cho giao
thức truyền thông I2C. Chúng tôi cũng bao gồm thư viện SPI nếu bạn muốn sử dụng giao
tiếp SPI thay thế.
#include <Wire.h>

#include <SPI.h>

Các thư viện Adafruit_Sensor và Adafruit_BME680 là cần thiết để giao tiếp với cảm biến
BME680.
#include <Adafruit_Sensor.h>

#include "Adafruit_BME680.h"

Các thư viện WiFi và ESPAsyncWebServer được sử dụng để tạo máy chủ web.
#include <ESP8266WiFi.h>

#include "ESPAsyncWebServer.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 biến sau, để ESP8266 có thể kết nối
với mạng cục bộ của bạn bằng Wi-Fi.

11/20



const char* ssid = "REPLACE_WITH_YOUR_SSID";

const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Giao tiếp I2C
Tạo một đối tượng Adafruit_BME680 gọi là bme trên các chân I8266C ESP2 mặc định.
Adafruit_BME680 bme; // I2C

Nếu bạn muốn sử dụng giao tiếp SPI thay thế, bạn cần xác định các chân SPI ESP8266
trên các dòng sau (để bỏ ghi chú, hãy xóa /* và */):
/*#define BME_SCK 14

#define BME_MISO 12

#define BME_MOSI 13

#define BME_CS 15*/

Và sau đó, tạo một đối tượng Adafruit_BME680 bằng cách sử dụng các chân đó (để bỏ
ghi chú xóa //).
//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);

Khai báo biến
Các biến phao nhiệt độ, độ ẩm, áp suất và điện trở khí sẽ được sử dụng để giữ số đọc
cảm biến BME680.
float
float
float
float


temperature;

humidity;

pressure;

gasResistance;

Các biến lastTime và timerDelay sẽ được sử dụng để cập nhật số đọc cảm biến sau mỗi
X số giây. Ví dụ: chúng tơi sẽ nhận được số đọc cảm biến mới cứ sau 30 giây (30000 mili
giây). Bạn có thể thay đổi thời gian trễ đó trong biến timerDelay.
unsigned long lastTime = 0;

unsigned long timerDelay = 30000;

Tạo một máy chủ Web không đồng bộ trên cổng 80.
AsyncWebServer server(80);

Tạo nguồn sự kiện
Để tự động hiển thị thông tin trên máy chủ web khi có kết quả đọc mới, chúng tơi sẽ sử
dụng Sự kiện do máy chủ gửi (SSE).
Dịng sau tạo nguồn sự kiện mới trên /events.
AsyncEventSource events("/events");

12/20


Sự kiện do máy chủ gửi cho phép một trang web (máy khách) nhận cập nhật từ máy chủ.
Chúng tôi sẽ sử dụng điều này để tự động hiển thị các bài đọc mới trên trang máy chủ
web khi các bài đọc BME680 mới có sẵn.

Quan trọng: Sự kiện do máy chủ gửi không được hỗ trợ trên Internet Explorer.

Nhận bài đọc BME680
Hàm getBME680Reading () nhận các chỉ số khí, nhiệt độ, độ ẩm và áp suất từ cảm biến
BME680 và lưu chúng trên các biến khíĐiện trở, nhiệt độ , độ ẩm và áp suất.
void getBME680Readings(){

// Tell BME680 to begin measurement.

unsigned long endTime = bme.beginReading();

if (endTime == 0) {

Serial.println(F("Failed to begin reading :("));

return;

}

if (!bme.endReading()) {

Serial.println(F("Failed to complete reading :("));

return;

}

temperature = bme.temperature;

pressure = bme.pressure / 100.0;


humidity = bme.humidity;

gasResistance = bme.gas_resistance / 1000.0;

}

Xử lý
Hàm processor() thay thế bất kỳ trình giữ chỗ nào trên văn bản HTML được sử dụng để
xây dựng trang web bằng các bài đọc cảm biến hiện tại.
String processor(const String& var){

getBME680Readings();

//Serial.println(var);

if(var == "TEMPERATURE"){

return String(temperature);

}

else if(var == "HUMIDITY"){

return String(humidity);

}

else if(var == "PRESSURE"){


return String(pressure);

}

else if(var == "GAS"){

return String(gasResistance);

}

}

Điều này cho phép chúng tôi hiển thị các bài đọc cảm biến hiện tại trên trang web khi bạn
truy cập nó lần đầu tiên. Nếu không, bạn sẽ thấy một khoảng trống cho đến khi có các
bài đọc mới (có thể mất một chút thời gian tùy thuộc vào thời gian trễ bạn đã xác định
13/20


trên mã).

Xây dựng trang Web
Biến index_html chứa tất cả HTML, CSS và JavaScript để xây dựng trang web. Chúng tôi
sẽ không đi vào chi tiết về cách HTML và CSS hoạt động. Chúng ta sẽ chỉ xem xét cách
xử lý các sự kiện được gửi bởi máy chủ.
Chúng ta hãy xem nhanh dòng hiển thị nhiệt độ:

<i class="fas fa-thermometer-half"></i> TEMPERATURE

class="reading"><span id="temp">%TEMPERATURE%</span> °C</span>



Bạn có thể thấy rằng chỗ dành sẵn %TEMPERATURE% được bao quanh bởi các thẻ
<span id="temp"></span>. Thuộc tính HTML id được sử dụng để chỉ định một id duy nhất

cho một phần tử HTML.
Nó được sử dụng để trỏ đến một kiểu cụ thể hoặc nó có thể được JavaScript sử dụng để
truy cập và thao tác với phần tử với id cụ thể đó. Đó là những gì chúng tơi sẽ làm.
Ví dụ: khi máy chủ web nhận được một sự kiện mới với chỉ số nhiệt độ mới nhất, chúng
tôi sẽ cập nhật phần tử HTML với id "temp" với cách đọc mới.
Một quá trình tương tự được thực hiện để cập nhật các bài đọc khác.
Xử lý sự kiện
Tạo một đối tượng EventSource mới và chỉ định URL của trang gửi cập nhật. Trong
trường hợp của chúng tơi, đó là /events.
if (!!window.EventSource) {

var source = new EventSource('/events');

Khi bạn đã khởi tạo nguồn sự kiện, bạn có thể bắt đầu nghe thư từ máy chủ bằng
addEventListener().
Đây là những trình nghe sự kiện mặc định, như được hiển thị ở đây trong tài liệu
AsyncWebServer.
source.addEventListener('open', function(e) {

console.log("Events Connected");

}, false);

source.addEventListener('error', function(e) {

if (e.target.readyState != EventSource.OPEN) {

console.log("Events Disconnected");

}

}, false);

source.addEventListener('message', function(e) {

console.log("message", e.data);

}, false);

14/20


Sau đó, thêm trình nghe sự kiện cho "nhiệt độ".
source.addEventListener('temperature', function(e) {

Khi có chỉ số nhiệt độ mới, ESP8266 sẽ gửi một sự kiện ("nhiệt độ") cho khách hàng. Các
dòng sau đây xử lý những gì xảy ra khi trình duyệt nhận được sự kiện đó.
console.log("temperature", e.data);

document.getElementById("temp").innerHTML = e.data;

Về cơ bản, in các bài đọc mới trên bảng điều khiển trình duyệt và đặt dữ liệu nhận được
vào phần tử với id tương ứng ("temp") trên trang web.
Một bộ xử lý tương tự được thực hiện cho độ ẩm, áp suất và khả năng chống khí.
source.addEventListener('humidity', function(e) {

console.log("humidity", e.data);

document.getElementById("hum").innerHTML = e.data;

}, false);




source.addEventListener('pressure', function(e) {

console.log("pressure", e.data);

document.getElementById("pres").innerHTML = e.data;

}, false);



source.addEventListener('gas', function(e) {

console.log("gas", e.data);

document.getElementById("gas").innerHTML = e.data;

}, false);

Thiết lập()
Trong setup(), khởi tạo Serial Monitor.
Serial.begin(115200);

Kết nối ESP8266 với mạng cục bộ của bạn và in địa chỉ IP ESP8266.
// Set device as a Wi-Fi Station

WiFi.begin(ssid, password);


while (WiFi.status() != WL_CONNECTED) {

delay(1000);

Serial.println("Setting as a Wi-Fi Station..");

}

Serial.print("Station IP Address: ");

Serial.println(WiFi.localIP());

Serial.println();

Khởi tạo cảm biến BME680.

15/20


// Init BME680 sensor

if (!bme.begin()) {

Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));

while (1);

}

// Set up oversampling and filter initialization


bme.setTemperatureOversampling(BME680_OS_8X);

bme.setHumidityOversampling(BME680_OS_2X);

bme.setPressureOversampling(BME680_OS_4X);

bme.setIIRFilterSize(BME680_FILTER_SIZE_3);

bme.setGasHeater(320, 150); // 320*C for 150 ms

Xử lý yêu cầu
Khi bạn truy cập địa chỉ IP ESP8266 trên thư mục gốc / URL, hãy gửi văn bản được lưu
trữ trên biến index_html để xây dựng trang web và chuyển bộ xử lý làm đối số, để tất cả
các trình giữ chỗ được thay thế bằng các bài đọc cảm biến mới nhất.
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){

request->send_P(200, "text/html", index_html, processor);

});

Nguồn sự kiện máy chủ
Thiết lập nguồn sự kiện trên máy chủ.
// Handle Web Server Events

events.onConnect([](AsyncEventSourceClient *client){

if(client->lastId()){

Serial.printf("Client reconnected! Last message ID that it got is: %u\n",

client->lastId());

}

// send event with message "hello!", id current millis

// and set reconnect delay to 1 second

client->send("hello!", NULL, millis(), 10000);

});

server.addHandler(&events);

Cuối cùng, khởi động máy chủ.
server.begin();

vòng lặp()
Trong loop(), nhận các chỉ số cảm biến mới:
getBME680Readings();

In các bài đọc mới trong Màn hình nối tiếp.
Serial.printf("Temperature = %.2f ºC \n", temperature);

Serial.printf("Humidity = %.2f % \n", humidity);

Serial.printf("Pressure = %.2f hPa \n", pressure);

Serial.printf("Gas Resistance = %.2f KOhm \n", gasResistance);


Serial.println();

16/20


Cuối cùng, gửi sự kiện đến trình duyệt với các bài đọc cảm biến mới nhất để cập nhật
trang web.
// Send Events to the Web Server with the Sensor Readings

events.send("ping",NULL,millis());

events.send(String(temperature).c_str(),"temperature",millis());

events.send(String(humidity).c_str(),"humidity",millis());

events.send(String(pressure).c_str(),"pressure",millis());

events.send(String(gasResistance).c_str(),"gas",millis());

Sơ đồ sau đây tóm tắt cách hoạt động của Sự kiện do Máy chủ Gửi để cập nhật trang
web.

Tải mã lên
Bây giờ, hãy tải mã lên ESP8266 của bạn. Đảm bảo rằng bạn đã chọn đúng bo mạch và
cổng COM.

17/20


Sau khi tải lên, hãy mở Màn hình nối tiếp với tốc độ truyền là 115200. Nhấn nút RST / EN

trên bo mạch ESP8266. Địa chỉ IP phải được in trong màn hình nối tiếp.

Cuộc biểu tình
Mở trình duyệt trong mạng cục bộ của bạn và nhập địa chỉ IP ESP8266. Bạn sẽ có quyền
truy cập vào máy chủ web ESP8266 với các bài đọc BME680 mới nhất.

Các bài đọc được cập nhật tự động bằng cách sử dụng Sự kiện do máy chủ gửi.

18/20


Tổng kết
Trong hướng dẫn này, bạn đã học cách xây dựng trạm thời tiết máy chủ web không đồng
bộ với ESP8266 để hiển thị số đọc cảm biến BME680 - khí (chất lượng khơng khí), nhiệt
độ, độ ẩm và áp suất - và cách cập nhật các bài đọc tự động trên trang web bằng Sự
kiện do máy chủ gửi.
Chúng tơi có các hướng dẫn máy chủ web khác mà bạn có thể thích:
ESP8266 DHT11 / DHT22 Nhiệt độ và Độ ẩm Máy chủ Web với Arduino IDE
Máy chủ web ESP8266 - Kiểm soát đầu ra với Arduino IDE
19/20


ESP8266 với BME280 sử dụng Arduino IDE (Áp suất, Nhiệt độ, Độ ẩm)
Cảm biến nhiệt độ ESP8266 DS18B20 với Arduino IDE (Máy chủ Web, Đơn, Nhiều)
Chúng tôi hy vọng bạn đã tìm thấy dự án này thú vị. Tìm hiểu thêm về ESP8266 với các
tài nguyên của chúng tôi:
Tự động hóa nhà bằng ESP8266
Lập trình MicroPython với ESP32 và ESP8266
Các dự án và hướng dẫn ESP8266 khác...
Cảm ơn bạn đã đọc.


20/20



×