บทความ: วิธีวัดแรงดัน กระแส และกำลังไฟฟ้าด้วย INA219 และ ESP32

เรียนรู้วิธีการใช้งานเซ็นเซอร์ INA219 กับ ESP32 เพื่อวัดแรงดัน กระแส และกำลังไฟฟ้าอย่างแม่นยำ เหมาะสำหรับโปรเจกต์ IoT ที่ต้องการตรวจสอบการใช้พลังงาน ทั้งแบตเตอรี่และไฟเลี้ยงหลัก

📅 16 มีนาคม 2026⏱️ 15 นาที🎯 ระดับกลาง

ภาพรวม 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 PinESP32 Pinหมายเหตุ
VCC3.3Vไฟเลี้ยง 3.3V
GNDGNDกราวด์
SCLGPIO 22I2C Clock
SDAGPIO 21I2C Data
Load Connection
V+ต่อเข้ากับแหล่งจ่ายไฟ (0-26V)
V-ต่อเข้ากับโหลด (Load +)

⚠️ ข้อควรระวัง

  • ตรวจสอบแรงดันอินพุตให้แน่ใจว่าอยู่ในช่วง 0-26V
  • ไม่ควรวัดกระแสเกิน 3.2A ต่อเนื่อง (อาจทำให้เซ็นเซอร์ร้อนเกินไป)
  • ขดลวดความต้านทานต่ำในตัวเซ็นเซอร์มีความต้านทาน ~0.1Ω
  • ต่อขั้ว + และ - ให้ถูกต้อง มิฉะนั้นจะวัดค่าได้ไม่ถูกต้อง

ติดตั้ง Library

เปิด Arduino IDE และทำตามขั้นตอนดังนี้:

  1. ไปที่ Sketch → Include Library → Manage Libraries
  2. ค้นหา "INA219"
  3. เลือกติดตั้ง "Adafruit INA219" by Adafruit
  4. รอให้ติดตั้งเสร็จสิ้น

โค้ดตัวอย่าง (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);
}

✅ หลังจากอัปโหลดโค้ด

  1. เปิด Serial Monitor (Ctrl+Shift+M)
  2. ตั้งค่า Baud rate เป็น 115200
  3. คุณจะเห็นค่าที่วัดได้แสดงทุกๆ 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

  1. สมัครสมาชิก CynoIoT ฟรีที่ cynoiot.com
  2. สร้าง Device ใหม่บน Dashboard
  3. คัดลอก API Key และ Device ID
  4. แทนที่ค่าในโค้ดด้านบน
  5. อัปโหลดโค้ดไปยัง 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