ขอคำปร๊กษา เกี่ยวกับการใช้งาน pzem-004t v3 วัดค่าไม่ตรง

สวัสดีครับ ตอนนี้ผมกำลังศึกษาพฤติกรรมการใช้ไฟฟ้าของบ้านตัวเอง โดนใช้ esp8266+Dht11+Pzem 004tv3 และแสดงใน Blynk ซึ่งปัญหาที่พบคือ ตัว pzem วัดแรงดันและ กระแสไม่ตรงตาม แคลมป์มิเตอร์ หลายๆครั้ง พบว่า แรงดันและกระแสสูงกว่าแคลมป์มิเตอร์วัดได้ ผมจึงซื้อ esp8266+Dht11+Pzem 004tv3 มาอีกชุดเพื่อทดสอบเทียบ ผลเป็นเหมือนเดิม
??? จึงสงใสปัญหาที่เกิด เกิดจาก Software หรือ Hardware รบกวนขอคำปรึกษาด้วยครับ




การต่อใช้งานครับ ตัวไฟเลี้ยง Pzem ผมลองใช้งาน 5v และ 3.3v ผลก็ไม่ต่างกันเลยครับ TT

โค้ด

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <PZEM004Tv30.h>
#include "DHT.h"

#define PIN_RESET -1
#define DC_JUMPER 0
#define BLYNK_PRINT Serial


PZEM004Tv30 pzem(D5, D6);
DHT dht;

char auth[] = "555";
char ssid[] = "555";
char pass[] = "555";

BLYNK_WRITE(V8)
{
  int pinValue = param.asInt();
  if(pinValue==HIGH){
    Serial.println("Reset energy");
    pzem.resetEnergy();
  }
}

void setup() {
  Serial.begin(115200);
  Blynk.begin(auth, ssid, pass, "oasiskit.com", 8080);
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");
  dht.setup(2); // data pin 2
}

void loop() {
    float voltage = pzem.voltage();
    if( !isnan(voltage) ){
        Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V");
    } else {
        Serial.println("Error reading voltage");
    }

    float current = pzem.current();
    if( !isnan(current) ){
        Serial.print("Current: "); Serial.print(current); Serial.println("A");
    } else {
        Serial.println("Error reading current");
    }

    float power = pzem.power();
    if( !isnan(power) ){
        Serial.print("Power: "); Serial.print(power); Serial.println("W");
    } else {
        Serial.println("Error reading power");
    }

    float energy = pzem.energy();
    if( !isnan(energy) ){
        Serial.print("Energy: "); Serial.print(energy,3); Serial.println("kWh");
    } else {
        Serial.println("Error reading energy");
    }

    float frequency = pzem.frequency();
    if( !isnan(frequency) ){
        Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz");
    } else {
        Serial.println("Error reading frequency");
    }

    float pf = pzem.pf();
    if( !isnan(pf) ){
        Serial.print("PF: "); Serial.println(pf);
    } else {
        Serial.println("Error reading power factor");
    }
    {
  delay(dht.getMinimumSamplingPeriod());
  float humidity = dht.getHumidity(); // ดึงค่าความชื้น
  float temperature = dht.getTemperature(); // ดึงค่าอุณหภูมิ
  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(humidity, 1);
  Serial.print("\t\t");
  Serial.print(temperature, 1);
  Serial.print("\t\t");
  Serial.println(dht.toFahrenheit(temperature), 1);
  Blynk.run();
  Blynk.virtualWrite(V0, temperature); 
  Blynk.virtualWrite(V1, humidity); 
  Blynk.virtualWrite(V2, voltage);
  Blynk.virtualWrite(V3, current);
  Blynk.virtualWrite(V4, power);
  Blynk.virtualWrite(V5, energy);
  Blynk.virtualWrite(V6, frequency);
  Blynk.virtualWrite(V7, pf);
    }

    Serial.println();
    delay(2000);
}

ทดลอง Code ที่อ่าน pzem-004t v3 ตัวเดียวโดดๆ ดูหน่อยครับ ว่า ยังอ่านได้สูงเหมือนเดิมไหม

พอมารันตัว Pzem โดดๆ ค่าตรงครับ (วัดมิเตอร์เทียบ)

ถ้าอ่านได้ตรง(เทียบกับมิเตอร์) แสดงว่าน่าจะเกิดการกวนของ Code ที่อ่านค่า จาก DHT22 ลองแยกการเรียกขอข้อมูล ออกจากกัน โดย เขียน Code แบบ Multi Task ดูครับ ให้เรียกอ่าน ข้อมูล DHT22 ทุกๆ 2 sec. และเรียกอ่าน ข้อมูล PZEM004Tv30 ทุกๆ 1 sec. ( ไม่ใช่การใช้ Delay นะครับ )

ลองศึกษาการเขียน Code จาก เจ้านี้ดูครับ สังเกตุการเขียน Code และ การอธิบายแต่ละจุดดู แล้วปรับมาใช้กับ Code ของเรา

เริ่มใช้ Blynk Library ให้ถูกต้อง ลดBug ลดError ได้99%

ขอบคุณมากครับพี่ เดี๋ยวจะลองศึกษาดูครับ

ลองปรับ Code ดูครับ ถ้าติดขัดตรงไหน เอาตรงที่มีปัญหา มาช่วยกันแก้ไขครับ

สอบถามเพิ่มหน่อยครับ Sensor อุณหภูมิกับความชื้น มาทำอะไร กับ ชุด PZEM004Tv30 ครับ

ผมเอาตัว Pzem มาวัดการใช้ไฟฟ้าในบ้านครับ เลยติดไว้ที่ตู้ MDB และติดตัววัดอุณหภูมิไว้ด้วยครับ

ตอนนี้ผมลองรันโค้ด เฉพาะPmez รันได้ครับ
แต่พอผสมร่วมกันตัว DHT11 รันไม่ผ่านตลอดเลยครับ TT ไม่รู้ติดตรงไหน

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <PZEM004Tv30.h> 

char auth[] = "55555";
char ssid[] = "55555";
char pass[] = "55555";

PZEM004Tv30 pzem(D5, D6);

BlynkTimer timer;

BLYNK_WRITE(V8)
{
    int pinValue = param.asInt();
    if (pinValue == 1){
    Serial.println("Reset");
    }
}

void myTimerEvent()
{
float voltage = pzem.voltage();
    if( !isnan(voltage) ){
        Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V");
        Blynk.virtualWrite(V2,voltage);
    } else {
        Serial.println("Error reading voltage");
    }

    float current = pzem.current();
    if( !isnan(current) ){
        Serial.print("Current: "); Serial.print(current); Serial.println("A");
        Blynk.virtualWrite(V3,current);
    } else {
        Serial.println("Error reading current");
    }

    float power = pzem.power();
    if( !isnan(power) ){
        Serial.print("Power: "); Serial.print(power); Serial.println("W");
        Blynk.virtualWrite(V4,power);
    } else {
        Serial.println("Error reading power");
    }

    float energy = pzem.energy();
    if( !isnan(energy) ){
        Serial.print("Energy: "); Serial.print(energy,3); Serial.println("kWh");
        Blynk.virtualWrite(V5,energy,3);
    } else {
        Serial.println("Error reading energy");
    }

    float frequency = pzem.frequency();
    if( !isnan(frequency) ){
        Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz");
        Blynk.virtualWrite(V6,frequency, 1);
    } else {
        Serial.println("Error reading frequency");
    }

    float pf = pzem.pf();
    if( !isnan(pf) ){
        Serial.print("PF: "); Serial.println(pf);
        Blynk.virtualWrite(V7,pf);
    } else {
        Serial.println("Error reading power factor");
    }

    Serial.println();
}

void CheckTemp()
{
  dht.setup(2); // data pin 2
  delay(dht.getMinimumSamplingPeriod());
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(humidity, 1);
  Serial.print("\t\t");
  Serial.print(temperature, 1);
  Serial.print("\t\t");
  Serial.println(dht.toFahrenheit(temperature), 1);
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");
  Blynk.virtualWrite(V0, temperature);
  Blynk.virtualWrite(V1, humidity); 
}

void setup()
{
  Serial.begin(115200);

  Blynk.begin(auth, ssid, pass, "oasiskit.com", 8080);

  timer.setInterval(2000L, myTimerEvent);
  timer.setInterval(2000L, CheckTemp);
}

void loop()
{
  Blynk.run();
  timer.run();
}

Code ต้นแบบ ก่อนแก้ไข เอามาจากไหนครับ เพราะ ลอง check code แล้ว มี error ตั้งแต่แรกแล้ว

Capture

ลงข้อความ กับแถบ Error ให้ดูหน่อยครับ

เป็นโค้ดใน libraries ของ DTH11 เลยครับ
โค้ดที่พี่รันเป็นโค้ดเก่าครับ ลอง รันตัวนี้ดูครับ

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <PZEM004Tv30.h> 

char auth[] = "55555";
char ssid[] = "55555";
char pass[] = "55555";

PZEM004Tv30 pzem(D5, D6);

BlynkTimer timer;

BLYNK_WRITE(V8)
{
    int pinValue = param.asInt();
    if (pinValue == 1){
    Serial.println("Reset");
    }
}

void myTimerEvent()
{
float voltage = pzem.voltage();
    if( !isnan(voltage) ){
        Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V");
        Blynk.virtualWrite(V2,voltage);
    } else {
        Serial.println("Error reading voltage");
    }

    float current = pzem.current();
    if( !isnan(current) ){
        Serial.print("Current: "); Serial.print(current); Serial.println("A");
        Blynk.virtualWrite(V3,current);
    } else {
        Serial.println("Error reading current");
    }

    float power = pzem.power();
    if( !isnan(power) ){
        Serial.print("Power: "); Serial.print(power); Serial.println("W");
        Blynk.virtualWrite(V4,power);
    } else {
        Serial.println("Error reading power");
    }

    float energy = pzem.energy();
    if( !isnan(energy) ){
        Serial.print("Energy: "); Serial.print(energy,3); Serial.println("kWh");
        Blynk.virtualWrite(V5,energy,3);
    } else {
        Serial.println("Error reading energy");
    }

    float frequency = pzem.frequency();
    if( !isnan(frequency) ){
        Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz");
        Blynk.virtualWrite(V6,frequency, 1);
    } else {
        Serial.println("Error reading frequency");
    }

    float pf = pzem.pf();
    if( !isnan(pf) ){
        Serial.print("PF: "); Serial.println(pf);
        Blynk.virtualWrite(V7,pf);
    } else {
        Serial.println("Error reading power factor");
    }

    Serial.println();
}

void CheckTemp()
{
  dht.setup(2); // data pin 2
  delay(dht.getMinimumSamplingPeriod());
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(humidity, 1);
  Serial.print("\t\t");
  Serial.print(temperature, 1);
  Serial.print("\t\t");
  Serial.println(dht.toFahrenheit(temperature), 1);
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");
  Blynk.virtualWrite(V0, temperature);
  Blynk.virtualWrite(V1, humidity); 
}

void setup()
{
  Serial.begin(115200);

  Blynk.begin(auth, ssid, pass, "oasiskit.com", 8080);

  timer.setInterval(2000L, myTimerEvent);
  timer.setInterval(2000L, CheckTemp);
}

void loop()
{
  Blynk.run();
  timer.run();
}

ติดตรงนี้ใช่ไหม

Capture2

ยังไม่ได้เรียกใช้ Library DHT11
ยังไม่ได้ประกาศการใช้ขา ของ ESP และ ประกาศการเลือกใช้ DHT11 ครับ

ลองดูตัวอย่าง Code การใช้งาน ของ DHT11 อยูใน Example ครับ

ใน Example ของผมจะเป็นตัวนี้ครับ

โค้ตนี้ครับ

#include "DHT.h"

DHT dht;

void setup()
{
  Serial.begin(9600);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");

  dht.setup(2); // data pin 2
}

void loop()
{
  delay(dht.getMinimumSamplingPeriod());

  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();

  Serial.print(dht.getStatusString());
  Serial.print("\t");
  Serial.print(humidity, 1);
  Serial.print("\t\t");
  Serial.print(temperature, 1);
  Serial.print("\t\t");
  Serial.println(dht.toFahrenheit(temperature), 1);
}

Library ของท่าน อาจไม่เหมือนผม แต่ถ้าก่อนหน้านี้ ใช้ได้ ให้ดูโครงสร้าง Code ตัวอย่างครับ แล้วดูว่า ตรงไหน ของ Code เรา ไม่เหมือน โครงสร้างในตัวอย่าง Code ก็ เพิ่มลงไปครับ

แต่ที่เห็นตอนนี้ ก็ตามที่บอกตอนต้น ยังไม่ได้เรียกใช้ Library กับ ประการการใช้ Library

1 Like

ตอนนี้ รันโค้ตผ่านแล้วครับ เดี๋ยวจะลองต่อใช้งานดูครับ

#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <PZEM004Tv30.h> 
#include "DHT.h"
#define DHTPIN 2 
#define DHTTYPE DHT11

char auth[] = "55555";
char ssid[] = "55555";
char pass[] = "55555";

PZEM004Tv30 pzem(D5, D6);
DHT dht(DHTPIN, DHTTYPE);

BlynkTimer timer;

BLYNK_WRITE(V8)
{
    int pinValue = param.asInt();
    if (pinValue == 1){
    Serial.println("Reset");
    }
}

void myTimerEvent()
{
float voltage = pzem.voltage();
    if( !isnan(voltage) ){
        Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V");
        Blynk.virtualWrite(V2,voltage);
    } else {
        Serial.println("Error reading voltage");
    }

    float current = pzem.current();
    if( !isnan(current) ){
        Serial.print("Current: "); Serial.print(current); Serial.println("A");
        Blynk.virtualWrite(V3,current);
    } else {
        Serial.println("Error reading current");
    }

    float power = pzem.power();
    if( !isnan(power) ){
        Serial.print("Power: "); Serial.print(power); Serial.println("W");
        Blynk.virtualWrite(V4,power);
    } else {
        Serial.println("Error reading power");
    }

    float energy = pzem.energy();
    if( !isnan(energy) ){
        Serial.print("Energy: "); Serial.print(energy,3); Serial.println("kWh");
        Blynk.virtualWrite(V5,energy,3);
    } else {
        Serial.println("Error reading energy");
    }

    float frequency = pzem.frequency();
    if( !isnan(frequency) ){
        Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz");
        Blynk.virtualWrite(V6,frequency, 1);
    } else {
        Serial.println("Error reading frequency");
    }

    float pf = pzem.pf();
    if( !isnan(pf) ){
        Serial.print("PF: "); Serial.println(pf);
        Blynk.virtualWrite(V7,pf);
    } else {
        Serial.println("Error reading power factor");
    }

    Serial.println();
}

void CheckTemp()
{
  float h = dht.readHumidity();

  float t = dht.readTemperature();

  float f = dht.readTemperature(true);

  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  float hif = dht.computeHeatIndex(f, h);

  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
  Serial.println("DHTxx test!");
  Blynk.virtualWrite(V0, hif);
  Blynk.virtualWrite(V1, hic); 
}

void setup()
{
  Serial.begin(115200);

  Blynk.begin(auth, ssid, pass, "oasiskit.com", 8080);

  timer.setInterval(2000L, myTimerEvent);
  timer.setInterval(2000L, CheckTemp);
}

void loop()
{
  Blynk.run();
  timer.run();
}
1 Like

จากการใช้งานมา1วัน ค่าเพี้ยนหนักกว่าเดิมครับ
เพี้ยงทั้ง temp และpower

ขอดูรูปการต่อใช้งานจริงหน่อยครับ สายสัญญาณ ยาวไหม ใช้สายเปลือย หรือ สายแบบShield และ Power Supply ที่จ่ายให้ Node เป็นแบบไหนครับ

ลองใส่ C Ceramic Filter ขนาด 0.1uf Bypass Noise ลง GND. ทุกขา

ลองปรับ Time การเรียกอ่านข้อมูล Temp จาก 2000L => 5000L หน่อยครับ

Code Reset ทำอะไรครับ ไม่เห็น นำไปใช้งานตรงไหน

การต่อใช้งานครับ

หมายถึง รูป ขณะ ต่อใช้งานจริงครับ

ตั้งแต่ผมเริ่มใช้งานมา คือต่อตามรูปเลยครับ โดยมีโหลด ตู้เย็น ไมโครเวฟ เครื่องซักผ้า ครับ