เนื้อหาในบทความ
ภาพรวม INA219
INA219 เป็นเซ็นเซอร์วัดแรงดันและกระแสไฟฟ้าแบบดิจิตอลที่เชื่อมต่อผ่านบัส I2C สามารถวัดแรงดันได้ถึง 26V และกระแสสูงสุด ±3.2A โดยอาศัยเทคนิควัดกระแสแบบ Hall Effect ทำให้ไม่ต้องตัดวงจรเพื่อใส่ตัวต้านทานวัดกระแสแบบเดิมๆ
✨ จุดเด่นของ INA219
- วัดแรงดัน 0-26V DC และกระแส ±3.2A
- สื่อสารผ่าน I2C ใช้ขาเพียง 2 ขา
- แสดงผลเป็นตัวเลขดิจิตอล ไม่ต้องใช้ ADC
- มีการคำนวณกำลังไฟฟ้า (Watts) ให้อัตโนมัติ
- ราคาถูก ใช้งานง่าย
อุปกรณ์ที่ต้องใช้
Hardware
- ✓ESP32 Development Board - ฿150-250
- ✓INA219 Sensor Module - ฿80-150
- ✓Jumper Wires (Female-to-Male)
- ✓Breadboard (ไม่บังคับ)
- ✓USB Cable สำหรับ ESP32
Software
- ✓Arduino IDE หรือ PlatformIO
- ✓Adafruit INA219 Library
- ✓Wire.h (Built-in)
- ✓CynoIoT Account (ฟรี)
💡 เคล็ดลับ: INA219 มีขา I2C Address ที่ปรับแต่งได้ สามารถต่อ INA219 หลายตัวบนบัส I2C เดียวกันได้สูงสุด 4 ตัว
การต่อสาย (Wiring Diagram)
ต่อสายตามตารางด้านล่าง:
| INA219 Pin | ESP32 Pin | หมายเหตุ |
|---|---|---|
| VCC | 3.3V | ไฟเลี้ยง 3.3V |
| GND | GND | กราวด์ |
| SCL | GPIO 22 | I2C Clock |
| SDA | GPIO 21 | I2C Data |
| Load Connection | ||
| V+ | ต่อเข้ากับแหล่งจ่ายไฟ (0-26V) | |
| V- | ต่อเข้ากับโหลด (Load +) | |
⚠️ ข้อควรระวัง
- ตรวจสอบแรงดันอินพุตให้แน่ใจว่าอยู่ในช่วง 0-26V
- ไม่ควรวัดกระแสเกิน 3.2A ต่อเนื่อง (อาจทำให้เซ็นเซอร์ร้อนเกินไป)
- ขดลวดความต้านทานต่ำในตัวเซ็นเซอร์มีความต้านทาน ~0.1Ω
- ต่อขั้ว + และ - ให้ถูกต้อง มิฉะนั้นจะวัดค่าได้ไม่ถูกต้อง
ติดตั้ง Library
เปิด Arduino IDE และทำตามขั้นตอนดังนี้:
- ไปที่ Sketch → Include Library → Manage Libraries
- ค้นหา "INA219"
- เลือกติดตั้ง "Adafruit INA219" by Adafruit
- รอให้ติดตั้งเสร็จสิ้น
Library URL: https://github.com/adafruit/Adafruit_INA219
โค้ดตัวอย่าง (Arduino Code)
โค้ดนี้จะแสดงค่าแรงดัน กระแส และกำลังไฟฟ้าบน Serial Monitor ทุกๆ 2 วินาที
#include <Wire.h>
#include <Adafruit_INA219.h>
// สร้างออบเจ็กต์ INA219
Adafruit_INA219 ina219;
// ตัวแปรสำหรับเก็บค่าที่วัดได้
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float loadvoltage = 0;
float power_mW = 0;
void setup(void)
{
Serial.begin(115200);
// รอให้ Serial เชื่อมต่อ
while (!Serial) {
delay(10);
}
Serial.println("ESP32 INA219 Power Monitor");
Serial.println("=================================");
// เริ่มต้นใช้งาน INA219
// หากไม่สำเร็จ แสดงข้อความและหยุดทำงาน
if (! ina219.begin()) {
Serial.println("ไม่พบเซ็นเซอร์ INA219");
Serial.println("กรุณาตรวจสอบการต่อสาย");
while (1) delay(10);
}
// ตั้งค่าให้วัดกระแสได้สูงสุด 32V และ 2A (สำหรับโหลดที่ต้องการกระแสต่ำกว่า 2A)
// หากต้องการวัดกระแสสูงกว่า ให้เปลี่ยนเป็น:
// ina219.setCalibration_32V_3A2(); // สำหรับกระแสถึง 3.2A
ina219.setCalibration_32V_2A();
Serial.println("INA219 เริ่มทำงานแล้ว!");
Serial.println("");
}
void loop(void)
{
// อ่านค่าแรงดัน Shunt (แรงดันข้ามตัวต้านทานวัดกระแส)
shuntvoltage = ina219.getShuntVoltage_mV();
// อ่านค่าแรงดัน Bus (แรงดันของแหล่งจ่าย)
busvoltage = ina219.getBusVoltage_V();
// อ่านค่ากระแส (หน่วย mA)
current_mA = ina219.getCurrent_mA();
// อ่านค่ากำลังไฟฟ้า (หน่วย mW)
power_mW = ina219.getPower_mW();
// คำนวณแรงดันของโหลด (แรงดัน Bus - แรงดัน Shunt)
loadvoltage = busvoltage + (shuntvoltage / 1000);
// แสดงผลบน Serial Monitor
Serial.println("------------------------------");
Serial.print("Bus Voltage: ");
Serial.print(busvoltage);
Serial.println(" V");
Serial.print("Shunt Voltage: ");
Serial.print(shuntvoltage);
Serial.println(" mV");
Serial.print("Load Voltage: ");
Serial.print(loadvoltage);
Serial.println(" V");
Serial.print("Current: ");
Serial.print(current_mA);
Serial.println(" mA");
Serial.print("Power: ");
Serial.print(power_mW);
Serial.println(" mW");
Serial.println("------------------------------");
// รอ 2 วินาทีก่อนอ่านค่าใหม่
delay(2000);
}✅ หลังจากอัปโหลดโค้ด
- เปิด Serial Monitor (Ctrl+Shift+M)
- ตั้งค่า Baud rate เป็น 115200
- คุณจะเห็นค่าที่วัดได้แสดงทุกๆ 2 วินาที
เชื่อมต่อกับ CynoIoT Platform
หลังจากที่สามารถวัดค่าแรงดันและกระแสได้แล้ว เราสามารถส่งข้อมูลไปยัง CynoIoT Platform เพื่อตรวจสอบระยะไกล
#include <Wire.h>
#include <Adafruit_INA219.h>
#include <WiFi.h>
#include <HTTPClient.h>
// CynoIoT Configuration
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const char* cynoApiKey = "YOUR_CYNOIOT_API_KEY";
const char* deviceId = "YOUR_DEVICE_ID";
// CynoIoT API Endpoint
const char* cynoServer = "https://api.cynoiot.com/v1/data";
Adafruit_INA219 ina219;
unsigned long lastSendTime = 0;
const long sendInterval = 10000; // ส่งข้อมูลทุก 10 วินาที
void setup() {
Serial.begin(115200);
// เชื่อมต่อ WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi เชื่อมต่อแล้ว!");
// เริ่มต้นใช้งาน INA219
if (!ina219.begin()) {
Serial.println("ไม่พบเซ็นเซอร์ INA219");
while (1) delay(10);
}
ina219.setCalibration_32V_2A();
Serial.println("เริ่มต้นทำงานแล้ว!");
}
void loop() {
// อ่านค่าจาก INA219
float busvoltage = ina219.getBusVoltage_V();
float current_mA = ina219.getCurrent_mA();
float power_mW = ina219.getPower_mW();
// แสดงผลบน Serial Monitor
Serial.print("Voltage: ");
Serial.print(busvoltage);
Serial.print("V | Current: ");
Serial.print(current_mA);
Serial.print("mA | Power: ");
Serial.print(power_mW);
Serial.println("mW");
// ส่งข้อมูลไป CynoIoT ทุกๆ 10 วินาที
unsigned long currentTime = millis();
if (currentTime - lastSendTime >= sendInterval) {
sendDataToCynoIoT(busvoltage, current_mA, power_mW);
lastSendTime = currentTime;
}
delay(1000);
}
void sendDataToCynoIoT(float voltage, float current, float power) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(cynoServer);
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", cynoApiKey);
// สร้าง JSON payload
String payload = "{";
payload += "\"device_id\":\"" + String(deviceId) + "\",";
payload += "\"data\":{";
payload += "\"voltage\":" + String(voltage) + ",";
payload += "\"current\":" + String(current) + ",";
payload += "\"power\":" + String(power);
payload += "}}";
// ส่ง HTTP POST request
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
} else {
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end();
} else {
Serial.println("WiFi ไม่ได้เชื่อมต่อ");
}
}🔗 ขั้นตอนเชื่อมต่อ CynoIoT
- สมัครสมาชิก CynoIoT ฟรีที่ cynoiot.com
- สร้าง Device ใหม่บน Dashboard
- คัดลอก API Key และ Device ID
- แทนที่ค่าในโค้ดด้านบน
- อัปโหลดโค้ดไปยัง ESP32
การแก้ปัญหา (Troubleshooting)
ปัญหา: INA219 ไม่พบเซ็นเซอร์
สาเหตุ: การต่อสาย I2C ไม่ถูกต้อง
วิธีแก้ไข:
- ตรวจสอบว่าต่อ SCL → GPIO 22 และ SDA → GPIO 21
- ตรวจสอบว่าต่อ VCC และ GND ถูกต้อง
- ลองใช้ I2C Scanner เพื่อตรวจสอบที่อยู่ของเซ็นเซอร์
ปัญหา: ค่ากระแสที่วัดได้ไม่ถูกต้อง
สาเหตุ: Calibration ไม่ตรงกับช่วงกระแสที่ใช้งาน
วิธีแก้ไข:
- ถ้ากระแสต่ำกว่า 2A ใช้ setCalibration_32V_2A()
- ถ้ากระแสสูงกว่า 2A ใช้ setCalibration_32V_3A2()
- สามารถคำนวณค่า calibration เองได้จาก datasheet
ปัญหา: ค่าแรงดันวัดได้ 0V
สาเหตุ: ไม่ได้ต่อโหลดหรือแหล่งจ่าย
วิธีแก้ไข:
- ตรวจสอบว่าต่อ V+ และ V- ถูกต้อง
- ต้องมีแหล่งจ่ายไฟเชื่อมต่ออยู่จริง
- ต้องมีโหลดต่ออยู่จึงจะวัดกระแสได้
สรุป
ในบทความนี้ เราได้เรียนรู้วิธีการใช้งานเซ็นเซอร์ INA219 กับ ESP32 เพื่อวัดแรงดัน กระแส และกำลังไฟฟ้า ซึ่งเป็นทักษะที่มีประโยชน์อย่างมากสำหรับโปรเจกต์ IoT ที่ต้องการตรวจสอบการใช้พลังงาน
สิ่งที่คุณได้เรียนรู้:
- ✓การต่อสาย INA219 กับ ESP32 ผ่าน I2C
- ✓การติดตั้งและใช้งาน Adafruit INA219 Library
- ✓การอ่านค่าแรงดัน กระแส และกำลังไฟฟ้า
- ✓การส่งข้อมูลไปยัง CynoIoT Platform