Tutorial PZEM-004T dengan LCD menggunakan Arduino Uno, Arduino Mega, dan ESP32
Pengertian PZEM-004T
PZEM-004T adalah modul sensor berbasis mikrokontroler yang dirancang untuk mengukur parameter kelistrikan pada beban AC, seperti:
- Tegangan (Voltage)
- Arus (Current)
- Daya aktif (Active Power)
- Energi (Energy)
- Faktor daya (Power Factor)
- Frekuensi (Frequency) (khusus versi V3)
Sensor ini populer untuk sistem monitoring listrik berbasis Arduino, ESP32, Raspberry Pi, dan sistem otomasi lainnya.
Prinsip Kerja PZEM-004T
PZEM-004T bekerja dengan cara:
- Tegangan diukur secara langsung dari jalur listrik AC yang terhubung ke modul.
- Arus diukur menggunakan sensor CT (Current Transformer) yang dipasang melingkar pada kabel fasa (fase).
- Menggunakan mikrokontroler internal, modul ini menghitung daya dan energi berdasarkan tegangan dan arus.
- Data dikirim secara digital ke mikrokontroler (Arduino/ESP) melalui komunikasi software serial ataupun hardware serial.
Spesifikasi Teknis PZEM-004T (Umum)
| Parameter | Nilai |
|---|---|
| Tegangan Input | 80 – 260V AC |
| Arus Maksimum | 100A (dengan CT bawaan) |
| Tegangan Operasi | 5V DC |
| Komunikasi | RS485 (Modbus RTU) |
| Akurasi Pengukuran | ±0.5–1% |
| Frekuensi | 45 – 65 Hz |
| Daya & Energi | Real Power (Watt), Energy (kWh) |
| Ukuran Modul | ± 50mm x 25mm |
| Port Tegangan | Terminal sekrup (AC in) |
| Sensor Arus | CT Clamp |
Kegunaan PZEM-004T
- Monitoring Listrik Rumah Tangga
- Sistem Energi Terbarukan (PLTS)
- Memantau output daya dari inverter atau beban.
- Industri & Otomasi
- Mengetahui performa dan efisiensi mesin.
- Proyek IoT
- Digunakan dengan ESP32 + WiFi untuk kirim data ke Blynk, Telegram, Thingspeak, dll
Kelebihan PZEM-004T
- Mampu Ukur Banyak Parameter
- Tegangan, arus, daya, energi, frekuensi, dan faktor daya.
- Kompatibel dengan Mikrokontroler
- Bisa dipakai dengan Arduino, ESP32, Raspberry Pi.
- Mudah Digunakan
- Ada library Arduino siap pakai.
- Akurasi Cukup Tinggi
- Cukup akurat untuk penggunaan non-komersial.
- Isolasi Aman
- CT clamp menjaga pemisahan antara beban dan mikrokontroler.
- Protokol RS485 (V3)
- Bisa digunakan dalam jaringan sensor panjang (multi-node).
Kekurangan PZEM-004T
- Tidak Bisa Ukur Daya Reaktif
- Hanya mengukur daya aktif (Watt), bukan VAR
- Tidak Cocok untuk DC
- Hanya untuk sistem listrik AC, untuk sistem DC terdapat PZEM dengan seri lainnya.
- Tegangan Langsung ke Modul
- Perlu kehati-hatian karena terhubung ke listrik 220V AC.
Contoh Penerapan PZEM-004T
1. Smart Energy Monitoring Rumah
- Arduino/ESP32 membaca data dari PZEM-004T
- Data ditampilkan di LCD I2C atau dikirim ke aplikasi Blynk
- Notifikasi Telegram jika pemakaian listrik tinggi
2. Sistem Monitoring PLTS (Solar)
- Memantau arus & daya AC dari inverter
- Deteksi ketika sistem tidak menghasilkan daya maksimal
3. Monitoring Konsumsi Listrik Mesin
- Mengetahui berapa daya dan energi yang digunakan oleh mesin industri
- Analisis efisiensi mesin atau pompa air
Wiring Diagram PZEM-004T Arduino MEGA

| Fungsi | Pin PZEM-004T V3 | Pin Arduino Mega 2560 | Keterangan |
|---|---|---|---|
| Tegangan positif modul | VCC | 5V | Memberikan daya 5V ke modul |
| Ground | GND | GND | Ground (harus satu ground antara Arduino dan PZEM) |
| Komunikasi Data RX (input modul) | RX | Pin TX Arduino ( TX2 = pin 16 ) | Arduino kirim data ke PZEM |
| Komunikasi Data TX (output modul) | TX | Pin RX Arduino ( RX2 = pin 17 ) | Arduino terima data dari PZEM |
#include <PZEM004Tv30.h>
#include <SoftwareSerial.h> // Tidak digunakan di Mega, hanya untuk info
// Gunakan Serial2 (pin 16 = TX2, pin 17 = RX2)
PZEM004Tv30 pzem(&Serial2);
void setup() {
Serial.begin(9600); // Untuk monitor Serial di PC
Serial2.begin(9600); // Untuk komunikasi ke PZEM-004T V3
delay(1000);
Serial.println("Monitoring PZEM-004T V3 dengan Arduino Mega (Serial2)");
IPAddress ip = pzem.getAddress();
Serial.print("PZEM Alamat IP: "); Serial.println(ip);
}
void loop() {
float voltage = pzem.voltage();
float current = pzem.current();
float power = pzem.power();
float energy = pzem.energy();
float frequency = pzem.frequency();
float pf = pzem.pf();
if (isnan(voltage)) {
Serial.println("Gagal membaca data dari PZEM-004T.");
} else {
Serial.print("Tegangan : "); Serial.print(voltage); Serial.println(" V");
Serial.print("Arus : "); Serial.print(current); Serial.println(" A");
Serial.print("Daya : "); Serial.print(power); Serial.println(" W");
Serial.print("Energi : "); Serial.print(energy); Serial.println(" Wh");
Serial.print("Frekuensi : "); Serial.print(frequency); Serial.println(" Hz");
Serial.print("Faktor Daya: "); Serial.println(pf);
Serial.println("------------------------------------");
}
delay(2000);
}
Wiring Diagram PZEM-004T ESP32

| Fungsi | Pin PZEM-004T V3 | Pin ESP32 | Keterangan |
|---|---|---|---|
| Tegangan positif modul | VCC | 5V | Memberikan daya 5V ke modul |
| Ground | GND | GND | Ground |
| Komunikasi Data RX (input modul) | RX | Pin TX2 ESP32 | ESP32 kirim data ke PZEM |
| Komunikasi Data TX (output modul) | TX | Pin RX2 ESP32 | ESP32 terima data dari PZEM |
#include <PZEM004Tv30.h>
#include <HardwareSerial.h>
// Gunakan Serial2 (UART2) pada ESP32, TX=17, RX=16
HardwareSerial pzemSerial(2);
// Inisialisasi objek PZEM pada pin TX=17, RX=16
PZEM004Tv30 pzem(pzemSerial, 16, 17); // RX, TX
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("PZEM-004T V3 Monitoring Dimulai");
// Tidak wajib, tapi bisa dicek alamat modul:
IPAddress ip = pzem.getAddress();
Serial.print("PZEM Address: "); Serial.println(ip);
}
void loop() {
float voltage = pzem.voltage();
float current = pzem.current();
float power = pzem.power();
float energy = pzem.energy();
float frequency = pzem.frequency();
float pf = pzem.pf();
if (isnan(voltage)) {
Serial.println("Gagal membaca data dari PZEM-004T.");
} else {
Serial.print("Tegangan: "); Serial.print(voltage); Serial.println(" V");
Serial.print("Arus : "); Serial.print(current); Serial.println(" A");
Serial.print("Daya : "); Serial.print(power); Serial.println(" W");
Serial.print("Energi : "); Serial.print(energy); Serial.println(" Wh");
Serial.print("Frekuensi: "); Serial.print(frequency); Serial.println(" Hz");
Serial.print("Power Factor: "); Serial.println(pf);
Serial.println("-----------------------------");
}
delay(2000); // Baca setiap 2 detik
}
Wiring Diagram PZEM-004T Arduino UNO

| Fungsi | Pin PZEM-004T V3 | Pin Arduino Uno | Keterangan |
|---|---|---|---|
| Tegangan positif modul | VCC | 5V | Memberikan daya 5V ke modul |
| Ground | GND | GND | Ground |
| Komunikasi Data RX (input modul) | RX | Pin 9 | Arduino Uno kirim data ke PZEM |
| Komunikasi Data TX (output modul) | TX | Pin 8 | Arduino Uno terima data dari PZEM |
#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);
}
