#include <PZEM004Tv30.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
/*******************************************************
power monitor usando PZEM004 modulo provisto por
diego de munro. GRACIAS DIEGOOO.
inicialmente solo vamos a mostrar stats en el
display 16x2
luego vamos a agregar (usando SoftSerial) un segundo
puerto por software para enviar la data a la PC
y asi poder mostrar, al igual que con el tester
el consumo en pantalla.
La parte de enviar a la PC aun no la hice, eso va despues
Ports:
display RS = 8
display CE = 9
DISPLAY DATA = 4,5,6,7 a DB4-DB7 respectivamente
R/W va a MASA
HW serial = 0 - RX, 1 - TX (hardware)(por aca se envia a la PC)
SW serial = 11, 12 (por aca se lee el modulo PZEM) 11 a TX, 12 a RX
********************************************************/
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SoftwareSerial pzemSWSerial(11, 12);
PZEM004Tv30 pzem;
// other vars
int clearcount = 0;
void setup() {
//
pinMode(13, OUTPUT);
//
// Serial.begin(115200);
pzemSWSerial.begin(9600);
pzem = PZEM004Tv30(pzemSWSerial);
// PZEM004Tv30 pzem(pzemSWSerial);
//
lcd.begin(16, 2); // start the library
lcd.setCursor(0, 0);
lcd.print(" David Lightman "); // print a simple message
delay(100);
lcd.setCursor(0, 1);
lcd.print(" power monitor ");
delay(4000);
lcd.clear();
// display ready.
}
void loop() {
// main code
if ( clearcount >= 80) {
clearcount =0;
//lcd.clear();
lcd.setCursor(2,0);
lcd.print(" ");
lcd.setCursor(2,1);
lcd.print(" ");
//Esto limpia cada unos 5 segundos volts y watts
//es una solucion temporaria para limpiar el problema
//de que se mueven los digitos
//la realidad es que hay usar un ESP y listo, en el ESP
//si funciona sprintf %f y listo!
};
clearcount++;
float voltage = pzem.voltage();
float current = pzem.current();
float power = pzem.power();
float pf = pzem.pf();
digitalWrite(13, HIGH);
lcd.setCursor(0, 0);
lcd.print("V: ");
lcd.setCursor(3,0);
lcd.print(int(voltage));
lcd.setCursor(9,0);
lcd.print("A: ");
lcd.setCursor(11,0);
lcd.print(current);
// linea 2
lcd.setCursor(0,1);
lcd.print("W: ");
lcd.setCursor(3,1);
lcd.print(int(power));
lcd.setCursor(8,1);
lcd.print("pf: ");
lcd.setCursor(11,1);
lcd.print(pf);
//
digitalWrite(13, LOW);
delay(100);
}