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.
ESP8266 với BME280 sử dụng Arduino IDE (Áp suất, Nhiệt độ, Độ ẩm) Hướng dẫn cách sử dụng mô-đun cảm biến BME280 với ESP8266 để đọc áp suất, nhiệt độ, độ ẩm ước tính độ cao Arduino IDE Cảm biến BME280 sử dụng giao thức truyền thông I2C SPI để trao đổi liệu với vi điều khiển Chúng cho bạn cách nối cảm biến với ESP8266, cài đặt thư viện cần thiết viết phác thảo đơn giản hiển thị số cảm biến Chúng xây dựng ví dụ máy chủ web để hiển thị đọc áp suất, nhiệt độ độ ẩm Trước 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 Arduino IDE Cài đặt bảng ESP8266 Arduino IDE Bạn thích đọ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 độ độ ẩm Vì áp suất thay đổi theo độ cao, bạn ước tính độ cao Có số phiên mơ-đun cảm biến Chúng sử dụng mô-đun minh họa hình bên 1/19 Cảm biến giao tiếp giao thức truyền thơng I2C, hệ thống dây điện đơn giản Bạn sử dụng chân ESP8266 I2C mặc định thể bảng sau: BME280 ESP8266 Vin 3.3V GND GND SCL GPIO SDA GPIO Có phiên khác cảm biến sử dụng giao thức truyền thông SPI I2C, mô-đun hiển thị hình tiếp theo: 2/19 Nếu bạn sử dụng cảm biến này, để sử dụng giao thức truyền thông I2C, sử dụng chân sau: BME280 ESP8266 SCK (Ghim SCL) GPIO SDI (chân SDA) GPIO Nếu bạn sử dụng giao thức truyền thông SPI, bạn cần sử dụng chân sau: BME280 ESP8266 SCK (Đồng hồ SPI) GPIO 14 SDO (MISO) GPIO 12 SDI (MOSI) GPIO 13 CS (Lựa chọn chip) GPIO 15 Các phận cần thiết Để hoàn thành hướng dẫn này, bạn cần 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 3/19 Chúng ta sử dụng giao tiếp I2C với mô-đun cảm biến BME280 Để làm điều đó, nối cảm biến với chân ESP8266 SDA SCL, thể 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 bước để cài đặt thư viện Arduino IDE bạn: Mở Arduino IDE bạn tới Sketch > Include Library > Manage Libraries Trình quản lý thư viện mở Tìm kiếm "adafruit bme280" hộp Tìm kiếm cài đặt thư viện 4/19 Cài đặt thư viện Adafruit_Sensor Để sử dụng thư viện BME280, bạn cần cài đặt thư viện Adafruit_Sensor Làm theo bước để cài đặt thư viện Arduino IDE bạn: Truy cập Sketch > Include Library > Manage Libraries nhập "Adafruit Unified Sensor" vào hộp tìm kiếm Cuộn xuống để tìm thư viện cài đặt Sau cài đặt thư viện, khởi động lại Arduino IDE bạn Áp suất đọc, nhiệt độ độ ẩm 5/19 Để đọc áp suất, nhiệt độ độ ẩm, chúng tơi sử dụng ví dụ phác thảo từ thư viện Sau cài đặt thư viện BME280 thư viện Adafruit_Sensor, mở Arduino IDE tới Tệp > Ví dụ > thư viện Adafruit BME280 > kiểm tra bme280 6/19 /********* Complete project details at https://randomnerdtutorials.com *********/ #include #include #include /*#include #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");*/ 7/19 Serial.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 thực vài sửa đổi phác thảo để làm cho hồn tồn tương thích với ESP8266 Mã hoạt động Tiếp tục đọc phần để tìm hiểu cách mã hoạt động chuyển đến phần "Trình diễn" Thư viện Mã bắt đầu cách bao gồm thư viện cần thiết: thư viện dây để sử dụng I2C thư viện Adafruit_Sensor Adafruit_BME280 để giao tiếp với cảm biến BME280 #include #include #include Truyền thông SPI Khi sử dụng giao tiếp I2C, dòng sau xác định chân SPI nhận xét: /*#include #define BME_SCK 14 #define BME_MISO 12 #define BME_MOSI 13 #define BME_CS 15*/ Lưu ý: bạn sử dụng giao tiếp SPI, sử dụng chân SPI mặc định ESP8266: MOSI MISO CLK CS GPIO 13 GPIO 12 GPIO 14 GPIO 15 Á ể 8/19 Áp lực mực nước biển Một biến gọi SEALEVELPRESSURE_HPA tạo #define SEALEVELPRESSURE_HPA (1013.25) Biến tiết kiệm áp suất mực nước biển tính hectopascal (tương đương với milibar) Biến sử dụng để ước tính độ cao cho áp suất định cách so sánh với áp suất mực nước biển Ví dụ sử dụng giá trị mặc định, để có kết xác hơn, thay giá trị áp suất mực nước biển tại vị trí bạn I2C Ví dụ sử dụng giao thức truyền thơng I2C theo mặc định Như bạn thấy, bạn cần tạo đối tượng Adafruit_BME280 gọi bme Adafruit_BME280 bme; // I2C Để sử dụng SPI, bạn cần nhận xét dòng trước bỏ ghi 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 khởi tạo cảm biến với địa 0x76 Trong trường hợp bạn không nhận số cảm biến, kiểm tra địa I2C cảm biến Với cảm biến BME280 có dây với ESP8266 bạn, chạy phác thảo máy quét I2C để kiểm tra địa cảm biến bạn Sau đó, thay đổi địa cần Giá trị in Trong loop(), hàm printValues() đọc giá trị từ BME280 in kết Serial Monitor void loop() { printValues(); delay(delayTime); } 9/19 Đọc nhiệt độ, độ ẩm, áp suất độ cao ước tính đơn giản sử dụng phương pháp sau đối tượng bme: bme.readTemperature () - đọc nhiệt độ tính độ C; bme.readHumidity() – đọc độ ẩm tuyệt đối; bme.readPressure() – đọc áp suất tính hPa (hectoPascal = millibar); bme.readAltitude (SEALEVELPRESSURE_HPA) - ước tính độ cao tính mét dựa áp suất mực nước biển Cuộc biểu tình Tải mã lên ESP8266 bạn mở Màn hình nối tiếp với tốc độ truyền 9600 Nhấn nút RST bo mạch để chạy mã Bạn thấy đọc hiển thị 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 áp suất Vì vậy, bạn dễ dàng xây dựng trạm thời tiết nhỏ gọn theo dõi phép đo máy chủ web xây dựng với ESP8266 - làm phần 10/19 Sao chép mã sau vào Arduino IDE bạn Chưa tải lên Trước tiên, bạn cần bao gồm SSID mật 11/19 /********* Rui Santos Complete project details at https://randomnerdtutorials.com *********/ // Load Wi-Fi library #include #include #include #include //uncomment the following lines if you're using SPI /*#include #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(""); 12/19 Serial.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(""); client.println(""); client.println(""); // CSS to style the table client.println("body { text-align: center; font-family: \"Trebuchet MS\", Arial;}"); client.println("table { border-collapse: collapse; width:35%; marginleft: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; backgroundcolor: #bcbcbc; padding: 1px; }"); // Web Page Heading client.println("ESP8266 with BME280"); client.println("MEASUREMENTVALUE"); client.println("Temp Celsius"); client.println(bme.readTemperature()); client.println(" *C"); client.println("Temp Fahrenheit"); client.println(1.8 * bme.readTemperature() + 32); client.println(" *F"); client.println("Pressure"); client.println(bme.readPressure() / 100.0F); client.println(" hPa"); client.println("Approx Altitude"); client.println(bme.readAltitude(SEALEVELPRESSURE_HPA)); client.println(" m"); client.println("Humidity"); client.println(bme.readHumidity()); client.println(" %"); client.println(""); // 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 Tiếp tục đọc phần để tìm hiểu cách mã hoạt động chuyển sang phần "Trình diễn" Bản phác thảo giống với phác thảo sử dụng Hướng dẫn Máy chủ Web ESP8266 Đầu tiên, bạn bao gồm thư viện ESP8266WiFi thư viện cần thiết để đọc từ cảm biến BME280 14/19 // Load Wi-Fi library #include #include #include #include Dòng xác định biến để tiết kiệm áp suất mực nước biển Để ước tính độ cao xác hơn, thay giá trị áp suất mực nước biển tại vị trí bạn #define SEALEVELPRESSURE_HPA (1013.25) Trong dịng tiếp theo, bạn tạo đối tượng Adafruit_BME280 gọi bme mà theo mặc định thiết lập giao tiếp với cảm biến I2C Adafruit_BME280 bme; // I2C Như đề cập trước đây, bạn cần chèn ssid mật vào dịng sau bên dấu ngoặc kép const char* ssid = ""; const char* password = ""; Sau đó, bạn đặt máy chủ web thành cổng 80 // Set web server port number to 80 WiFiServer server(80); Dòng sau tạo biến để lưu trữ tiêu đề yêu cầu HTTP: String header; Thiết lập() Trong setup(), 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 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 in địa IP ESP Màn hình nối tiếp 15/19 // 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(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); server.begin(); vòng lặp() Trong loop(), chúng tơi lập trình xảy máy khách thiết lập kết nối với máy chủ web ESP lắng nghe khách hàng với dòng này: WiFiClient client = server.available(); // Listen for incoming clients Khi nhận yêu cầu từ máy khách, chúng tơi lưu liệu đến Vịng lặp while theo sau chạy miễn máy khách kết nối 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(); Hiển thị trang web HTML Điều bạn cần làm gửi phản hồi cho khách hàng văn HTML để xây dựng trang web Trang web gửi đến máy khách cách sử dụng biểu thức client.println() Bạn nên nhập bạn muốn gửi cho khách hàng dạng đối số Đoạn mã sau gửi trang web để hiển thị số đọc cảm biến bảng 16/19 client.println(""); client.println(""); client.println(""); // CSS to style the on/off buttons // Feel free to change the background-color and font-size attributes to fit your preferences client.println("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("ESP32 with BME280"); client.println("MEASUREMENTVALUE"); client.println("Temp Celsius"); client.println(bme.readTemperature()); client.println(" *C"); client.println("Temp Fahrenheit"); client.println(1.8 * bme.readTemperature() + 32); client.println(" *F"); client.println("Pressure"); client.println(bme.readPressure() / 100.0F); client.println(" hPa"); client.println("Approx Altitude"); client.println(bme.readAltitude(SEALEVELPRESSURE_HPA)); client.println(" m"); client.println("Humidity"); client.println(bme.readHumidity()); client.println(" %"); client.println(""); Lưu ý: bạn nhấp vào để xem trang web HTML đầy đủ Hiển thị số đọc cảm biến Để hiển thị số cảm biến bảng, cần gửi chúng thẻ < / td> tương ứng Ví dụ: để hiển thị nhiệt độ: client.println("Temp Celsius"); client.println(bme.readTemperature()); client.println(" *C"); Lưu ý: thẻ hữu ích để tạo kiểu cho phần cụ thể văn Trong trường hợp này, sử dụng thẻ để bao gồm việc đọc cảm biến lớp gọi "sensor" Điều hữu ích để tạo kiểu cho phần cụ thể văn CSS 17/19 Theo mặc định, bảng hiển thị số nhiệt độ độ C độ F Bạn nhận xét ba dịng sau, bạn muốn hiển thị nhiệt độ độ Fahrenheit /*client.println("Temp Celsius"); client.println(bme.readTemperature()); client.println(" *C");*/ Đóng kết nối Cuối cùng, phản hồi kết thúc, xóa biến header dừng kết nối với client client.stop() // Clear the header variable header = ""; // Close the connection client.stop(); Trình diễn máy chủ web Sau chèn thơng tin đăng nhập mạng bạn, bạn tải mã lên bảng Kiểm tra xem bạn chọn bo mạch cổng COM chưa tải mã lên ESP8266 bạn Sau tải lên, mở Màn hình nối tiếp với tốc độ truyền 115200 chép địa IP ESP8266 Mở trình duyệt bạn, dán địa IP bạn thấy đọc cảm biến 18/19 Để cập nhật đọc, bạn cần làm trang web Bạn thích: ESP8266 với Cảm biến DHT11 - Máy chủ web không đồng với cập nhật tự động Tổng kết Bài viết hướng dẫn chuyên sâu cách đọc áp suất, nhiệt độ độ ẩm từ cảm biến BME280 với ESP8266 Arduino IDE hiển thị đọc máy chủ web Bây giờ, bạn đưa dự án xa hiển thị số đọc cảm biến hình OLED; tạo ghi liệu; lưu đọc sở liệu riêng bạn gửi đọc đến tảng Tự động hóa gia đình bạn MQTT Dưới số dự án hướng dẫn giúp bạn thực ý tưởng này: ESP32 Xuất đọc cảm biến lên Google Trang tính Bộ ghi liệu trạm thời tiết công suất thấp (MicroPython) ESP32 / ESP8266 Chèn liệu vào Cơ sở liệu MySQL PHP Arduino IDE ESP8266 Node-RED với MQTT (Xuất Đăng ký) MQTT hoạt động Cảm ơn bạn đọc 19/19