การใช้งาน ESP32+PZEM-004T เพื่อวัดปริมาณการใช้ไฟฟ้า วัดกำลังและพลังงานไฟฟ้ากระแสสลับ (Electric Power – Watt) และพลังงานไฟฟ้า (Energy – Wh) ผ่านแอพ Blynk
อัพเดท 20 กันยายน 2567
ในการวัดค่าเพื่อบันทึกการใช้ปริมาณไฟฟ้า เพื่อการตรวจสอบ วัดค่าการใช้พลังงาน ควบคุมค่าไฟฟ้า แล้ว อุปกรณ์วัดจำเป็นต้องให้ข้อมูลหลายๆ ค่า ได้แก่ แรงดัน (VAC) กระแส (IAC) กำลังไฟฟ้าจริง (Active power) ค่าตัวประกอบกำลัง (Power Factor) ค่าพลังงานไฟฟ้า (Energy) เพื่อมาใช้ในการคำนวณคิค่าการใช้ไฟฟ้า โดยใช้โมดูล PZEM รับหน้าที่การคำนวณค่าต่างๆ ไปเรียบร้อย และส่งผลการคำนวณต่างๆ ออกมาจากโมดูลผ่านการสื่อสารแบบ serial (TX, RX) ซึ่งสามารถใช้เพื่อควบคุมสั่งการต่อด้วยบอร์ด Arduino หรือ ส่งค่าต่อไปที่คอมพิวเตอร์ การต่อวงจรดูรูปด้านล่าง
// โปรแกรม Arduino IDE
#define BLYNK_PRINT Serial // Template Blynk
#define BLYNK_TEMPLATE_ID “TMPxxxxxxxx”
#define BLYNK_TEMPLATE_NAME “xxxxxxxxxxxxx”
#include <PZEM004Tv30.h>
#include <TimeLib.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
BlynkTimer timer;
char auth[] = “xxxxxxxxxxxxxxxxxxxxxxxxx”; // Blynk Authen Key
char ssid[] = “xxxxxxxxxxxx”; // SSID WiFi
char pass[] = “xxxxxxxxxxxx”; // Password WiFi
#if !defined(PZEM_RX_PIN) && !defined(PZEM_TX_PIN)
#define PZEM_RX_PIN 16
#define PZEM_TX_PIN 17
#endif
#if !defined(PZEM_SERIAL)
#define PZEM_SERIAL Serial2
#endif
#if defined(ESP32)
PZEM004Tv30 pzem(PZEM_SERIAL, PZEM_RX_PIN, PZEM_TX_PIN);
#elif defined(ESP8266)
#else
PZEM004Tv30 pzem(PZEM_SERIAL);
#endif
void read_pzem()
{
float voltage = pzem.voltage();
float current = pzem.current();
float power = pzem.power();
float energy = pzem.energy();
float frequency = pzem.frequency();
float pf = pzem.pf();
Serial.print(“Custom Address:”);
Serial.println(pzem.readAddress(), HEX);
Blynk.virtualWrite(V0,voltage);
Blynk.virtualWrite(V1,current);
Blynk.virtualWrite(V2,power);
Blynk.virtualWrite(V3,energy);
if(isnan(voltage)){
Serial.println(“Error reading voltage”);
} else if (isnan(current)) {
Serial.println(“Error reading current”);
} else if (isnan(power)) {
Serial.println(“Error reading power”);
} else if (isnan(energy)) {
Serial.println(“Error reading energy”);
} else if (isnan(frequency)) {
Serial.println(“Error reading frequency”);
} else if (isnan(pf)) {
Serial.println(“Error reading power factor”);
} else {
Serial.print(“Voltage: “); Serial.print(voltage); Serial.println(“V”);
Serial.print(“Current: “); Serial.print(current); Serial.println(“A”);
Serial.print(“Power: “); Serial.print(power); Serial.println(“W”);
Serial.print(“Energy: “); Serial.print(energy,3); Serial.println(“kWh”);
Serial.print(“Frequency: “); Serial.print(frequency, 1); Serial.println(“Hz”);
Serial.print(“PF: “); Serial.println(pf);
}
}
void setup() {
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
timer.setInterval(2000L, read_pzem);
}
void loop() {
Blynk.run();
timer.run();
}
*หมายเหตุ ใน Arduino IDE คอมไพล์ไม่ผ่านให้แก้เครื่องหมาย ” ” ให้ถูกต้อง
กำหนด Datastreams ใน Blynk.IO