บทความ: สร้าง Energy Meter วัดกระแสไฟด้วย ESP32 และ SCT013 CT Clamp เชื่อมต่อ Home Assistant

เรียนรู้วิธีสร้างระบบวัดกระแสไฟฟ้าและพลังงานด้วย ESP32 และ SCT013 CT Clamp แบบ Non-invasive เชื่อมต่อกับ Home Assistant และ CynoIoT Platform เพื่อตรวจสอบการใช้พลังงานแบบ Real-time พร้อมโค้ดตัวอย่างและคำอธิบายภาษาไทย

📅 10 เมษายน 2026⏱️ 20 นาที🎯 ระดับกลาง⚡ Energy Monitoring

📊 ภาพรวมโปรเจกต์

ในบทความนี้คุณจะได้เรียนรู้วิธีสร้าง DIY Energy Meter ที่สามารถวัดกระแสไฟฟ้า AC (0-100A) และคำนวณพลังงาน (Watt) และพลังงานสะสม (kWh) แบบ Real-time โดยใช้:

  • ESP32 - ไมโครคอนโทรลเลอร์ WiFi/BLE ที่ทรงพลัง
  • SCT013 CT Clamp - เซ็นเซอร์วัดกระแสไฟฟ้าแบบ Non-invasive (ไม่ต้องตัดสาย)
  • Burden Resistor - ตัวต้านทานแปลงกระแสเป็นแรงดัน
  • Home Assistant - แพลตฟอร์ม Smart Home สำหรับรวบรวมข้อมูล
  • CynoIoT Platform - แพลตฟอร์ม Cloud สำหรับบันทึกและแสดงผลข้อมูล IoT

⚠️ คำเตือนความปลอดภัย: โปรเจกต์นี้เกี่ยวข้องกับไฟฟ้า AC 220V/110V ซึ่งเป็นอันตรายถึงชีวิต หากคุณไม่มีประสบการณ์ทำงานกับไฟฟ้า แนะนำให้ขอความช่วยเหลือจากช่างไฟฟ้ามืออาชีพ หรือใช้ CT Clamp ที่มีฉนวนป้องกันครบถ้วน

🔧 อุปกรณ์ที่ต้องใช้

อุปกรณ์ รายละเอียด ราคาโดยประมาณ
ESP32 DevKit บอร์ดพัฒนา ESP32 (WROOM/WROVER) ฿150-300
SCT013-000 100A CT Clamp 100A:50mA (ไม่มี Burden Resistor ในตัว) ฿150-250
Burden Resistor 33Ω ตัวต้านทาน 33Ω 2W (หรือ 39Ω ตามการคำนวณ) ฿5-10
Capacitor 10µF คาปาซิเตอร์ 10µF สำหรับกรองสัญญาณ ฿5
Jumper Wires สายไฟเชื่อมต่อ Male-to-Female ฿30-50
USB Cable สาย USB Micro สำหรับอัปโหลดโค้ดและจ่ายไฟ ฿30-50
Home Assistant Server Raspberry Pi, PC, หรือ VPS ที่รัน Home Assistant -

รวมค่าใช้จ่าย: ประมาณ ฿370-665 (ไม่รวม Home Assistant Server)

🔍 SCT013 CT Clamp คืออะไร

SCT013 คือ Current Transformer (CT) หรือหม้อแปลงกระแสไฟฟ้า ที่ใช้วัดกระแสไฟ AC แบบ Non-invasive โดยคลิปติดกับสายไฟฟ้าโดยไม่ต้องตัดสาย

หลักการทำงาน

  • Electromagnetic Induction: เมื่อกระแสไฟ AC ไหลผ่านสายตัวนำ (เช่น สายไฟบ้าน) จะเกิดสนามแม่เหล็กรอบๆ สายนั้น
  • CT Clamp: SCT013 ครอบสายไฟเหล่านั้น สนามแม่เหล็กจะเหนี่ยวนำให้เกิดกระแสไฟฟ้าในขดลวดคอยล์ด้านใน CT
  • Output: SCT013-000 แปลงกระแส 100A เป็น 50mA (อัตราส่วน 2000:1)

รุ่นที่แนะนำ

SCT013-000 (100A:50mA)

  • ไม่มี Burden Resistor ในตัว - ให้ความยืดหยุ่นในการออกแบบวงจร
  • เหมาะสำหรับโปรเจกต์ DIY ที่ใช้ ESP32/Arduino
  • ความแม่นยำ: Class 1.0 (±1%)

💡 เกร็ดความรู้: SCT013-000 ไม่มี Burden Resistor ในตัว เราจึงต้องต่อ Burden Resistor เองเพื่อแปลงกระแส (50mA) เป็นแรงดัน (Voltage) ที่ ESP32 สามารถอ่านได้ผ่าน ADC (0-3.3V)

⚡ การต่อวงจร

สูตรการคำนวณ Burden Resistor

สูตร: R = V_out / I_secondary

ตัวอย่าง:

  • I_secondary = 50mA = 0.05A (จาก SCT013-000)
  • V_out = 3.3V (เพื่อใช้กับ ESP32 ADC สูงสุด)
  • R = 3.3V / 0.05A = 66Ω

แต่! เพื่อให้ได้ Amplitude เต็มที่ ควรใช้ 33Ω-39Ω (เพราะเราจะใช้วงจรครึ่งคลื่น)

การต่อสาย ESP32 กับ SCT013

SCT013 ESP32
ขั้วบวก (ไม่มีมาร์ก) GPIO 34 (ADC1_CH6) - ผ่าน Burden Resistor 33Ω และ Capacitor
ขั้วลบ (มีมาร์กสี) GND

วงจร Burden Resistor และ Capacitor

  • Burden Resistor (33Ω, 2W): ต่อแบบขนานกับ SCT013 (ระหว่างขั้วบวกและลบของ SCT013)
  • Capacitor (10µF, 6.3V+): ต่อแบบขนานกับ Burden Resistor เพื่อกรองสัญญาณและทำให้เป็น DC offset
  • Voltage Divider: ใช้ R1=100kΩ และ R2=100kΩ เพื่อสร้าง DC bias ที่ 1.65V (ครึ่งแรงดัน 3.3V)
⚠️ ข้อควรระวัง:
  • อย่าให้ SCT013 ทำงานโดยไม่มี Burden Resistor - จะเกิดแรงดันสูงเกินไปและอาจเสียหาย
  • ใช้ Resistor ที่มีกำลังไฟอย่างน้อย 2W (หรือต่อ Resistor 2 ตัว 66Ω 1W แบบอนุกรม)
  • ตรวจสอบวงจรให้ถูกต้องก่อนจ่ายไฟ ESP32

💻 เขียน Firmware ESP32

ติดตั้ง Library

เปิด Arduino IDE แล้วติดตั้ง Library ที่จำเป็น:

  1. ไปที่ Sketch → Include Library → Manage Libraries
  2. ค้นหาและติดตั้ง EmonLib (โดย OpenEnergyMonitor)
  3. ติดตั้ง PubSubClient (สำหรับ MQTT)

โค้ด ESP32 Energy Meter

/*
 * ESP32 Energy Meter ด้วย SCT013 CT Clamp
 * วัดกระแสไฟฟ้า AC และคำนวณพลังงาน (W) และพลังงานสะสม (kWh)
 * เชื่อมต่อกับ Home Assistant ผ่าน MQTT
 *
 * Hardware: ESP32 + SCT013-000 + Burden Resistor 33Ω
 * Author: CynoIoT
 * Date: April 2026
 */

#include <WiFi.h>
#include <PubSubClient.h>
#include <EmonLib.h>

// ===== WiFi Settings =====
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";

// ===== MQTT Settings =====
const char* mqtt_server = "homeassistant.local"; // IP หรือ Hostname ของ Home Assistant
const int mqtt_port = 1883;
const char* mqtt_user = "YOUR_MQTT_USER";
const char* mqtt_password = "YOUR_MQTT_PASSWORD";
const char* mqtt_client_id = "esp32_energy_meter";

// ===== CynoIoT Settings =====
const char* cynoiot_api_key = "YOUR_CYNOIOT_API_KEY";
const char* cynoiot_device_id = "YOUR_DEVICE_ID";

// ===== CT Clamp Settings =====
const int CT_PIN = 34; // GPIO 34 (ADC1_CH6)
const double ICAL = 60.6; // 100A / 50mA * Burden Resistor Factor = 60.6 (สำหรับ 33Ω)
const double VOLTAGE = 230.0; // แรงดันไฟฟ้าบ้าน (V) - ปรับตามพื้นที่

// ===== MQTT Topics =====
const char* mqtt_topic_current = "homeassistant/sensor/esp32_energy_meter/current";
const char* mqtt_topic_power = "homeassistant/sensor/esp32_energy_meter/power";
const char* mqtt_topic_energy = "homeassistant/sensor/esp32_energy_meter/energy";

// ===== Variables =====
EnergyMonitor emon1;
WiFiClient espClient;
PubSubClient mqtt_client(espClient);

unsigned long lastMillis = 0;
const long interval = 5000; // อ่านค่าทุกๆ 5 วินาที

double Irms = 0;
double power = 0;
double energy_kwh = 0;
unsigned long lastEnergyTime = 0;

// ===== WiFi Connect Function =====
void setup_wifi() {
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

// ===== MQTT Reconnect Function =====
void reconnect_mqtt() {
  while (!mqtt_client.connected()) {
    Serial.print("Attempting MQTT connection...");

    if (mqtt_client.connect(mqtt_client_id, mqtt_user, mqtt_password)) {
      Serial.println("connected");

      // MQTT Discovery สำหรับ Home Assistant
      // Current Sensor
      String current_config = "{"
        "\"name\":\"ESP32 Current\","
        "\"stat_t\":\"" + String(mqtt_topic_current) + "\","
        "\"unit_of_meas\":\"A\","
        "\"dev\":{\"ids\":\"esp32_energy_meter\"},"
        "\"uniq_id\":\"esp32_energy_meter_current\""
      "}";
      mqtt_client.publish("homeassistant/sensor/esp32_energy_meter_current/config", current_config.c_str(), true);

      // Power Sensor
      String power_config = "{"
        "\"name\":\"ESP32 Power\","
        "\"stat_t\":\"" + String(mqtt_topic_power) + "\","
        "\"unit_of_meas\":\"W\","
        "\"dev\":{\"ids\":\"esp32_energy_meter\"},"
        "\"uniq_id\":\"esp32_energy_meter_power\""
      "}";
      mqtt_client.publish("homeassistant/sensor/esp32_energy_meter_power/config", power_config.c_str(), true);

      // Energy Sensor
      String energy_config = "{"
        "\"name\":\"ESP32 Energy\","
        "\"stat_t\":\"" + String(mqtt_topic_energy) + "\","
        "\"unit_of_meas\":\"kWh\","
        "\"dev\":{\"ids\":\"esp32_energy_meter\"},"
        "\"uniq_id\":\"esp32_energy_meter_energy\","
        "\"state_class\":\"total_increasing\""
      "}";
      mqtt_client.publish("homeassistant/sensor/esp32_energy_meter_energy/config", energy_config.c_str(), true);

    } else {
      Serial.print("failed, rc=");
      Serial.print(mqtt_client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

// ===== Send Data to CynoIoT =====
void send_to_cynoiot(double current, double pwr, double energy) {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin("https://api.cynoiot.com/v1/devices/" + String(cynoiot_device_id) + "/data");
    http.addHeader("Content-Type", "application/json");
    http.addHeader("Authorization", "Bearer " + String(cynoiot_api_key));

    String payload = "{"
      "\"current\":" + String(current, 2) + ","
      "\"power\":" + String(pwr, 2) + ","
      "\"energy\":" + String(energy, 4) +
    "}";

    int httpResponseCode = http.POST(payload);

    if (httpResponseCode > 0) {
      Serial.print("CynoIoT Response: ");
      Serial.println(httpResponseCode);
    } else {
      Serial.print("CynoIoT Error: ");
      Serial.println(httpResponseCode);
    }

    http.end();
  }
}

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

  // Setup WiFi
  setup_wifi();

  // Setup MQTT
  mqtt_client.setServer(mqtt_server, mqtt_port);

  // Setup Energy Monitor
  emon1.current(CT_PIN, ICAL);

  Serial.println("ESP32 Energy Meter Started!");
  lastEnergyTime = millis();
}

void loop() {
  // MQTT Reconnect
  if (!mqtt_client.connected()) {
    reconnect_mqtt();
  }
  mqtt_client.loop();

  // Read Energy Values ทุกๆ 5 วินาที
  unsigned long currentMillis = millis();
  if (currentMillis - lastMillis >= interval) {
    lastMillis = currentMillis;

    // คำนวณเวลาที่ผ่านไป (ชั่วโมง)
    double hours_passed = (currentMillis - lastEnergyTime) / 3600000.0;

    // อ่านค่ากระแส (A)
    Irms = emon1.calcIrms(1480); // 1480 samples

    // คำนวณกำลังไฟฟ้า (W) = Current (A) × Voltage (V)
    power = Irms * VOLTAGE;

    // คำนวณพลังงานสะสม (kWh) = Power (W) × Time (h) / 1000
    energy_kwh += (power * hours_passed) / 1000.0;

    // แสดงผลใน Serial Monitor
    Serial.print("Current: ");
    Serial.print(Irms, 2);
    Serial.print("A | Power: ");
    Serial.print(power, 1);
    Serial.print("W | Energy: ");
    Serial.print(energy_kwh, 4);
    Serial.println("kWh");

    // ส่งค่าไป MQTT (Home Assistant)
    char current_str[10];
    char power_str[10];
    char energy_str[10];

    dtostrf(Irms, 2, 2, current_str);
    dtostrf(power, 2, 1, power_str);
    dtostrf(energy_kwh, 2, 4, energy_str);

    mqtt_client.publish(mqtt_topic_current, current_str);
    mqtt_client.publish(mqtt_topic_power, power_str);
    mqtt_client.publish(mqtt_topic_energy, energy_str);

    // ส่งค่าไป CynoIoT
    send_to_cynoiot(Irms, power, energy_kwh);
  }
}
💡 หมายเหตุ:
  • แก้ไข ssid, password, mqtt_server, mqtt_user, mqtt_password
  • สมัคร CynoIoT Account และรับ API Key และ Device ID จาก Dashboard
  • ปรับ VOLTAGE (230V หรือ 110V) ตามพื้นที่ของคุณ
  • ปรับ ICAL หากใช้ Burden Resistor ค่าอื่น

🏠 เชื่อมต่อ Home Assistant

ขั้นตอนการตั้งค่า

  1. ติดตั้ง MQTT Broker: ใน Home Assistant ไปที่ Settings → Add-ons → Add-on Store แล้วติดตั้ง "Mosquitto Broker"
  2. สร้าง User: ใน Mosquitto Broker settings สร้าง username และ password สำหรับ ESP32
  3. อัปโหลดโค้ด: อัปโหลดโค้ด ESP32 ผ่าน Arduino IDE
  4. ตรวจสอบ Discovery: เปิด Serial Monitor แล้วดูว่า ESP32 เชื่อมต่อ MQTT สำเร็จหรือไม่
  5. ตรวจสอบ Home Assistant: ไปที่ Settings → Devices & Services และดูว่า Sensor ใหม่ปรากฏขึ้นหรือไม่

การแสดงผลใน Dashboard

สร้าง Energy Dashboard ใน Home Assistant:

  1. ไปที่ Settings → Dashboard → Energy
  2. เพิ่ม Sensor ที่เกี่ยวข้อง:
    • Grid Consumption: sensor.esp32_energy_meter_energy
  3. บันทึกและดูผลลัพธ์ใน Energy Dashboard

✅ เคล็ดลับ: คุณสามารถสร้าง Automation ใน Home Assistant เพื่อแจ้งเตือนเมื่อใช้พลังงานเกินกำหนด เช่น "เปิดเครื่องปรับอากาศเกิน 3 ชั่วโมง" หรือ "ใช้ไฟเกิน 5kWh ต่อวัน"

🌐 เชื่อมต่อ CynoIoT Platform

CynoIoT Platform เป็นแพลตฟอร์ม Cloud ที่ช่วยให้คุณบันทึกและแสดงผลข้อมูล IoT ได้ง่ายๆ โดยไม่ต้องดูแล Server เอง

ขั้นตอนการตั้งค่า

  1. สมัคร Account: ไปที่ https://cynoiot.com แล้วสมัครสมาชิก
  2. สร้าง Device: ใน Dashboard สร้าง Device ใหม่สำหรับ Energy Meter
  3. รับ API Key: คัดลอก API Key และ Device ID
  4. อัปเดตโค้ด: ใส่ API Key และ Device ID ลงในโค้ด ESP32
  5. ตรวจสอบ: ดูข้อมูลใน CynoIoT Dashboard ว่ามีข้อมูลเข้ามาหรือไม่
🌟 ประโยชน์ของ CynoIoT:
  • เข้าถึงข้อมูลได้จากทุกที่ผ่าน Web Browser หรือ Mobile App
  • บันทึกข้อมูลแบบ Historical Data สำหรับวิเคราะห์
  • ตั้งค่า Alert เมื่อพลังงานผิดปกติ
  • รองรับ Multi-device สำหรับโปรเจกต์ที่ซับซ้อน

🔧 การแก้ปัญหาที่พบบ่อย

1. อ่านค่ากระแสได้ 0A หรือค่าผิดปกติ

  • ตรวจสอบว่า SCT013 ครอบสายไฟฟ้าที่มีกระแสไหลผ่านจริง (เช่น สายไฟหลอดไฟที่เปิดอยู่)
  • ตรวจสอบวงจร Burden Resistor และ Capacitor ว่าต่อถูกต้อง
  • ปรับ ICAL ในโค้ดตามค่า Burden Resistor ที่ใช้
  • ลองปรับ emon1.current(CT_PIN, ICAL) เป็นค่าอื่นๆ เช่น 60.6, 90.9, 111.1

2. MQTT เชื่อมต่อไม่ได้

  • ตรวจสอบ IP Address หรือ Hostname ของ Home Assistant
  • ตรวจสอบ Username และ Password ของ MQTT
  • ตรวจสอบว่า Mosquitto Broker ทำงานอยู่ใน Home Assistant
  • ลอง Ping จาก ESP32 ไปยัง Home Assistant

3. CynoIoT ไม่ได้รับข้อมูล

  • ตรวจสอบ API Key และ Device ID ว่าถูกต้อง
  • ตรวจสอบ Serial Monitor ว่า HTTP Request สำเร็จหรือไม่
  • ตรวจสอบว่า ESP32 เชื่อมต่อ Internet อยู่
  • ตรวจสอบ CynoIoT Dashboard ว่า Device อยู่ในสถานะ Active

4. ค่าพลังงานสะสม (kWh) ผิดปกติ

  • ตรวจสอบแรงดันไฟฟ้า (VOLTAGE) ว่าถูกต้อง (230V หรือ 110V)
  • ตรวจสอบหน่วงเวลา (interval) - ถ้านานเกินไป ค่าอาจไม่แม่นยำ
  • รีเซ็ตค่า energy_kwh โดยปลั๊กไฟ ESP32 แล้วเสียบใหม่
  • ใช้ Power Meter จริงเปรียบเทียบเพื่อสอบเทียบค่า

🚀 ขั้นตอนถัดไป

เมื่อคุณสร้าง Energy Meter เบื้องต้นเสร็จแล้ว สามารถพัฒนาต่อยอดได้:

  • Multi-channel: ใช้ SCT013 หลายตัวเพื่อวัดกระแสไฟหลายจุด (เช่น หลอดไฟ, เครื่องปรับอากาศ, ปั๊มน้ำ)
  • 3-Phase Meter: ใช้ SCT013 3 ตัวเพื่อวัดไฟ 3 เฟส
  • SD Card Logging: บันทึกข้อมูลลง SD Card สำหรับ Backup
  • OLED Display: เพิ่มจอแสดงผลเพื่อดูค่าแบบ Real-time
  • Battery Powered: ใช้ Deep Sleep Mode สำหรับติดตั้งที่ไม่มีไฟ
  • Solar Panel Integration: ติดตามการผลิตพลังงานจาก Solar Cell

📝 สรุป

ในบทความนี้คุณได้เรียนรู้วิธีสร้าง DIY Energy Meter ด้วย ESP32 และ SCT013 CT Clamp ที่สามารถ:

  • วัดกระแสไฟฟ้า AC 0-100A แบบ Non-invasive
  • คำนวณกำลังไฟฟ้า (Watt) และพลังงานสะสม (kWh)
  • ส่งข้อมูลไป Home Assistant ผ่าน MQTT
  • ส่งข้อมูลไป CynoIoT Platform สำหรับ Cloud Monitoring
  • ติดตามการใช้พลังงานแบบ Real-time

โปรเจกต์นี้เหมาะสำหรับผู้ที่ต้องการประหยัดค่าไฟ ติดตามการใช้พลังงาน หรือสร้าง Smart Home System ที่ครบถ้วน

© 2026 CynoIoT. All rights reserved.