//int x = random(200, 500);
#include <WiFi.h>
#include <DHT.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include <PZEM004Tv30.h>
LiquidCrystal_I2C lcd(0x27, 22, 21);
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#define Pir_in 16
#define Pir_out 17
#define in 25
#define out 4
#define Relay_pin 33
int count=0;
PZEM004Tv30 pzem(Serial2, Pir_in, Pir_out);
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "demo.thingsboard.io";
const char* token = "PUU6BK0NDyviSOoG3QwU";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi(){
delay(10);
Serial.println();
Serial.print("Wifi connected");
Serial.println(ssid);
WiFi.begin(ssid,password);
while (WiFi.status()!= WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Wifi connected");
Serial.println("IP address:");
Serial.println(WiFi.localIP());
}
void connectToMQTT() {
while(!client.connected()){
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32_DHT11",token, NULL)){
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println("try again in 5 seconds");
delay(5000);
}
}
}
void sendRelayStatus(bool status){
String payload="{\"relay_status\":\"";
payload+=status;
payload+="\"}";
if(client.publish("v1/devices/me/telemetry",payload.c_str())){
Serial.print("Status sent: ");
Serial.println(status);
}
else{
Serial.println("Failed to send realy status");
}
}
void setup(){
Serial.begin(115200);
pinMode(Relay_pin,OUTPUT);
digitalWrite(Relay_pin,LOW);
PZEM004Tv30 pzem(Serial2,Pir_in,Pir_out);
dht.begin();
lcd.init(); // initialize the lcd
lcd.backlight();
delay(1000);
pinMode(in,INPUT);
pinMode(out,INPUT);
digitalWrite(Relay_pin,LOW);
Serial.println();
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void loop(){
if(!client.connected()){
connectToMQTT();
}
client.loop();
Serial.print("Custom Address: ");
Serial.println(pzem.readAddress(), HEX);
int in_value=digitalRead(in);
int out_value=digitalRead(out);
float voltage = random(220,240);
float current = random(5,15);
float energy = random(8,10);
float frequency = random(49.5,50);
float pf = random(0.8,0.95);
if (isnan(voltage)|| isnan(current)||isnan(energy)||isnan(frequency)||isnan(pf)){
Serial.println("failed to read from pzem004t sensor!");
delay(1000);
return;
}
String payload = "{\"voltage\":";
payload += voltage;
payload += ", \"current\":";
payload += current;
payload += ", \"power\":";
payload += energy;
payload += ", \"frequency\":";
payload += frequency;
payload += ", \"pf\":";
payload += pf;
payload += "}";
Serial.print("Sending payload:");
Serial.println(payload);
client.publish("v1/devices/me/telemetry", payload.c_str());
delay(5000);
if(in_value==HIGH){
Serial.println("Motion Detected (Entry)");
count++;
Serial.println("Person in the Room:");
Serial.println(count);
delay(100);
}
if(out_value==HIGH){
Serial.println("Motion Detected (Exit)");
count--;
delay(100);
}
if(count<=0){
digitalWrite(Relay_pin, LOW);
sendRelayStatus(false);
Serial.println("Nobody In Room");
Serial.println("Light is off");
delay(200);
Serial.println("Relay is OFF");
}
else{
digitalWrite(Relay_pin,HIGH);
sendRelayStatus(true);
Serial.println("Relay is ON");
}
if(isnan(voltage)){
lcd.setCursor(0, 0);
lcd.print("VOLTAGE read error!");
delay(3500);
lcd.clear();
} else if (isnan(current)) {
lcd.setCursor(0, 0);
lcd.print("CURRENT read error!");
delay(3500);
lcd.clear();
} else if (isnan(energy)) {
lcd.setCursor(0, 0);
lcd.print("ENERGY read error!");
delay(3500);
lcd.clear();
} else if (isnan(frequency)) {
lcd.setCursor(0, 0);
lcd.print("FREQ read error!");
delay(3500);
lcd.clear();
} else if (isnan(pf)) {
lcd.setCursor(0, 0);
lcd.print("PF read error!");
delay(3500);
lcd.clear();
} else {
lcd.setCursor(0, 0);
lcd.print("Voltage: ");
lcd.print(voltage);
lcd.print("V");
lcd.setCursor(0, 1);
lcd.print("Current: ");
lcd.print(current);
lcd.print("A");
lcd.setCursor(0, 2);
lcd.print("W");
lcd.setCursor(0, 3);
lcd.print("Energy: ");
lcd.print(energy);
lcd.print("kWh");
delay(3500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Frequency: ");
lcd.print(frequency);
lcd.print("Hz");
lcd.setCursor(0, 1);
lcd.print("PF: ");
lcd.print(pf);
delay(3500);
lcd.clear();
}
}