IoTLabs

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

Series ESP32 & Cảm biến: Bài 37 – Đọc cảm biến INA226: đo dòng, áp DC & theo dõi realtime

INA226 là cảm biến đo điện áp, dòng điện và công suất DC rất chính xác, giao tiếp I2C, phù hợp cho các dự án IoT giám sát nguồn DC, pin, solar, nguồn cấp cho thiết bị, hoặc board ESP32/ESP8266.

Khác với PZEM-004T (AC), INA226 chuyên cho DC, an toàn hơn, nhỏ gọn và dễ tích hợp.

1) INA226 đo được gì?

INA226 có thể đo:

  • Bus Voltage (V): điện áp DC (0 → 36V)
  • Shunt Voltage (mV): sụt áp trên điện trở shunt
  • Current (A): dòng điện (phụ thuộc điện trở shunt)
  • Power (W): công suất tức thời

Thông số chính

  • Điện áp cấp: 2.7 – 5.5V
  • Dải đo điện áp: 0 – 36V DC
  • Sai số: ~ 1%
  • Chuẩn giao tiếp: I2C
  • Độ phân giải cao, ổn định hơn nhiều so với ACS712

👉 Rất phù hợp cho IoT DC & battery monitoring

2) Use case thực tế

INA226 thường dùng trong:

  • Giám sát nguồn DC cấp cho ESP32
  • Theo dõi pin / battery pack
  • Đo công suất solar panel DC
  • Giám sát tiêu thụ điện của motor DC, relay, thiết bị ngoại vi
  • Làm nền cho energy optimization DC

3) Chuẩn bị phần cứng

  • ESP32 (DevKit / ESP32-C3 / ESP32-S3)
  • Module INA226
  • Dây jumper
  • Nguồn DC cần đo (5V / 12V / 24V…)

4) Nối dây INA226 ↔ ESP32 (I2C)

INA226 dùng I2C, rất tiện.

INA226ESP32
VCC3V3 (hoặc 5V)
GNDGND
SDAGPIO21
SCLGPIO22

Phần đo dòng (quan trọng)

INA226 có 2 chân:

  • IN+
  • IN-

👉 Dòng điện phải đi qua điện trở shunt trên module:

Nguồn DC (+) → IN+  INA226  IN- → Tải (+)
Nguồn DC (-) --------------------→ Tải (-)

⚠️ Không mắc song song – phải mắc nối tiếp tải.

5) Nguyên lý đo (hiểu nhanh)

  • INA226 đo sụt áp rất nhỏ (mV) trên điện trở shunt
  • Từ đó tính:
    • Dòng điện: I = Vshunt / Rshunt
    • Công suất: P = Vbus × I
  • Tất cả xử lý trong chip, ESP32 chỉ đọc kết quả qua I2C

6) Cài thư viện Arduino

Trong Arduino IDE → Library Manager:

  • INA226 (by Rob Tillaart)

7) Code ESP32 đọc INA226 & publish MQTT realtime

Ví dụ:

  • Đọc điện áp, dòng, công suất
  • Gửi dữ liệu lên IoTLabs Cloud MQTT
  • Chu kỳ 2 giây
#include <Wire.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <INA226.h>

#define PUBLISH_EVERY_MS 2000

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

// MQTT
const char* MQTT_HOST = "broker.iotlabs.vn";
const int   MQTT_PORT = 1883;
const char* MQTT_USER = "YOUR_USER";
const char* MQTT_PASS = "YOUR_PASS";

const char* PROJECT_ID = "demo_project";
const char* DEVICE_ID  = "esp32_ina226_01";

WiFiClient espClient;
PubSubClient mqtt(espClient);
INA226 ina226;

unsigned long lastPub = 0;

uint32_t nowSeconds() {
  return millis() / 1000;
}

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

void mqttConnect() {
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  while (!mqtt.connected()) {
    mqtt.connect(DEVICE_ID, MQTT_USER, MQTT_PASS);
    delay(500);
  }
}

void publishTelemetry(float v, float i, float p) {
  String topic = String("iotlabs/") + PROJECT_ID + "/" + DEVICE_ID + "/telemetry";

  StaticJsonDocument<256> doc;
  doc["ts"] = nowSeconds();

  JsonObject metrics = doc.createNestedObject("metrics");
  metrics["voltage"] = v;
  metrics["current"] = i;
  metrics["power"]   = p;

  char payload[256];
  serializeJson(doc, payload);
  mqtt.publish(topic.c_str(), payload);
}

void setup() {
  Serial.begin(115200);
  Wire.begin();

  wifiConnect();
  mqttConnect();

  if (!ina226.begin()) {
    Serial.println("INA226 not found!");
    while (1);
  }

  // Cấu hình cơ bản
  ina226.setMaxCurrentShunt(5, 0.1); // 5A, Rshunt = 0.1Ω (tuỳ module)
}

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

  if (millis() - lastPub >= PUBLISH_EVERY_MS) {
    lastPub = millis();

    float voltage = ina226.getBusVoltage();
    float current = ina226.getCurrent();
    float power   = ina226.getPower();

    Serial.printf("V: %.2fV | I: %.3fA | P: %.2fW\n",
                  voltage, current, power);

    publishTelemetry(voltage, current, power);
  }
}

8) Dashboard realtime (IoTLabs Cloud MQTT)

Card hiển thị:

  • Voltage (V)
  • Current (A)
  • Power (W)

Chart gợi ý:

  • Power theo thời gian
  • Current spike (phát hiện bất thường)

Rule cảnh báo:

  • Dòng > ngưỡng X trong 5s → cảnh báo quá tải
  • Công suất tăng đột ngột → phát hiện thiết bị bất thường

9) So sánh nhanh

Cảm biếnAC / DCGiao tiếpĐộ chính xácUse case
PZEM-004TACUARTCaoĐiện lưới
INA226DCI2CRất caoDC, pin
ACS712DCAnalogTrung bìnhDIY đơn giản

👉 INA226 là lựa chọn tốt nhất cho DC IoT chuyên nghiệp

10) Gợi ý mở rộng

  • Lưu energy DC (Wh) theo thời gian
  • Kết hợp sleep ESP32 để đo tiêu thụ pin
  • So sánh nhiều nguồn DC (solar + battery)
  • Kết hợp relay để ngắt tải khi quá dòng