#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
byte phiChar[] = { B00000,B00110,B10101,B10101,B10101,B01110,B00100,B00100}; // LCD custom character for power factor "cos(φ)" symbol
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();
lcd.createChar(1, phiChar); // Add "φ" phi custom character to LCD position number 1
// display ready.
}
void loop() {
// main code
float voltage = pzem.voltage();
float current = pzem.current();
float power = pzem.power();
float pf = pzem.pf();
char buffer[8] = {0};
digitalWrite(13, HIGH);
// linea 1
lcd.setCursor(0, 0);
lcd.print("V: ");
dtostrf(voltage, 5, 1, buffer); // "123.4" // 5 chars, 1 decimal point
lcd.print(buffer);
lcd.setCursor(9,0);
lcd.print("A: ");
if (current < 10 ) {
dtostrf(current, 4, 2, buffer); // "9.99" // 4 chars, 2 decimal point
}else if (current< 100) {
dtostrf(current, 4, 1, buffer); // "99.9" // 4 chars, 1 decimal point
}else{
dtostrf(current, 4, 0, buffer); // " 999" // 4 chars, 0 decimal point
}
lcd.print(buffer);
// linea 2
lcd.setCursor(0,1);
lcd.print("W: ");
if (power < 1000 ){
dtostrf(power, 5, 1, buffer); // "999.9" // 5 chars, 1 decimal point
}else{
dtostrf(power, 5, 0, buffer); // "99999" // 5 chars, 0 decimal point
}
lcd.print(buffer);
lcd.setCursor(9,1);
lcd.print("\1: "); // \1 -> "φ" phi custom character
dtostrf(pf, 4, 2, buffer); // "0.99" // 4 chars, 2 decimal point
lcd.print(buffer);
//
digitalWrite(13, LOW);
delay(100);
}