ต้องการนำ Pzem-004t v3 มาจับกับไฟ 3 เฟส

ผมจะเอา Pzem-004t v3 มาจับกับไฟสามเฟสต้องคำนวณอะไรเพิ่มเติมไหม แล้วจะคล้อง CT ยังไงหรอครับ รบกวนด้วยครับ

พอดีผมใช้บอร์ด ESP32 DEVKIT V1 ครับ


แล้วผมจะต่อกับตัว Pzem 3 ตัวได้ไหมครับ
ตอนนี้ผมต่อ RX2 TX2 ในโค้ดผมเขียน
PZEM004Tv30 pzem(&Serial); อะครับ มีคำแนะนำไหมครับ
Example PzemHarSerial


1 Like

ถ้าเป็นไฟ 3 เฟสแบบ Line to Neutral ก็น่าจะทำได้ครับ ใช้ 3 ตัว วัด Volt และ Ampaare แต่ละ phase ได้เลย
โดยการ ใช้ counter นับจำนวนครั้งแล้ว แยกว่าว่านับ ไป x ครั้งเชคตัวที่ 1 แล้วนับไปอีก x ครั้งเชคตัวที่ 2 แล้วนับไปอีก x ครั้’ง แล้วเชคตัวที่ 3 จากนั้นก็วน Loop เชคใหม่ไปเรื่อยๆ ครับ โดยการเชคแต่ละตัวก็ส่งค่าขึ้น Blynk

ได้ครับ ลองดู 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
{}




ต้อง define gpio ของ ESP32 DEVKIT V1 ขาไหนบ้างครับ
image


เหมือนตัวบอร์ดจะให้ใช้ HardwareSerial อะครับ

ลองใช้อันนี้ครับ

ภาพ

ตอนนี้ผมใช้esp8266วัดค่าแรงดัน3เฟสอยู่น่ะครับ​ แต่esp32.ยังไม่เคยใช้ครับ​ ส่วน CT ก็คล้องตัวละเฟสเลยครับลองดู

อ้อ โอเครครับ ขอบคุณครับ

@PUYIOT @Remy_Martin ตัว Pzem 004t ถ้าเกิดรับไฟฟ้าเกินขนาดที่มันวัดได้คือ 260 โวลต์ ตัว Pzem 004t จะพังเลยไหมครับ หรือมีวิธีแก้ไขเพื่อป้องกันไหมครับ

เท่าที่ทำมา ของการไฟฟ้า 3 เฟสด้านแรงสูง แต่ใช้ Pzem เชค แบบ Line to Neutral ยังไม่พบว่าแรงดันไฟเกิน 260 Vac เลยครับ จึงยังไม่ทราบครับว่าถ้าเกิน ผลจะเป็นอย่างไร

เท่าที่ลองค้นคว้าดู แรงดันเฟสวัดได้เท่าไรก็ใช้สูตร แปลงเป็นแรงดัน 3 เฟสแทนครับ เพราะในแต่ละ Line เรารู้ค่า V A และ Cos Zeta อยู่แล้ว ผมยังไม่เคยลองครับ แต่คิดว่าน่าจะเป็นไปได้ ลองคิดดุนะครับ

image

image

จากภาพเราจะเห็นว่า 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

ขอบคุณครับ
RN ,SN ,TN , RS ,ST , TR หมายถึงอะไรหรอครับ

ผมเจอแรงดันไฟ 281 V อะครับตอนนั้นใช้กับมิเตอร์ไฟมันค้างแรงดันไฟสุดท้ายไว้ 281 V อะครับ ที่เจอเเรงดันขนาดนี้ตอนที่นำไปติดตั้งมันอยู่ใกล้สถานีจ่ายไฟ

ตัวอย่างข้อมูลเกี่ยวกับระบบไฟฟ้า 1 เฟส 3 เฟสครับ

ถ้างั้นเครื่องใช้ไฟฟ้าเรา ไม่พังก็น่าจะเสื่อมสภาพเร็วกว่าปกตินะครับ เพราะเครื่องใช้ไฟฟ้าส่วนใหญ้เค้าจะบอกพิกัดแรงดันอยู่แล้วว่าตัวมันเองรับแรงดัน อยู่ในช่วงไหน ที่สามารถทำงานได้อย่างปกติ เช่น 200 - 240Vac อะไรประมาณนี้ครับ

ส่วนตัวคิดว่าไม่พังนะครับ เพราะไฟไม่ได้เข้าไปในระบบโดยตรง อาจจะเอฟเฟค คือ error อ่านค่าไม่ได้ หรือมีระบบ ตัดให้เป็น 0 ไป โดยปกติการออกแบบ product ต้องคิดเรื่องเหล่านี้อยู่แล้วครับ

โอเครครับ :blush:

สวัสดีครับ

ผมติดตั้ง 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

เบื้องต้นครับ ไฟที่จ่ายเข้า PZEM แต่ละ เฟส ต้องแยกกันครับ ตัวอย่าง

  1. ดึงเอาไฟเฟส R+N มาเข้า PZEM ตัวที่ 1
  2. ดึงเอาไฟเฟส S+N มาเข้า PZEM ตัวที่ 2
  3. ดึงเอาไฟเฟส T+N มาเข้า PZEM ตัวที่ 3

เพราะว่า PZEM จะเอา แรงดันนี้ไปคำนวณครับ

ถ้าเราเอาไฟ สมมุติว่า เฟส R เข้าไปที่ PZEM ทั้ง 3 ตัว PZEM แต่ละตัวก็เอาแรงดันเฉพาะ เฟส R ไป ครับ ซึ่งไม่ถูกต้อง และหลังจากที่เราเปลี่ยนแล้ว ลองดูว่าค่าต่างๆ เปลี่ยนไปหรือไม่ เช่นค่ากระแส ค่า PF (ซึ่งดูแล้วค่า PF ต่ำมาก ไม่น่าเป็นไปได้ครับ)

2 Likes

ขอบคุณครับ

แก้ไขแล้ว ตามคำแนะนำ

ได้ค่าวัดจาก PZEM รวมกัน 3 ตัว ใกล้เคียง Meter MEA มากๆเลยครับ

1 Like