Sensor PZEM 016
Sensor PZEM 016 adalah sensor Listrik AC dengan parameter output, Energy, Power, Tegangan, Arus, Power Factor dan frekuensi dan semua parameter ini bisa di ambil dengan menggunakan Protocol Modbus RTU.
Sensor ini bisa dikakan sensor yang friendly, mudah di gunakan, karena menggunakan casing yang tertutup rapat. Menggunakan terminal sebagai wiring connector nya kemudian menggunakan protocol modbus.
Karena sensor ini menggunakan protocol Modbus RTU. Maka cukup menggunakan satu controller saja untuk membaca 5 sampai 10 sensor PZEM. Jadi design panel kita untuk monitoring jauh lebih ringkas dan Mudah. Teman-teman bisa menggunakan modul Converter modbus kita. Seperti gambar yang ada di bawah ini.
Membaca Sensor PZEM-016
Bagaimana kah tahapan membaca Sensor pzem 016 dengan modul converter modbus kita? Cara nya adalah sebagai berikut.
Add Library modbusmaster
Pertama download dulu library modbus master di link github berikut ini, cukup click button di bawah ini.
Cara download library nya bisa di lihat pada gambar di bawah ini.
Kemudian add library Arduino nya ke Arduino IDE teman-teman. Saya harap untuk menambah library teman-teman sudah paham cara nya, atau click link di bawah ini.
Wiring Modul Modbus dengan Sensor PZEM-016
Setelah di add, maka langkah selanjut nya adalah wiring Sensor PZEM-016 dengan Modul Modbus converter. Cara nya cukup mudah, tinggal sesuaikan dengan gambar yang ada di bawah ini,
Pastikan wiring teman-teman tidak salah, terutama di bagian Wiring Cable Tegangan PLN nya. Dan perhatikan keselamatan kerja untuk instalasi ini.
Pilih Board Generic ESP8266 dev. ( Jika board belum di tambah di Arduino IDE bisa click link ini, menambah board ESP8266 di Arduino IDE ), setelah itu pilih board seperti gambar di bawah ini
Program Arduino Membaca PZEM
#include <ModbusMaster.h>
ModbusMaster node;
static uint8_t pzemSlaveAddr = 1;
#include <SoftwareSerial.h>
SoftwareSerial pzemSerial(13, 14);
#define MAX485_DE 12
#define MAX485_RE_NEG 12
float voltage, current, power, energy, freq, pf;
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup() {
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
pzemSerial.begin(9600);
Serial.begin(115200);
node.begin(pzemSlaveAddr, pzemSerial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop() {
uint8_t result;
result = node.readInputRegisters(0, 9); //read the 9 registers of the PZEM-014 / 016
if (result == node.ku8MBSuccess)
{
Serial.println("sukses modbus");
voltage = node.getResponseBuffer(0) / 10.0;
uint32_t tempdouble = 0x00000000;
tempdouble = node.getResponseBuffer(1); //LowByte
tempdouble |= node.getResponseBuffer(2) << 8; //highByte
current = tempdouble / 1000.0;
tempdouble |= node.getResponseBuffer(3); //LowByte
tempdouble |= node.getResponseBuffer(4) << 8; //highByte
power = tempdouble / 10.0;
tempdouble = node.getResponseBuffer(5); //LowByte
tempdouble |= node.getResponseBuffer(6) << 8; //highByte
energy = tempdouble;
tempdouble = node.getResponseBuffer(7);
freq = tempdouble / 10.0;
tempdouble = node.getResponseBuffer(8);
pf = tempdouble / 10.0;
print_data();
} else {
Serial.println("Failed to read modbus");
}
delay(2000);
}
void print_data() {
Serial.print(voltage);
Serial.print("V ");
Serial.print(current);
Serial.print("A ");
Serial.print(freq);
Serial.print("Hz ");
Serial.print(pf);
Serial.print("pf ");
Serial.print(" ");
Serial.print(power);
Serial.print("W ");
Serial.print(energy);
Serial.print("Wh ");
Serial.println();
}
Upload program di atas dan perhatikan di serial monitor.
Penjelasan Program
#include <ModbusMaster.h>
ModbusMaster node;
static uint8_t pzemSlaveAddr = 1;
#include <SoftwareSerial.h>
SoftwareSerial pzemSerial(13, 14);
#define MAX485_DE 12
#define MAX485_RE_NEG 12
Hal yang paling penting ada configurasi di atas. Alamat default sensor PZEM-016 adalah 0x01. Alamat ini bisa di rubah-rubah ( tutorial nya menyusul ). Kemudian GPIO13 dan GPIO14 kita gunakan sebagai pin untuk membaca data out dari sensor PZEM nya. kemudian pin GPIO12 di gunakan sebagai PIN EN control Chip MAX3485 nya.
- RXD PIN GPIO13
- TXD PIN GPIO14
- EN PIN GPIO12
- Baud Rate 9600
- Default Address, 0x01
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
pzemSerial.begin(9600);
Serial.begin(115200);
GPIO12 di gunakan sebagai Output Untuk Control PIN Enable MAX3485, sementara baudrate Transaksi data ada di 9600
node.begin(pzemSlaveAddr, pzemSerial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
Sebagai fungsi modbus protokol, Fungsi untuk proses request dan proses get data modbus dari sensor nya.
uint8_t result;
result = node.readInputRegisters(0, 9); //read the 9 registers of the PZEM-014 / 016
Nah pada fungsi ini adalah untuk membaca panjang register modbus data yang di terima dari sensor PZEM-016. disini kita membaca dari address 0 sampai addres 9.
Menurut datasheet address list sensor PZEM adalah sebagai berikut.
RegAddr Description Resolution
0x0000 Voltage value 1LSB correspond to 0.1V
0x0001 Current value low 16 bits 1LSB correspond to 0.001A
0x0002 Current value high 16 bits
0x0003 Power value low 16 bits 1LSB correspond to 0.1W
0x0004 Power value high 16 bits
0x0005 Energy value low 16 bits 1LSB correspond to 1Wh
0x0006 Energy value high 16 bits
0x0007 Frequency value 1LSB correspond to 0.1Hz
0x0008 Power factor value 1LSB correspond to 0.01
0x0009 Alarm status 0xFFFF is alarm,0x0000is not alarm
voltage Value ada di register 0, Arus ada di address 1, dan seterus nya. Untuk membaca nya dengan program Arduino adalah sebagai berikut
uint8_t result;
result = node.readInputRegisters(0, 9); //read the 9 registers of the PZEM-014 / 016
if (result == node.ku8MBSuccess)
{
Serial.println("sukses modbus");
voltage = node.getResponseBuffer(0) / 10.0;
uint32_t tempdouble = 0x00000000;
tempdouble = node.getResponseBuffer(1); //LowByte
tempdouble |= node.getResponseBuffer(2) << 8; //highByte
current = tempdouble / 1000.0;
tempdouble |= node.getResponseBuffer(3); //LowByte
tempdouble |= node.getResponseBuffer(4) << 8; //highByte
power = tempdouble / 10.0;
tempdouble = node.getResponseBuffer(5); //LowByte
tempdouble |= node.getResponseBuffer(6) << 8; //highByte
energy = tempdouble;
tempdouble = node.getResponseBuffer(7);
freq = tempdouble / 10.0;
tempdouble = node.getResponseBuffer(8);
pf = tempdouble / 10.0;
print_data();
} else {
Serial.println("Failed to read modbus");
}
Semoga teman-teman paham yah? atau jika ada pertanyaan bisa click link button di bawah ini,
Sekian dulu tulisan sederhana kita ini, dan akan kita lanjut ke Tutorial berikut nya tentang sensor pzem-016
Sumber: Read sensor PZEM-016 with Arduino
Thanks