PZEM-004T Incorrect Readings, with load on and off

Hi everyone,

I’ve been working on a project using the PZEM-004T module with the default current transform that comes with it, and I’m running into a strange issue. Here’s a quick rundown of what I’m seeing:

  • When I connect a 60W bulb to the circuit, the module gives the following readings:

    • Voltage: 236.60V
    • Current: 0.03A
    • Power: 0.40W
    • Energy: 0.001kWh
    • Frequency: 50.0Hz
    • Power Factor: 0.05
  • The expected current should be around 0.25A for a 60W bulb at 240V, so this reading seems too low.

  • The strange part is that even when I turn off and disconnect the load, the module still reads:

    • Voltage: nanV
    • Current: 0.03A
    • Power: 0.40W
    • Energy: 0.001kWh
    • Frequency: 50.0Hz
    • Power Factor: 0.05

Things I've Checked:

  • The CT is positioned correctly around any one of the load wires.
  • There is no visible damage to the module or the CT.

Has anyone experienced similar issues with low current readings, especially when the load is off? Could this be a faulty CT or a configuration problem? Any suggestions for troubleshooting would be really helpful!

This is my hardware setup, also would like to point out that only 1 led is blinking on the pzem, the one right above the 5v writing, i.e d3 led.

The code I am running is the first code from this website: PZEM Sensor tutorial with Arduino and NodeMCU (miliohm.com)
which is:

#include <PZEM004Tv30.h>
#include <Wire.h>

PZEM004Tv30 pzem(8, 9); // Software Serial pin 8 (RX) & 9 (TX)

void setup() {
  Serial.begin(9600);
}

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

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

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

  float energy = pzem.energy();
  if (current != NAN) {
    Serial.print("Energy: ");
    Serial.print(energy, 3);
    Serial.println("kWh");

  } else {
    Serial.println("Error reading energy");
  }

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

  float pf = pzem.pf();
  if (current != NAN) {
    Serial.print("PF: ");
    Serial.println(pf);
  } else {
    Serial.println("Error reading power factor");
  }

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

This PZEM-004T CT, which appears to be what you have, is claimed to be rated for 100 A maximum.

You can't expect to measure AC currents lower than 1 A with any accuracy, or overall, to accuracy better than 1% of full scale (+/- 1 Ampere), even after calibration.

See this excellent general tutorial on calibrating sensors: Why Calibrate? | Calibrating Sensors | Adafruit Learning System

What you're describing is not unexpected. The device has a minimum current measurement threshold:

  • 0.01A (PZEM-004T-10A)
  • 0.02A (PZEM-004T-100A)

You can find the datasheet here: PZEM-004T V3.0 Datasheet/User Manual.

One workaround is to create a coil from the load wire, with around 50 turns, and place it into the sensing coil. Then, divide your result by 50. I’m not sure if this is physically possible with this particular unit, as I don’t have one to test, but I’ve done it with other sensors, and it’s always been 'spot on.'

What do you mean by placing it into the sensing coil? Can you be a little more clear? Sorry if it’s a stupid question..

How big of a load would you recommend me to use?

To calibrate the sensor, use several known loads, covering as much as possible of the measurement range.

No need to apologize, that’s not a stupid question at all. The sensing coil is the black, round component with red and black leads. One lead from the lamp should pass through it. Simply wind the wire around one side of the coil. Each wrap increases the reading, so 1 wrap = 1x, 3 wraps = 3x, and 10 wraps = 10x. Hope that helps!