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.
| INA226 | ESP32 |
|---|---|
| VCC | 3V3 (hoặc 5V) |
| GND | GND |
| SDA | GPIO21 |
| SCL | GPIO22 |
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
- Dòng điện:
- 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ến | AC / DC | Giao tiếp | Độ chính xác | Use case |
|---|---|---|---|---|
| PZEM-004T | AC | UART | Cao | Điện lưới |
| INA226 | DC | I2C | Rất cao | DC, pin |
| ACS712 | DC | Analog | Trung bình | DIY đơ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


