IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32 & Cảm biến: Bài 16 – Hướng dẫn đọc cảm biến BMP280: đo áp suất/độ cao ước tính & theo dõi realtime

Sau các cảm biến nhiệt độ/độ ẩm, chúng ta chuyển sang BMP280 – cảm biến áp suất khí quyển (barometric pressure) rất phổ biến, cho phép ước tính độ cao và theo dõi biến động môi trường theo thời gian.

Bài này tập trung vào:

  • Làm việc với I2C sensor đa tham số
  • Đọc áp suấtước tính độ cao
  • Gửi dữ liệu realtime lên IoTLabs Cloud MQTT

1. Giới thiệu cảm biến BMP280

BMP280 là cảm biến của Bosch, thường dùng trong:

  • Trạm thời tiết mini
  • Thiết bị theo dõi độ cao
  • Ứng dụng ngoài trời, drone, IoT môi trường

Thông số chính:

  • Giao tiếp: I2C / SPI (bài này dùng I2C)
  • Áp suất: ~300 → 1100 hPa
  • Độ cao: ước tính từ áp suất
  • Địa chỉ I2C: 0x76 hoặc 0x77

📌 Lưu ý: BMP280 không đo độ ẩm (khác với BME280).

2. BMP280 dùng để làm gì trong IoT?

BMP280 đặc biệt hữu ích khi:

  • Theo dõi thời tiết (áp suất tăng/giảm)
  • Ước tính độ cao tương đối
  • Phát hiện thay đổi môi trường theo thời gian

👉 Dữ liệu áp suất rất hợp để vẽ biểu đồ dài hạn trên dashboard.

3. Chuẩn bị phần cứng & nối dây

Thiết bị

  • ESP32-C3 SuperMini
  • BMP280 (module I2C)

Kết nối I2C (chuẩn series)

BMP280ESP32-C3
VCC3.3V
GNDGND
SDAGPIO8
SCLGPIO9

4. Kiểm tra địa chỉ I2C

Trước khi code, luôn nên kiểm tra I2C address.

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin(8, 9);
}

void loop() {
  for (byte addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {
      Serial.print("Found I2C device at 0x");
      Serial.println(addr, HEX);
    }
  }
  delay(5000);
}

👉 Nếu thấy 0x76 hoặc 0x77 → OK.

5. Ví dụ 1: Đọc BMP280 local (Serial)

Thư viện

  • Adafruit BMP280 Library

Code mẫu

#include <Wire.h>
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp;

void setup() {
  Serial.begin(115200);
  Wire.begin(8, 9);

  if (!bmp.begin(0x76)) {
    Serial.println("BMP280 not found");
    while (1) delay(10);
  }
  Serial.println("BMP280 ready");
}

void loop() {
  float pressure = bmp.readPressure() / 100.0; // hPa
  float altitude = bmp.readAltitude(1013.25);  // m

  Serial.print("Pressure: ");
  Serial.print(pressure);
  Serial.print(" hPa | Altitude: ");
  Serial.print(altitude);
  Serial.println(" m");

  delay(2000);
}

📌 1013.25 là áp suất mực nước biển chuẩn – có thể điều chỉnh theo khu vực.

6. Chuẩn payload gửi IoTLabs Cloud

{
  "ts": 1760000000,
  "metrics": {
    "pressure": 1008.6,
    "altitude": 42.3
  }
}

7. Ví dụ 2: Gửi dữ liệu BMP280 realtime qua MQTT

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp;

// ===== CONFIG =====
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";

const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";

const char* MQTT_TOPIC =
  "iotlabs/<orgId>/devices/<deviceId>/telemetry";

WiFiClientSecure net;
PubSubClient mqtt(net);

unsigned long lastSend = 0;

void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
}

void connectMQTT() {
  net.setInsecure();
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  while (!mqtt.connected()) {
    mqtt.connect("esp32c3-bmp280", MQTT_USER, MQTT_PASS);
    delay(1000);
  }
}

void setup() {
  Serial.begin(115200);
  Wire.begin(8, 9);
  bmp.begin(0x76);

  connectWiFi();
  connectMQTT();
}

void loop() {
  if (!mqtt.connected()) connectMQTT();
  mqtt.loop();

  if (millis() - lastSend > 5000) {
    lastSend = millis();

    float pressure = bmp.readPressure() / 100.0;
    float altitude = bmp.readAltitude(1013.25);
    long ts = millis() / 1000;

    String payload = "{";
    payload += "\"ts\":" + String(ts) + ",";
    payload += "\"metrics\":{";
    payload += "\"pressure\":" + String(pressure, 1) + ",";
    payload += "\"altitude\":" + String(altitude, 1);
    payload += "}}";

    mqtt.publish(MQTT_TOPIC, payload.c_str());
    Serial.println(payload);
  }
}

8. Kinh nghiệm thực tế khi dùng BMP280

  • Độ cao là ước tính, không phải GPS
  • Thay đổi áp suất → độ cao thay đổi theo
  • Rất phù hợp để:
    • Theo dõi xu hướng
    • Vẽ biểu đồ dài hạn
  • Nên đặt cảm biến xa nguồn nhiệt

9. Tổng kết Bài 16

Sau bài này, bạn đã:

  • Đọc áp suất khí quyển
  • Ước tính độ cao
  • Gửi dữ liệu multi-metric realtime
  • Hoàn thiện thêm một mảnh quan trọng của IoT môi trường

👉 Bài tiếp theo: Bài 17 – Hướng dẫn đọc cảm biến BME280 bằng ESP32: đo nhiệt độ/độ ẩm/áp suất & theo dõi realtime.