โปรเจกต์ Digital AC Clamp และ meter [prototype]
Digital Energy Counter ที่สามารถ trigger events ตาม energy consumption หรือ energy bill threshold
Digital Energy Counter ที่สามารถ trigger events ตาม energy consumption หรือ energy bill threshold
กระแสไฟฟ้าแบบ Sinusoidal ภายในสายไฟฟ้าจะทำให้เกิดสนามแม่เหล็กไฟฟ้าที่เปลี่ยนแปลงและเป็นแบบ sinusoidal เช่นกัน ด้วยคุณสมบัติทางกายภาพของการเหนี่ยวนำทางไฟฟ้า Sensor รุ่น sct013 (ขดลวดทองแดงและ Resistor ต่อขนานกัน) จะสร้างแรงดันไฟฟ้าเป็น Output ซึ่งสัมพันธ์กับการผันผวนของสนามแม่เหล็กไฟฟ้ารอบสายไฟที่พาดผ่านตัวแคลมป์ของ sct013 เนื่องจาก Board Arduino มีความสามารถในการจัดการกับ Analog Input ที่เป็นค่าบวกเท่านั้น จึงมีการใช้ชุดวงจร Voltage Divider เพื่อยกระดับสัญญาณ sinusoidal ของอุปกรณ์ sct013 ขึ้นมา
จากนั้น Software จะพยายามจับ Analog Sample ของข้อมูลให้ครบหนึ่งคาบพอดี (Period) ตามการตั้งค่า Frequency ของผู้ใช้ หลังจากนั้นจะคำนวณค่า Min และ Max ตลอดช่วงคาบเวลา รวมถึงค่า Effective Value ของ Output จาก sct013 แล้วจึงแปลงเป็นค่ากระแสไฟฟ้า (อัตราส่วนการแปลงจะขึ้นอยู่กับรุ่นของ sct013)
ส่วนสุดท้ายคือการคำนวณพลังงาน (kWh) และการกำหนดจุด Trigger ปริมาณพลังงานที่ใช้ (Wh) หรือจำนวนเงินที่จ่ายไป (€) เพื่อให้เกิดการทำงานบางอย่าง: โดยเครื่องต้นแบบจะแสดงผลด้วยการกะพริบของ Blue LED
กระบวนการ Autocalibration ที่ผู้ใช้งานสามารถเริ่มทำงานเมื่อไหร่ก็ได้ (Yellow LED)
การ Monitor ชุด SCT013 Vcc divider
ช่วง Frequency: 0-300Hz (ทดสอบอย่างจริงจังเฉพาะที่ 50Hz เท่านั้น) โดยที่ 50Hz ตัว Hardware สามารถวิเคราะห์ได้ 45 คาบ จากทั้งหมด 50 คาบในหนึ่งวินาที
การบันทึก Analog Sample ในหนึ่งคาบ (1/freq) พร้อม Timestamp ความละเอียดระดับ Microsecond (ความสามารถระดับ Oscilloscope)
ตรวจจับพลังงานในสายไฟ (Red LED)
นับปริมาณพลังงานตามที่ผู้ใช้กำหนด (หน่วย Wh) หรือจำนวนเงินในบิล (Blue LED)
การออกแบบทางอิเล็กทรอนิกส์นั้น "เรียบง่าย" และตรงไปตรงมามาก
มีการวิจัยเล็กน้อยเกี่ยวกับค่า Resistor ในชุด Tension Divider เพื่อให้มีการกินไฟต่ำที่สุดเท่าที่จะเป็นไปได้ และรักษาความเสถียรของสัญญาณ Output ที่ต้องการ จากที่ผมดู ค่า Resistor ของชุด Tension Divider ควรจะเป็น 3 เท่าของค่า Resistor ในตัวอุปกรณ์ sct013 เพื่อให้ตอบโจทย์ความต้องการของผม
Code นี้ใช้ Object Classes ที่สร้างขึ้นเอง 4 คลาส:
// time operations
class timer {
public:
timer(bool _micro=false);
void reset(void);
float duration(convert _c=none);
String report(convert _c=none, int _digits=0);
};
// analog sample record and processing
class analogSample {
public:
analogSample(int _freq, int _divider_pin, int _device_pin);
void readDividerValue(void);
void resetSample(void);
void readSample(void);
void processSample(int _log_level);
double getUEff(void);
void report(void);
};
// sct013 device object with calibration
class sct013 {
public:
int devicePin;
int deviceModel;
bool calibrated;
sct013(int _vcc_divider_pin, int _device_pin, int _device_model);
void calibrate(int _length, int _freq, int _log_level=0);
double probe(int _freq, int _log_level=0, bool _calibrate=false);
};
// energy accounting (and billing) and trigger settings
class EnergyMonitor {
EnergyMonitor(int _voltage, int _freq);
double getPower(sct013 _device, int _log_level=0);
double getPowerCount(int _log_level=0);
double getBudget(float _kWh_cost=0.1740);
void setupLeds(int _cLed, int _pLed, int _wLed, int _wStep);
void updateLeds(sct013 _device);
};
การตั้งค่าของผู้ใช้สามารถเปลี่ยนได้ก่อนฟังก์ชัน setup():
static int POWER_FREQ=50; // setup your electrical network frequency
static int POWER_VOLTAGE=220; // setup your electrical network voltage for power accounting
static float POWER_ACCOUNTING=1; // setup power accounting in Wh in order wLed to report
static int SCT013_CALIB_TIMEOUT=10000; // setup timeout for sct013 devices to calibrate
หลังจากนั้น คุณอาจจำเป็นต้องอ่าน Code เพิ่มเติมเพื่อตั้งค่าการคำนวณ, การแปลงค่าเงิน และระดับ Threshold สำหรับ Trigger เหตุการณ์ต่างๆ เพื่อให้ Blue LED กะพริบ หรือสั่งงานอุปกรณ์ภายนอกอื่นๆ ที่เชื่อมต่อกับ Board Arduino
เครื่องต้นแบบยังสร้าง Logs ส่งไปยัง Serial Console โดยมี Logs ทั้งหมด 4 ระดับ (ตั้งแต่ 0 ถึง 3) คุณสามารถระบุและเปลี่ยน Log Level ได้ง่ายๆ โดยหา Variable ที่กำหนดไว้สำหรับการใช้งานนี้ใน Code:
static int LOG_LEVEL0=0; // setup log level from 0 (no logs) to 3 (all required data)
static int LOG_LEVEL1=1;
static int LOG_LEVEL2=2;
static int LOG_LEVEL3=3;
Log SamplePower Accounting and Triggering Engine v0.1 [08/11/2022 - freddy@linuxtribe.fr]
sct013::probe() WARNING device not calibrated()
sct013::probe() WARNING device not calibrated()
sct013::probe() WARNING device not calibrated()
sct013::probe() WARNING device not calibrated()
sct013::probe() WARNING device not calibrated()
sct013::probe() WARNING device not calibrated()
sct013::calibrate() calibration started, make sure the line is off
sct013 1V/10A (pin A5) [VCC divider: 2501.30mV (625.00pts) 50Hz:145.00pts] (25666.50-25659.18mV c=3.66mV) Amp 7.32mV UEff: 2.59mV [43 sample/sec] I=51.79mA
sct013 1V/10A (pin A5) [VCC divider: 2501.22mV (625.00pts) 50Hz:145.00pts] (25666.50-25659.18mV c=3.66mV) Amp 7.32mV UEff: 2.59mV [43 sample/sec] I=51.79mA
sct013 1V/10A (pin A5) [VCC divider: 2501.22mV (625.00pts) 50Hz:145.00pts] (25666.50-25661.62mV c=2.44mV) Amp 4.88mV UEff: 1.73mV [43 sample/sec] I=34.53mA
sct013 1V/10A (pin A5) [VCC divider: 2501.47mV (625.00pts) 50Hz:145.00pts] (25666.50-25659.18mV c=3.66mV) Amp 7.32mV UEff: 2.59mV [43 sample/sec] I=51.79mA
sct013 1V/10A (pin A5) [VCC divider: 2501.13mV (625.00pts) 50Hz:145.00pts] (25666.50-25659.18mV c=3.66mV) Amp 7.32mV UEff: 2.59mV [43 sample/sec] I=51.79mA
sct013 1V/10A (pin A5) [VCC divider: 2501.07mV (625.00pts) 50Hz:145.00pts] (25666.50-25659.18mV c=3.66mV) Amp 7.32mV UEff: 2.59mV [43 sample/sec] I=51.79mA
sct013 1V/10A (pin A5) [VCC divider: 2501.13mV (625.00pts) 50Hz:145.00pts] (25666.50-25659.18mV c=3.66mV) Amp 7.32mV UEff: 2.59mV [43 sample/sec] I=51.79mA
sct013 1V/10A (pin A5) [VCC divider: 2501.13mV (625.00pts) 50Hz:145.00pts] (25666.50-25661.62mV c=2.44mV) Amp 4.88mV UEff: 1.73mV [43 sample/sec] I=34.53mA
sct013 1V/10A (pin A5) [VCC divider: 2501.19mV (625.00pts) 50Hz:145.00pts] (25666.50-25659.18mV c=3.66mV) Amp 7.32mV UEff: 2.59mV [43 sample/sec] I=51.79mA
Calibration data : 47.34mA 8 pts.
Calibration ended : Ieff noise 47.34mA
EnergyCounter : 0.000004kWh (0.00000073€) Last=15.19W [24h a day : Max=0.36kWh avg=0.18kWh]
EnergyCounter : 0.000015kWh (0.00000257€) Last=37.98W [24h a day : Max=0.91kWh avg=0.46kWh]
EnergyCounter : 0.000025kWh (0.00000441€) Last=37.98W [24h a day : Max=0.91kWh avg=0.68kWh]
สำหรับค่า AC ตั้งแต่ 0 ถึง 100mA การตอบสนองของอุปกรณ์ sct013 จาก 0 ถึง 100mV ภายในวงจรจะไม่มีความต่อเนื่องเชิงเส้น (Non-linear) ซึ่งสามารถใช้ Software เข้ามาช่วยแก้ไขในส่วนนี้ได้
นอกจากนี้ วงจร Arduino ใช้ไฟ 5V การตั้งค่าสัญญาณ sinusoidal ไว้ที่กึ่งกลาง 2.5V ทำให้มีค่าสูงสุดได้อีก 2.5V สำหรับสัญญาณ sinusoidal (ค่า Effective คือ 1.76V) ซึ่งหมายความว่าวงจรนี้จะรองรับช่วงพลังงานได้จำกัดตามรุ่นของโพรบ ดังนี้:
การ Monitor ชุด VCC divider ช่วยให้ควบคุมปัจจัยจากการเปลี่ยนแปลงของสภาพแวดล้อมได้ดี เช่น อุณหภูมิ, ความชื้น, ความกดอากาศ ซึ่งอาจส่งผลต่อการเปลี่ยนแปลงของอุปกรณ์อิเล็กทรอนิกส์ เนื่องจาก Board Arduino uno มี Analog Port 6 ช่อง หากใช้ 2 Port ต่อหนึ่ง sct013 probe จะทำให้จำกัดอยู่ที่สูงสุด 3 probe ต่อ Board แต่ถ้าไม่มีการควบคุม vcc divider เราจะสามารถเพิ่มจำนวนได้เป็นสองเท่า
ผมต้องขอระบุด้วยว่า ผมเคยพยายาม Monitor สาย Ground เพื่อเพิ่มความแม่นยำ แต่พบสัญญาณรบกวน (Noise) ที่ไม่คาดคิด ทำให้วิธีนี้ไม่ถูกต้อง และนั่นหมายความว่าจะต้องมีการ Monitor สาย Ground ของทุกอุปกรณ์ด้วย ดังนั้นจึงใช้ sct013 probe ได้สูงสุดเพียง 2 ตัวต่อ Board Arduino UNO
เนื่องจากโปรเจกต์นี้เป็นตัวต้นแบบ Code จึงยังไม่ได้ถูกออกแบบมาเพื่อจัดการกับจุดสิ้นสุดของ timer() อย่างถูกต้อง เมื่อ millis() หรือ micros() มีค่าถึงจุดสูงสุดและเริ่มนับจากศูนย์ใหม่
Code นี้ยังต้องการการ Optimize หรือการตรวจสอบในหลายจุด ผมยังขาดทักษะ C/C++ ขั้นสูงที่จะรีดประสิทธิภาพสูงสุดจาก Compiler และ Hardware ออกมา
ในท้ายที่สุด เครื่องต้นแบบจะใช้กระบวนการ calibration() เพื่ออ่านสัญญาณรบกวนแม่เหล็กไฟฟ้า (Electromagnetic Noise) จากตัวโพรบในขณะที่สายไฟที่กำลัง Monitor อยู่นั้นไม่มีการจ่ายไฟ ดังนั้น ค่าที่อ่านได้ใดๆ ที่ต่ำกว่า 110% ของค่า Noise จะถูกถือว่าเป็น "Noise" และเครื่องต้นแบบจะไม่นำข้อมูลนี้ไปรวมในการคำนวณพลังงาน (ซึ่ง Noise ที่วงจรอ่านได้ตอนปิดไฟดูเหมือนจะเกี่ยวข้องกับชุดจ่ายไฟ DC ที่ใช้กับ Board Arduino ในกรณีของผม)
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย