📊 ภาพรวมโปรเจกต์
ในบทความนี้คุณจะได้เรียนรู้วิธีสร้าง 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 ที่จำเป็น:
- ไปที่ Sketch → Include Library → Manage Libraries
- ค้นหาและติดตั้ง EmonLib (โดย OpenEnergyMonitor)
- ติดตั้ง 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
ขั้นตอนการตั้งค่า
- ติดตั้ง MQTT Broker: ใน Home Assistant ไปที่ Settings → Add-ons → Add-on Store แล้วติดตั้ง "Mosquitto Broker"
- สร้าง User: ใน Mosquitto Broker settings สร้าง username และ password สำหรับ ESP32
- อัปโหลดโค้ด: อัปโหลดโค้ด ESP32 ผ่าน Arduino IDE
- ตรวจสอบ Discovery: เปิด Serial Monitor แล้วดูว่า ESP32 เชื่อมต่อ MQTT สำเร็จหรือไม่
- ตรวจสอบ Home Assistant: ไปที่ Settings → Devices & Services และดูว่า Sensor ใหม่ปรากฏขึ้นหรือไม่
การแสดงผลใน Dashboard
สร้าง Energy Dashboard ใน Home Assistant:
- ไปที่ Settings → Dashboard → Energy
- เพิ่ม Sensor ที่เกี่ยวข้อง:
- Grid Consumption: sensor.esp32_energy_meter_energy
- บันทึกและดูผลลัพธ์ใน Energy Dashboard
✅ เคล็ดลับ: คุณสามารถสร้าง Automation ใน Home Assistant เพื่อแจ้งเตือนเมื่อใช้พลังงานเกินกำหนด เช่น "เปิดเครื่องปรับอากาศเกิน 3 ชั่วโมง" หรือ "ใช้ไฟเกิน 5kWh ต่อวัน"
🌐 เชื่อมต่อ CynoIoT Platform
CynoIoT Platform เป็นแพลตฟอร์ม Cloud ที่ช่วยให้คุณบันทึกและแสดงผลข้อมูล IoT ได้ง่ายๆ โดยไม่ต้องดูแล Server เอง
ขั้นตอนการตั้งค่า
- สมัคร Account: ไปที่
https://cynoiot.comแล้วสมัครสมาชิก - สร้าง Device: ใน Dashboard สร้าง Device ใหม่สำหรับ Energy Meter
- รับ API Key: คัดลอก API Key และ Device ID
- อัปเดตโค้ด: ใส่ API Key และ Device ID ลงในโค้ด ESP32
- ตรวจสอบ: ดูข้อมูลใน CynoIoT Dashboard ว่ามีข้อมูลเข้ามาหรือไม่
- เข้าถึงข้อมูลได้จากทุกที่ผ่าน 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 ที่ครบถ้วน