Hướng dẫn này chỉ ra cách sử dụng môđun cảm biến BME280 với ESP8266 để đọc áp suất, nhiệt độ, độ ẩm và ước tính độ cao bằng Arduino IDE. Cảm biến BME280 sử dụng giao thức truyền thông I2C hoặc SPI để trao đổi dữ liệu với vi điều khiển.
Trang 1ESP8266 với BME280 sử dụng Arduino IDE (Áp suất,
Nhiệt độ, Độ ẩm)
Hướng dẫn này chỉ ra cách sử dụng mô-đun cảm biến BME280 với ESP8266 để đọc áp suất, nhiệt độ, độ ẩm và ước tính độ cao bằng Arduino IDE Cảm biến BME280 sử dụng giao thức truyền thông I2C hoặc SPI để trao đổi dữ liệu với vi điều khiển.
Chúng tôi sẽ chỉ cho bạn cách nối cảm biến với ESP8266, cài đặt các thư viện cần thiết
và viết một bản phác thảo đơn giản hiển thị các chỉ số cảm biến Chúng tôi cũng sẽ xây dựng một ví dụ về máy chủ web để hiển thị các bài đọc áp suất, nhiệt độ và độ ẩm mới
nhất.
Trước khi tiếp tục với hướng dẫn này, bạn nên cài đặt tiện ích bổ sung ESP8266 trong
Arduino IDE của mình.
Cài đặt bảng ESP8266 trong Arduino IDE
Bạn cũng có thể thích đọc các hướng dẫn BME280 khác:
Giới thiệu mô-đun cảm biến BME280
Mô-đun cảm biến BME280 đọc áp suất khí quyển, nhiệt độ và độ ẩm Vì áp suất thay đổi theo độ cao, bạn cũng có thể ước tính độ cao Có một số phiên bản của mô-đun cảm
biến này Chúng tôi đang sử dụng mô-đun được minh họa trong hình bên dưới.
Trang 2Cảm biến này giao tiếp bằng giao thức truyền thông I2C, vì vậy hệ thống dây điện rất
đơn giản Bạn có thể sử dụng chân ESP8266 I2C mặc định như thể hiện trong bảng sau:
BME280 ESP8266
Có các phiên bản khác của cảm biến này có thể sử dụng giao thức truyền thông SPI
hoặc I2C, như mô-đun được hiển thị trong hình tiếp theo:
Trang 3Nếu bạn đang sử dụng một trong những cảm biến này, để sử dụng giao thức truyền
thông I2C, hãy sử dụng các chân sau:
SCK (Ghim SCL) GPIO 5
SDI (chân SDA) GPIO 4
Nếu bạn sử dụng giao thức truyền thông SPI, bạn cần sử dụng các chân sau:
SCK (Đồng hồ SPI) GPIO 14
SDO (MISO) GPIO 12
SDI (MOSI) GPIO 13
CS (Lựa chọn chip) GPIO 15
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 BME280
ESP8266 (đọc bảng phát triển ESP8266 tốt nhất)
Breadboard
Dây nhảy
Sơ đồ - ESP8266 với BME280 sử dụng I2C
Trang 4Chúng ta sẽ sử dụng giao tiếp I2C với mô-đun cảm biến BME280 Để làm được điều đó, hãy nối cảm biến với các chân ESP8266 SDA và SCL, như thể hiện trong sơ đồ sau.
Đề xuất đọc: Hướng dẫn tham khảo sơ đồ chân ESP8266
Cài đặt thư viện BME280
Để đọc từ mô-đun cảm biến BME280, bạn cần sử dụng thư viện Adafruit_BME280 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 bme280" trên hộp Tìm kiếm và cài đặt thư viện.
Trang 5Cài đặt thư viện Adafruit_Sensor
Để sử dụng thư viện BME280, 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ó.
Sau khi cài đặt các thư viện, hãy khởi động lại Arduino IDE của bạn.
Áp suất đọc, nhiệt độ và độ ẩm
Trang 6Để đọc áp suất, nhiệt độ và độ ẩm, chúng tôi sẽ sử dụng một ví dụ phác thảo từ thư viện.
Sau khi cài đặt thư viện BME280 và thư viện Adafruit_Sensor, hãy mở Arduino IDE và đi
tới Tệp > Ví dụ > thư viện Adafruit BME280 > kiểm tra bme280.
Trang 7/*********
Complete project details at https://randomnerdtutorials.com
*********/
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
/*#include <SPI.h>
#define BME_SCK 14
#define BME_MISO 12
#define BME_MOSI 13
#define BME_CS 15*/
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
unsigned long delayTime;
void setup() {
Serial.begin(9600);
Serial.println(F("BME280 test"));
bool status;
// default settings
// (you can also pass in a Wire library object like &Wire2)
status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
Serial.println(" Default Test ");
delayTime = 1000;
Serial.println();
}
void loop() {
printValues();
delay(delayTime);
}
void printValues() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
// Convert temperature to Fahrenheit
/*Serial.print("Temperature = ");
Serial.print(1.8 * bme.readTemperature() + 32);
Serial.println(" *F");*/
Trang 8Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println(" hPa");
Serial.print("Approx Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.println();
}
Xem mã thô
Chúng tôi đã thực hiện một vài sửa đổi đối với bản phác thảo để làm cho nó hoàn toàn
tương thích với ESP8266.
Mã hoạt động như thế nào
Tiếp tục đọc phần này để tìm hiểu cách mã hoạt động hoặc chuyển đến phần "Trình
diễn".
Thư viện
Mã bắt đầu bằng cách bao gồm các thư viện cần thiết: thư viện dây để sử dụng I2C và
các thư viện Adafruit_Sensor và Adafruit_BME280 để giao tiếp với cảm biến BME280.
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
Truyền thông SPI
Khi chúng ta sẽ sử dụng giao tiếp I2C, các dòng sau xác định các chân SPI được nhận
xét:
/*#include <SPI.h>
#define BME_SCK 14
#define BME_MISO 12
#define BME_MOSI 13
#define BME_CS 15*/
Lưu ý: nếu bạn đang sử dụng giao tiếp SPI, hãy sử dụng chân SPI mặc định ESP8266:
GPIO 13 GPIO 12 GPIO 14 GPIO 15
Trang 9Áp lực mực nước biển
Một biến gọi là SEALEVELPRESSURE_HPA được tạo ra.
#define SEALEVELPRESSURE_HPA (1013.25)
Biến này tiết kiệm áp suất ở mực nước biển tính bằng hectopascal (tương đương với
milibar) Biến này được sử dụng để ước tính độ cao cho một áp suất nhất định bằng cách
so sánh nó với áp suất mực nước biển Ví dụ này sử dụng giá trị mặc định, nhưng để có kết quả chính xác hơn, hãy thay thế giá trị bằng áp suất mực nước biển hiện tại tại vị trí của bạn.
I2C
Ví dụ này sử dụng giao thức truyền thông I2C theo mặc định Như bạn có thể thấy, bạn chỉ cần tạo một đối tượng Adafruit_BME280 gọi là bme.
Adafruit_BME280 bme; // I2C
Để sử dụng SPI, bạn cần nhận xét dòng trước này và bỏ ghi chú một trong các dòng sau.
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
Thiết lập()
Trong setup(), bắt đầu giao tiếp nối tiếp:
Serial.begin(9600);
Và khởi tạo cảm biến:
status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
Chúng tôi khởi tạo cảm biến với địa chỉ 0x76 Trong trường hợp bạn không nhận được
chỉ số cảm biến, hãy kiểm tra địa chỉ I2C của cảm biến Với cảm biến BME280 có dây với ESP8266 của bạn, hãy chạy bản phác thảo máy quét I2C này để kiểm tra địa chỉ cảm
biến của bạn Sau đó, thay đổi địa chỉ nếu cần.
Giá trị in
Trong loop(), hàm printValues() đọc các giá trị từ BME280 và in kết quả trong Serial
Monitor.
void loop() {
printValues();
delay(delayTime);
}
Trang 10Đọc nhiệt độ, độ ẩm, áp suất và độ cao ước tính cũng đơn giản như sử dụng các
phương pháp sau trên đối tượng bme:
bme.readTemperature () - đọc nhiệt độ tính bằng độ C;
bme.readHumidity() – đọc độ ẩm tuyệt đối;
bme.readPressure() – đọc áp suất tính bằng hPa (hectoPascal = millibar);
bme.readAltitude (SEALEVELPRESSURE_HPA) - ước tính độ cao tính bằng mét
dựa trên áp suất ở mực nước biển.
Cuộc biểu tình
Tải mã lên ESP8266 của bạn và mở Màn hình nối tiếp với tốc độ truyền 9600 Nhấn nút RST trên bo mạch để chạy mã Bạn sẽ thấy các bài đọc được hiển thị trên Màn hình nối tiếp.
Máy chủ web ESP8266 với cảm biến BME280
Cảm biến BME280 đo nhiệt độ, độ ẩm và áp suất Vì vậy, bạn có thể dễ dàng xây dựng
một trạm thời tiết nhỏ gọn và theo dõi các phép đo bằng máy chủ web được xây dựng
với ESP8266 - đó là những gì chúng ta sẽ làm trong phần này
Trang 11Sao chép mã sau vào Arduino IDE của bạn Chưa tải nó lên Trước tiên, bạn cần bao
gồm SSID và mật khẩu của mình.
Trang 12/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/
// Load Wi-Fi library
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>
//uncomment the following lines if you're using SPI
/*#include <SPI.h>
#define BME_SCK 14
#define BME_MISO 12
#define BME_MOSI 13
#define BME_CS 15*/
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
// Set web server port number to 80
WiFiServer server(80);
// Variable to store the HTTP request
String header;
void setup() {
Serial.begin(115200);
bool status;
// default settings
// (you can also pass in a Wire library object like &Wire2)
//status = bme.begin();
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
// Connect to Wi-Fi network with SSID and password
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Print local IP address and start web server
Serial.println("");
Trang 13Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}
void loop(){
WiFiClient client = server.available(); // Listen for incoming clients
if (client) { // If a new client connects,
Serial.println("New Client."); // print a message out in the serial port
String currentLine = ""; // make a String to hold incoming data from the client
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
header += c;
if (c == '\n') { // if the byte is a newline character // if the current line is blank, you got two newline characters in a
row
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// Display the HTML web page
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
// CSS to style the table
client.println("<style>body { text-align: center; font-family:
\"Trebuchet MS\", Arial;}");
client.println("table { border-collapse: collapse; width:35%; margin-left:auto; margin-right:auto; }");
client.println("th { padding: 12px; background-color: #0043af; color: white; }");
client.println("tr { border: 1px solid #ddd; padding: 12px; }");
client.println("tr:hover { background-color: #bcbcbc; }");
client.println("td { border: none; padding: 12px; }");
client.println(".sensor { color:white; font-weight: bold; background-color: #bcbcbc; padding: 1px; }");
// Web Page Heading
client.println("</style></head><body><h1>ESP8266 with BME280</h1>");
client.println("<table><tr><th>MEASUREMENT</th><th>VALUE</th></tr>"); client.println("<tr><td>Temp Celsius</td><td><span
Trang 14class=\"sensor\">");
client.println(bme.readTemperature());
client.println(" *C</span></td></tr>");
client.println("<tr><td>Temp Fahrenheit</td><td><span
class=\"sensor\">");
client.println(1.8 * bme.readTemperature() + 32);
client.println(" *F</span></td></tr>");
client.println("<tr><td>Pressure</td><td><span class=\"sensor\">");
client.println(bme.readPressure() / 100.0F);
client.println(" hPa</span></td></tr>");
client.println("<tr><td>Approx Altitude</td><td><span
class=\"sensor\">");
client.println(bme.readAltitude(SEALEVELPRESSURE_HPA));
client.println(" m</span></td></tr>");
client.println("<tr><td>Humidity</td><td><span class=\"sensor\">");
client.println(bme.readHumidity());
client.println(" %</span></td></tr>");
client.println("</body></html>");
// The HTTP response ends with another blank line
client.println();
// Break out of the while loop
break;
} else { // if you got a newline, then clear currentLine
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
}
}
// Clear the header variable
header = "";
// Close the connection
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
}
}
Xem mã thô
Mã hoạt động như thế nào
Tiếp tục đọc phần này để tìm hiểu cách mã hoạt động hoặc chuyển sang phần "Trình
diễn".
Bản phác thảo này rất giống với bản phác thảo được sử dụng trong Hướng dẫn Máy chủ Web ESP8266 Đầu tiên, bạn bao gồm thư viện ESP8266WiFi và các thư viện cần thiết
để đọc từ cảm biến BME280.
Trang 15// Load Wi-Fi library
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <Adafruit_Sensor.h>
Dòng tiếp theo xác định một biến để tiết kiệm áp suất ở mực nước biển Để ước tính độ cao chính xác hơn, hãy thay thế giá trị bằng áp suất mực nước biển hiện tại tại vị trí của bạn.
#define SEALEVELPRESSURE_HPA (1013.25)
Trong dòng tiếp theo, bạn tạo một đối tượng Adafruit_BME280 gọi là bme mà theo mặc định thiết lập giao tiếp với cảm biến bằng I2C.
Adafruit_BME280 bme; // I2C
Như đã đề cập trước đây, bạn cần chèn ssid và mật khẩu của mình vào các dòng sau
bên trong dấu ngoặc kép.
const char* ssid = "";
const char* password = "";
Sau đó, bạn đặt máy chủ web của mình thành cổng 80.
// Set web server port number to 80
WiFiServer server(80);
Dòng sau tạo một biến để lưu trữ tiêu đề của yêu cầu HTTP:
String header;
Thiết lập()
Trong setup(), chúng ta bắt đầu giao tiếp nối tiếp với tốc độ truyền 115200 cho mục đích
gỡ lỗi.
Serial.begin(115200);
Bạn kiểm tra xem cảm biến BME280 đã được khởi tạo thành công.
if (!bme.begin(0x76)) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
Các dòng sau bắt đầu kết nối Wi-Fi với WiFi.begin(ssid, mật khẩu), đợi kết nối thành
công và in địa chỉ IP ESP trong Màn hình nối tiếp.