Giao tiếp cảm biến nhiệt độ, độ ẩm, áp suất không khí BME280 với Arduino

Giao tiếp cảm biến nhiệt độ, độ ẩm, áp suất không khí BME280 với Arduino

Cảm biến BME280 kết hợp với Arduino cho phép đo nhiệt độ, độ ẩm và áp suất không khí. Thông qua giao tiếp I2C và sử dụng thư viện của Adafruit giúp dễ dàng và chính xác hơn trong việc đọc dữ liệu. Cảm biến BME280 mang lại nhiều lợi ích như điều khiển tự động, dự báo thời tiết, đo độ cao,… và vô số ứng dụng khác.

Để tạo động lực cho Team Arduino KIT ra nhiều bài viết chất lượng hơn, các bạn có thể ủng hộ mình bằng cách Donate qua MoMo, Ngân hàng, Paypal…Nhấn vào link bên dưới nhé.

Các linh kiện cần thiết cho dự án

TÊN LINH KIỆN SỐ LƯỢNG NƠI BÁN
Arduino Uno R3 1 Shopee | Cytron
Cảm biến nhiệt độ, độ ẩm, áp suất không khí BME280 1 Shopee | Cytron
Breadboard 1 Shopee | Cytron
Dây cắm (Đực – Đực) 10 – 20 Shopee | Cytron

Chức năng cảm biến đo nhiệt độ, độ ẩm và áp suất không khí BME280

Đo nhiệt độ

Cảm biến BME280 có khả năng đo nhiệt độ với độ chính xác cao. Phạm vi đo nhiệt độ rộng từ -40 đến +85 độ Celsius, và độ chính xác đo nhiệt độ là ±1 độ Celsius.

Đo độ ẩm

Cảm biến BME280 có khả năng đo độ ẩm trong không khí. Phạm vi đo độ ẩm từ 0% đến 100%, và độ chính xác đo độ ẩm là ±3%

Đo áp suất không khí

Cảm biến áp xuất không khí BME280 cũng có khả năng đo áp suất không khí. Phạm vi đo áp suất từ 300 đến 1100 hPa (hectopascal), tương đương với độ cao từ -500m đến 9000m so với mực nước biển. Độ chính xác đo áp suất là ±1 hPa.

Xem ngay: Hướng dẫn sử dụng cảm biến áp suất không khí BMP180 với Arduino

Tổng quan về Module cảm biến đo nhiệt độ, độ ẩm và áp suất không khí BME280

IC BME280

IC BME280 là một chip cảm biến đa chức năng được sản xuất bởi Bosch Sensortec. Đây là một chip tích hợp nhiều chức năng, bao gồm đo nhiệt độ, độ ẩm và áp suất không khí.

Cảm biến BME280 là sự kế thừa của các cảm biến như BMP180, BMP085 và BMP183.

Nguồn cấp

IC BME280 yêu cầu điện áp cấp từ 1.71V đến 3.6V. Điện áp hoạt động thông thường là 3.3V.

Công suất tiêu thụ của BME280 Arduino khá thấp, nó phù hợp cho các ứng dụng sử dụng pin. Trong chế độ hoạt động bình thường, dòng tiêu thụ khoảng 2.7 µA. Trong chế độ ngủ, công suất tiêu thụ có thể giảm xuống chỉ 0.1 µA.

Giao tiếp I2C

BME280 hỗ trợ giao tiếp thông qua chuẩn I2C (Inter-Integrated Circuit). Giao tiếp I2C cho phép kết nối dễ dàng giữa IC BME280 và Arduino.

Module BME280 hỗ trợ hai địa chỉ I2C, 0x76 và 0x77. Trong đó:

  • Địa chỉ I2C mặc định: 0x76 (đối với mức logic LOW trên chân địa chỉ).
  • Địa chỉ I2C thay thế: 0x77 (đối với mức logic HIGH trên chân địa chỉ).

Để thay đổi địa chỉ I2C thành 0x77, các bạn có thể làm theo như hình bên dưới.

Xem ngay: Khái niệm cơ bản về chuẩn giao tiếp I2C trong Arduino

Thông số kỹ thuật

Input voltage 3.3V – 5V
Current consumption 1mA (typ.) and 5μA (idle)
Temperature -40°C to 85°C (±1.0°C accuracy)
Humidity 0 to 100% RH (±3% accuracy)
Pressure 300Pa to 1100 hPa (±1 hPa accuracy)
Altitude 0 to 30,000 ft. (±1 m accuracy)

Sơ đồ chân cảm biến BME280

  • VCC: Chân nguồn (điện áp khuyến cáo từ 3.3 -5V)
  • GND: Chân nối đất
  • SDA: Chân dữ liệu
  • SCL: Chân xung Clock SCL

Sơ đồ đấu nối Module BME280 với Arduino

SCL SDA
Arduino Uno A5 A4
Arduino Nano A5 A4
Arduino Mega 21 20
Leonardo/Micro 3 2

Cài đặt thư viện Adafruit BME280

Khởi động phần mềm Arduino IDE lên, truy cập theo đường dẫn sau: Sketch > Include Library > Manage Libraries…

Tại cửa sổ “Library Manager”, các bạn gõ từ khóa “bme280” kéo xuống tìm đến thư viện của tác giả Adafruit BME280. Chọn phiên bản mới nhất và tiến hành cài đặt nhé.

Các bạn lưu ý, thư viện BME280 sử dụng thêm thư viện hỗ trợ Adafruit Unified Sensor, nên các bạn cũng tải vè luôn nhé.

Code ví dụ

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;

void setup() {
	Serial.begin(9600);

	if (!bme.begin(0x76)) {
		Serial.println("Could not find a valid BME280 sensor, check wiring!");
		while (1);
	}
}

void loop() {
	Serial.print("Temperature = ");
	Serial.print(bme.readTemperature());
	Serial.println("*C");

	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();
	delay(1000);
}

Các bạn có thể xem cảm biến nhiệt độ, độ ẩm và áp suất không khí đọc trên Serial Monitor

Giải thích Code

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

Khai báo thư viện cần thiết để làm việc với I2C và cảm biến BME280.

#define SEALEVELPRESSURE_HPA (1013.25)

Định nghĩa một hằng số cho áp suất mực nước biển ở đơn vị hPa.

Adafruit_BME280 bme;

Tạo một đối tượng BME280 để thực hiện việc giao tiếp và đọc dữ liệu từ cảm biến.

void setup() {
	Serial.begin(9600);

	if (!bme.begin(0x76)) {
		Serial.println("Could not find a valid BME280 sensor, check wiring!");
		while (1);
	}
}

Serial.begin(9600);: Khởi tạo giao tiếp Serial với tốc độ baud 9600 để gửi dữ liệu về Serial Monitor.

if (!bme.begin(0x76)) { … }: Khởi tạo cảm biến BME280 với địa chỉ I2C là 0x76. Nếu không tìm thấy cảm biến, sẽ in ra thông báo lỗi và chương trình sẽ bị treo.

void loop() {
	Serial.print("Temperature = ");
	Serial.print(bme.readTemperature());
	Serial.println("*C");

	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();
	delay(1000);
}

Serial.print(bme.readTemperature()): Đọc và in ra giá trị nhiệt độ từ cảm biến.

Serial.print(bme.readPressure() / 100.0F): Đọc và in ra giá trị áp suất không khí từ cảm biến, chuyển đổi đơn vị từ Pa sang hPa.

Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA)): Đọc và in ra giá trị độ cao ước tính từ áp suất không khí, dựa trên áp suất mực nước biển.

Serial.print(bme.readHumidity()): Đọc và in ra giá trị độ ẩm từ cảm biến.

delay(1000): Chờ 1 giây trước khi lặp lại quá trình đọc dữ liệu.

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments