#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL3b5Mex25B"
#define BLYNK_TEMPLATE_NAME "EV monitoring and operation testing system"
#define BLYNK_AUTH_TOKEN "vkUIt3y8wvMozavJp-hroQdgh0v8EwLp"
#define NUM_PZEMS 2
#define USAGE2 33
//#define button1 32
#define cled 23
#define led1 26
#define led2 25
#define buzzer 4
#define PZEM_RX_PIN 16
#define PZEM_TX_PIN 17
#define PZEM_SERIAL Serial2
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <PZEM004Tv30.h>
#include <Sim800L.h>
#include <LiquidCrystal_I2C.h>
#include <PZEM004Tv30.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
LiquidCrystal_I2C lcd(0x27,20,4);
Sim800L Sim800L(12, 13); // RX_PIN and TX_PIN
PZEM004Tv30 pzems[NUM_PZEMS];
bool state;
String notification;
String pNumber="0xxxxxxxxx",alert1="USAGE1 DISCONNECTED",alert2="USAGE2 DISCONNECTED";
bool U1State,c1State=LOW,U2State,c2State=LOW;
float power1,power2,maxPower=500;
void setup()
{
lcd.init();
lcd.backlight();
loadingdisplay();
Serial.begin(115200);
delay(500);
Sim800L.begin(4800);
pinMode(USAGE2,OUTPUT);
pinMode(USAGE2,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(cled,OUTPUT);
pinMode(buzzer,OUTPUT);
digitalWrite(buzzer,LOW);
for(int i = 0; i < NUM_PZEMS; i++)
{
pzems[i] = PZEM004Tv30(PZEM_SERIAL, PZEM_RX_PIN, PZEM_TX_PIN, 0x10 + i);
}
Blynk.begin(auth, ssid, pass);
Blynk.virtualWrite(V3,maxPower);
Blynk.virtualWrite(V2,LOW);
Blynk.virtualWrite(V1,LOW);
digitalWrite(cled,HIGH);
}
void loop()
{
Blynk.run();
get_power();
send_update();
if(power1 >= maxPower && c1State==HIGH)
{
Blynk.virtualWrite(V2,LOW);
U1State=LOW;
digitalWrite(led1,LOW);
digitalWrite(USAGE2,LOW);
c1State=LOW;
alert_display(alert1);
//Sim800L.sendSms("077XXXXXXX","ROOM1 DISCONNECTED");
Serial.println("SMS ABOUT"+alert1+" IS SENT");
Alert(3);
}
if(power2 >= maxPower && c2State==HIGH)
{
Blynk.virtualWrite(V1,LOW);
U2State=LOW;
digitalWrite(led2,LOW);
digitalWrite(USAGE2,LOW);
c2State=LOW;
alert_display(alert2);
//Sim800L.sendSms("077XXXXXXX","USAGE2 DISCONNECTED");
Serial.println("SMS ABOUT"+alert2+" IS SENT");
Alert(3);
}
if(power1 < maxPower && U1State==HIGH && c1State==LOW)
{
digitalWrite(led1,HIGH);
digitalWrite(USAGE2,HIGH);
c1State=HIGH;
}
if(power2 < maxPower && U2State==HIGH && c2State==LOW )
{
digitalWrite(led2,HIGH);
digitalWrite(USAGE2,HIGH);
c2State=HIGH;
}
homedisplay();
}
BLYNK_WRITE(V3)
{
int datav3=param.asInt();
if(datav3 != maxPower)
{
maxPower=datav3;
}
}
BLYNK_WRITE(V2)
{
int datav1=param.asInt();
if(datav1==1)
{
U1State=HIGH;
}
else
{
U1State=LOW;
}
}
BLYNK_WRITE(V1)
{
int datav2=param.asInt();
if(datav2==1)
{
U2State=HIGH;
}
else
{
U2State=LOW;
}
}
void get_power()
{
for(int i = 0; i < NUM_PZEMS; i++){
// Print the Address of the PZEM
Serial.print("PZEM ");
Serial.print(i);
Serial.print(" - Address:");
Serial.println(pzems[i].getAddress(), HEX);
Serial.println("===================");
// Read the data from the sensor
float voltage = pzems[i].voltage();
float current = pzems[i].current();
float power = pzems[i].power();
float energy = pzems[i].energy();
float frequency = pzems[i].frequency();
float pf = pzems[i].pf();
// Check if the data is valid
if(isnan(voltage)){
Serial.println("Error reading voltage");
} else if (isnan(current)) {
Serial.println("Error reading current");
} else if (isnan(power)) {
Serial.println("Error reading power");
} else if (isnan(energy)) {
Serial.println("Error reading energy");
} else if (isnan(frequency)) {
Serial.println("Error reading frequency");
} else if (isnan(pf)) {
Serial.println("Error reading power factor");
} else
{
// Print the values to the Serial console
Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V");
Serial.print("Current: "); Serial.print(current); Serial.println("A");
Serial.print("Power: "); Serial.print(power); Serial.println("W");
Serial.print("Energy: "); Serial.print(energy,3); Serial.println("kWh");
Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz");
Serial.print("PF: "); Serial.println(pf);
}
Serial.println("-------------------");
Serial.println();
if(i==0 && !isnan(power))
{
power1=power;
}
if(i==1 && !isnan(power))
{
power2=power;
}
}
//THIS CODE FOR SIMULATION PURPOSE ONLY. COMMENT WHILE UPLOADING
power1=map(analogRead(34),0,4095,0,1000);
power2=map(analogRead(35),0,4095,0,1000);
//END OF SIMULATION CODE
}
void send_update()
{
Blynk.virtualWrite(V0,power1);
Blynk.virtualWrite(V4,power2);
delay(150);
}
void loadingdisplay()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("*BATTERY USAGE*");
lcd.setCursor(0,1);
lcd.print("* MONITORING *");
lcd.setCursor(0,2);
lcd.print(" SYSTEM INITIALIZE ");
lcd.setCursor(0,3);
lcd.print("PLEASE WAIT");
for(int k=11;k<20;k++)
{
lcd.setCursor(k,3);
lcd.print(".");
delay(500);
}
}
void homedisplay()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("-USAGE' POWER USAGE-");
lcd.setCursor(0,1);
lcd.print(" BATTERY HEALTH:");
lcd.setCursor(7,1);
lcd.print(power1,1);
lcd.print("WATT");
lcd.setCursor(0,2);
lcd.print(" USAGE:");
lcd.setCursor(7,2);
lcd.print(power2,1);
lcd.print("WATT");
lcd.setCursor(0,3);
lcd.print("LIMIT:");
lcd.setCursor(6,3);
lcd.print(maxPower);
lcd.print("WATT");
delay(500);
}
void alert_display(String textAlert)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("-POWER USAGE ALERT-");
lcd.setCursor(0,1);
lcd.print("********************");
lcd.setCursor(0,2);
lcd.print("*");
lcd.setCursor(1,2);
lcd.print(textAlert);
lcd.setCursor(19,2);
lcd.print("*");
lcd.setCursor(0,3);
lcd.print("********************");
}
void Alert(uint8_t num)
{
for(num;num>0;num--)
{
digitalWrite(buzzer,HIGH);
delay(750);
digitalWrite(buzzer,LOW);
delay(500);
}
}