Ananda_Wutwanna (Ananda Wutwanna) September 19, 2020, 3:06am #1
ผมจะเอา Pzem-004t v3 มาจับกับไฟสามเฟสต้องคำนวณอะไรเพิ่มเติมไหม แล้วจะคล้อง CT ยังไงหรอครับ รบกวนด้วยครับ
พอดีผมใช้บอร์ด ESP32 DEVKIT V1 ครับ
แล้วผมจะต่อกับตัว Pzem 3 ตัวได้ไหมครับ
ตอนนี้ผมต่อ RX2 TX2 ในโค้ดผมเขียน
PZEM004Tv30 pzem(&Serial); อะครับ มีคำแนะนำไหมครับ
Example PzemHarSerial
1 Like
ว่าด้วยเรื่อง Pzem 004t v3.0 จะวัดพลังงาน+ค่าใช้จ่าย/เดือน
PUYIOT September 19, 2020, 2:59am #2
ถ้าเป็นไฟ 3 เฟสแบบ Line to Neutral ก็น่าจะทำได้ครับ ใช้ 3 ตัว วัด Volt และ Ampaare แต่ละ phase ได้เลย
โดยการ ใช้ counter นับจำนวนครั้งแล้ว แยกว่าว่านับ ไป x ครั้งเชคตัวที่ 1 แล้วนับไปอีก x ครั้งเชคตัวที่ 2 แล้วนับไปอีก x ครั้’ง แล้วเชคตัวที่ 3 จากนั้นก็วน Loop เชคใหม่ไปเรื่อยๆ ครับ โดยการเชคแต่ละตัวก็ส่งค่าขึ้น Blynk
PUYIOT September 19, 2020, 3:01am #3
ได้ครับ ลองดู code นี้นะครับ
#include <PZEM004Tv30.h>
PZEM004Tv30 pzemL1(D1, D2); // (D1)=RX , (D2) = TX
PZEM004Tv30 pzemL2(D3, D5); // (D3)=RX , (D5) = TX
PZEM004Tv30 pzemL3(D6, D7); // (D6)=RX , (D7) = TX
จากนั้นใน loop ก็จะมี counter นับจำนวนครั้ง 4 ครั้ง
โดยครั้งที่ 1 ให้เชคค่าตัวที่ 1
ครั้งที่ 2 ให้เชคค่าตัวที่ 2
ครั้งที่ 3 ให้เชคค่าตัวที่ 3
ครั้งที่ 4 reset เป็น 0 แล้วกลับไปนับ ครั้งที่ 1 ตัวที่ 1ใหม่
countcheck ++;
if (countcheck == 1) {
check_Pzem1();
}
if (countcheck == 2) {
check_Pzem2();
}
if (countcheck == 3) {
check_Pzem3();
}
if (countcheck == 4) {
countcheck = 0;
}
void check_Pzem1()//Pzem ตัวที่ 1
{}
void check_Pzem2()//Pzem ตัวที่ 2
{}
void check_Pzem3()//Pzem ตัวที่ 3
{}
Ananda_Wutwanna (Ananda Wutwanna) September 19, 2020, 3:02am #4
ต้อง define gpio ของ ESP32 DEVKIT V1 ขาไหนบ้างครับ
Ananda_Wutwanna (Ananda Wutwanna) September 19, 2020, 3:03am #5
เหมือนตัวบอร์ดจะให้ใช้ HardwareSerial อะครับ
Remy_Martin (Permpol Thanapunnamas) September 19, 2020, 3:13am #6
ลองใช้อันนี้ครับ
PUYIOT September 19, 2020, 8:58am #7
ตอนนี้ผมใช้esp8266วัดค่าแรงดัน3เฟสอยู่น่ะครับ แต่esp32.ยังไม่เคยใช้ครับ ส่วน CT ก็คล้องตัวละเฟสเลยครับลองดู
Ananda_Wutwanna (Ananda Wutwanna) September 25, 2020, 2:38am #10
อ้อ โอเครครับ ขอบคุณครับ
Ananda_Wutwanna (Ananda Wutwanna) September 25, 2020, 2:45am #11
@PUYIOT @Remy_Martin ตัว Pzem 004t ถ้าเกิดรับไฟฟ้าเกินขนาดที่มันวัดได้คือ 260 โวลต์ ตัว Pzem 004t จะพังเลยไหมครับ หรือมีวิธีแก้ไขเพื่อป้องกันไหมครับ
PUYIOT September 25, 2020, 3:59am #12
เท่าที่ทำมา ของการไฟฟ้า 3 เฟสด้านแรงสูง แต่ใช้ Pzem เชค แบบ Line to Neutral ยังไม่พบว่าแรงดันไฟเกิน 260 Vac เลยครับ จึงยังไม่ทราบครับว่าถ้าเกิน ผลจะเป็นอย่างไร
PUYIOT September 25, 2020, 4:11am #13
เท่าที่ลองค้นคว้าดู แรงดันเฟสวัดได้เท่าไรก็ใช้สูตร แปลงเป็นแรงดัน 3 เฟสแทนครับ เพราะในแต่ละ Line เรารู้ค่า V A และ Cos Zeta อยู่แล้ว ผมยังไม่เคยลองครับ แต่คิดว่าน่าจะเป็นไปได้ ลองคิดดุนะครับ
จากภาพเราจะเห็นว่า Voltmeter เป็น แบบ Analog และมี Voltmeter switch เป็นตัวบิดเลือก เชคค่าแรงดัน 6 ตำแหน่ง RN ,SN ,TN , RS ,ST , TR ตอนนี้ Pzem ทำได้ แบบ Line to Neutral อยู่แล้ว (แรงดัน Pzem ไม่เกิน 260 กระแสไม่เกิน 100 A) ซึ่งก็คือ RN ,SN ,TN ครับ แต่พอมาเชคแบบ RS ,ST , TR ถ้าเป็นแบบดิจิตอลก็น่าจะมาจากการคำนวณครับ (ที่เป็นไปได้) ทั้งนี้เราต้องหาข้อมูลประกอบด้วยนะครับ
1 Like
Ananda_Wutwanna (Ananda Wutwanna) September 25, 2020, 4:25am #14
ขอบคุณครับ
RN ,SN ,TN , RS ,ST , TR หมายถึงอะไรหรอครับ
Ananda_Wutwanna (Ananda Wutwanna) September 25, 2020, 4:35am #15
ผมเจอแรงดันไฟ 281 V อะครับตอนนั้นใช้กับมิเตอร์ไฟมันค้างแรงดันไฟสุดท้ายไว้ 281 V อะครับ ที่เจอเเรงดันขนาดนี้ตอนที่นำไปติดตั้งมันอยู่ใกล้สถานีจ่ายไฟ
PUYIOT September 25, 2020, 4:36am #16
ตัวอย่างข้อมูลเกี่ยวกับระบบไฟฟ้า 1 เฟส 3 เฟสครับ
Tips - www.tic.co.th
PUYIOT September 25, 2020, 4:38am #17
ถ้างั้นเครื่องใช้ไฟฟ้าเรา ไม่พังก็น่าจะเสื่อมสภาพเร็วกว่าปกตินะครับ เพราะเครื่องใช้ไฟฟ้าส่วนใหญ้เค้าจะบอกพิกัดแรงดันอยู่แล้วว่าตัวมันเองรับแรงดัน อยู่ในช่วงไหน ที่สามารถทำงานได้อย่างปกติ เช่น 200 - 240Vac อะไรประมาณนี้ครับ
Remy_Martin (Permpol Thanapunnamas) September 25, 2020, 11:39am #18
ส่วนตัวคิดว่าไม่พังนะครับ เพราะไฟไม่ได้เข้าไปในระบบโดยตรง อาจจะเอฟเฟค คือ error อ่านค่าไม่ได้ หรือมีระบบ ตัดให้เป็น 0 ไป โดยปกติการออกแบบ product ต้องคิดเรื่องเหล่านี้อยู่แล้วครับ
Ananda_Wutwanna (Ananda Wutwanna) September 25, 2020, 9:17am #19
โอเครครับ
Som_SP (Som SP) February 1, 2021, 3:58am #20
สวัสดีครับ
ผมติดตั้ง PZEM-004T และ CT100A จำนวน 3 ตัว เพื่อต้องการวัดค่าพลังงานไฟฟ้า 3 phase ที่บ้าน
แต่พอนำ Energy (kWh) จาก PZEM ทั้ง 3 ตัวมารวมกัน จะได้ค่าแค่ประมาณครึ่งหนึ่ง ของ Watt hour meter ของการไฟฟ้าครับ
มีคำแนะนำสำหรับเรื่องนี้ไหมครับ ขอบคุณครับ
CODE>>
/*
-PZEM004T-
5V - 5V
GND - GND
D3 - TX(PZEM1)
D4 - RX(PZEM1)
D5 - TX(PZEM2)
D6 - RX(PZEM2)
D7 - TX(PZEM3)
D0 - RX(PZEM3)
*/
#include <ESP8266WiFi.h>
#include <PZEM004Tv30.h>
#include <Wire.h> // Include Wire if you're using I2C
#include <SFE_MicroOLED.h> // Include the SFE_MicroOLED library
#include <BlynkSimpleEsp8266.h>
#define PIN_RESET -1
#define DC_JUMPER 0
#define BLYNK_PRINT Serial
MicroOLED oled(PIN_RESET, DC_JUMPER);
PZEM004Tv30 pzem1(D3, D4); //rx,tx pin for phase1
PZEM004Tv30 pzem2(D5, D6); //rx,tx pin for phase2
PZEM004Tv30 pzem3(D7, D0); //rx,tx pin for phase3
unsigned long previousMillis = 0;
float voltage1, current1, power1, energy1, frequency1, pf1;
float voltage2, current2, power2, energy2, frequency2, pf2;
float voltage3, current3, power3, energy3, frequency3, pf3;
char ssid[] = "true_home2G_173";
char pass[] = "8ce6a173";
char auth[] = "5ifMurQc1qE6-FoOAOccZomBJBsPNdpT";
uint8_t logo_bmp[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xC0, 0xF0, 0xE0, 0x78, 0x38, 0x78, 0x3C, 0x1C, 0x3C, 0x1C, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1C, 0x3C, 0x1C, 0x3C, 0x78, 0x38, 0xF0, 0xE0, 0xF0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x01, 0x00, 0x00, 0xF0, 0xF8, 0x70, 0x3C, 0x3C, 0x1C, 0x1E, 0x1E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0E, 0x0E, 0x1E, 0x1E, 0x1E, 0x3C, 0x1C, 0x7C, 0x70, 0xF0, 0x70, 0x20, 0x01, 0x01, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x3E, 0x1E, 0x0F, 0x0F, 0x07, 0x87, 0x87, 0x07, 0x0F, 0x0F, 0x1E, 0x3E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1F, 0x1F, 0x3F, 0x3F, 0x1F, 0x1F, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
//for reset energy
BLYNK_WRITE(V7)
{
int pinValue = param.asInt();
if (pinValue == HIGH) {
Serial.println("Reset energy");
pzem1.resetEnergy();
}
}
BLYNK_WRITE(V14)
{
int pinValue = param.asInt();
if (pinValue == HIGH) {
Serial.println("Reset energy");
pzem2.resetEnergy();
}
}
BLYNK_WRITE(V21)
{
int pinValue = param.asInt();
if (pinValue == HIGH) {
Serial.println("Reset energy");
pzem3.resetEnergy();
}
}
void setup() {
Serial.begin(115200);
Wire.begin();
//------Display LOGO at start------
oled.begin();
oled.clear(PAGE);
oled.clear(ALL);
oled.drawBitmap(logo_bmp);//call the drawBitmap function and pass it the array from above
oled.setFontType(0);
oled.setCursor(0, 36);
oled.print(" IoTbundle");
oled.display();
// pzem.resetEnergy(); //reset energy
Blynk.begin(auth, ssid, pass);
}
void loop() {
Blynk.run();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 1000) { //run every 1 second
previousMillis = currentMillis;
displayValue(); //update OLED
//------sent data to blynk------
//phase1 (V7 for reset energy)
if (!isnan(voltage1)) {
Blynk.virtualWrite(V1, voltage1);
Blynk.virtualWrite(V2, current1);
Blynk.virtualWrite(V3, power1);
Blynk.virtualWrite(V4, energy1);
Blynk.virtualWrite(V5, frequency1);
Blynk.virtualWrite(V6, pf1);
}
//phase2 (V14 for reset energy)
if (!isnan(voltage2)) {
Blynk.virtualWrite(V8, voltage2);
Blynk.virtualWrite(V9, current2);
Blynk.virtualWrite(V10, power2);
Blynk.virtualWrite(V11, energy2);
Blynk.virtualWrite(V12, frequency2);
Blynk.virtualWrite(V13, pf2);
}
//phase3 (V21 for reset energy)
if (!isnan(voltage3)) {
Blynk.virtualWrite(V15, voltage3);
Blynk.virtualWrite(V16, current3);
Blynk.virtualWrite(V17, power3);
Blynk.virtualWrite(V18, energy3);
Blynk.virtualWrite(V19, frequency3);
Blynk.virtualWrite(V20, pf3);
}
}
}
void displayValue() {
//------read data------
//phase1
voltage1 = pzem1.voltage();
current1 = pzem1.current();
power1 = pzem1.power();
energy1 = pzem1.energy();
frequency1 = pzem1.frequency();
pf1 = pzem1.pf();
//phase2
voltage2 = pzem2.voltage();
current2 = pzem2.current();
power2 = pzem2.power();
energy2 = pzem2.energy();
frequency2 = pzem2.frequency();
pf2 = pzem2.pf();
//phase3
voltage3 = pzem3.voltage();
current3 = pzem3.current();
power3 = pzem3.power();
energy3 = pzem3.energy();
frequency3 = pzem3.frequency();
pf3 = pzem3.pf();
//------Update OLED display------
oled.clear(PAGE);
oled.setFontType(0);
//display power
//phase1
if (power1 < 10) oled.setCursor(26, 0);
else if (power1 < 100) oled.setCursor(20, 0);
else if (power1 < 1000) oled.setCursor(14, 0);
else if (power1 < 10000) oled.setCursor(8, 0);
else oled.setCursor(2, 0);
oled.print(power1, 0); oled.setCursor(46, 0); oled.println("W");
//phase1
if (power2 < 10) oled.setCursor(26, 16);
else if (power2 < 100) oled.setCursor(20, 16);
else if (power2 < 1000) oled.setCursor(14, 16);
else if (power2 < 10000) oled.setCursor(8, 16);
else oled.setCursor(2, 16);
oled.print(power2, 0); oled.setCursor(46, 16); oled.println("W");
//phase1
if (power3 < 10) oled.setCursor(26, 32);
else if (power3 < 100) oled.setCursor(20, 32);
else if (power3 < 1000) oled.setCursor(14, 32);
else if (power3 < 10000) oled.setCursor(8, 32);
else oled.setCursor(2, 32);
oled.print(power3, 0); oled.setCursor(46, 32); oled.println("W");
//on error
if (isnan(voltage1) && isnan(voltage2) && isnan(voltage3)) {
oled.clear(PAGE);
oled.setCursor(0, 0);
oled.printf("Please\n\nConnect\n\nPZEM004T");
}
oled.display();
//------Serial display------
//phase1
Serial.print("Voltage: "); Serial.print(voltage1); Serial.println("V");
Serial.print("Current: "); Serial.print(current1); Serial.println("A");
Serial.print("Power: "); Serial.print(power1); Serial.println("W");
Serial.print("Energy: "); Serial.print(energy1, 3); Serial.println("kWh");
Serial.print("Frequency: "); Serial.print(frequency1, 1); Serial.println("Hz");
Serial.print("PF: "); Serial.println(pf1); Serial.println("");
//phase2
Serial.print("Voltage: "); Serial.print(voltage2); Serial.println("V");
Serial.print("Current: "); Serial.print(current2); Serial.println("A");
Serial.print("Power: "); Serial.print(power2); Serial.println("W");
Serial.print("Energy: "); Serial.print(energy2, 3); Serial.println("kWh");
Serial.print("Frequency: "); Serial.print(frequency2, 1); Serial.println("Hz");
Serial.print("PF: "); Serial.println(pf2); Serial.println("");
//phase3
Serial.print("Voltage: "); Serial.print(voltage3); Serial.println("V");
Serial.print("Current: "); Serial.print(current3); Serial.println("A");
Serial.print("Power: "); Serial.print(power3); Serial.println("W");
Serial.print("Energy: "); Serial.print(energy3, 3); Serial.println("kWh");
Serial.print("Frequency: "); Serial.print(frequency3, 1); Serial.println("Hz");
Serial.print("PF: "); Serial.println(pf3); Serial.println("");
}
1 Like
PUYIOT December 12, 2020, 8:56am #21
เบื้องต้นครับ ไฟที่จ่ายเข้า PZEM แต่ละ เฟส ต้องแยกกันครับ ตัวอย่าง
- ดึงเอาไฟเฟส R+N มาเข้า PZEM ตัวที่ 1
- ดึงเอาไฟเฟส S+N มาเข้า PZEM ตัวที่ 2
- ดึงเอาไฟเฟส T+N มาเข้า PZEM ตัวที่ 3
เพราะว่า PZEM จะเอา แรงดันนี้ไปคำนวณครับ
ถ้าเราเอาไฟ สมมุติว่า เฟส R เข้าไปที่ PZEM ทั้ง 3 ตัว PZEM แต่ละตัวก็เอาแรงดันเฉพาะ เฟส R ไป ครับ ซึ่งไม่ถูกต้อง และหลังจากที่เราเปลี่ยนแล้ว ลองดูว่าค่าต่างๆ เปลี่ยนไปหรือไม่ เช่นค่ากระแส ค่า PF (ซึ่งดูแล้วค่า PF ต่ำมาก ไม่น่าเป็นไปได้ครับ)
2 Likes
Som_SP (Som SP) December 12, 2020, 11:50pm #22
ขอบคุณครับ
แก้ไขแล้ว ตามคำแนะนำ
ได้ค่าวัดจาก PZEM รวมกัน 3 ตัว ใกล้เคียง Meter MEA มากๆเลยครับ