//HMP-testing
// int Voltage_threshold = 1000;
int Frequency_threshold_min = 48;
int Frequency_threshold_max = 52;
int voltage_min = 412;
int voltage_max = 420;
// voltage >= Frequency_threshold_min && voltage <= Frequency_threshold_max
/*
* Pin Connection
*
* PZEM004T ESP8266 ESP32
* 5V 5V 5V
* GND GND GND
* RX D6 27
* TX D5 26
*
* DHT11 ESP8266 ESP32
* signal-pin D4 D15
*
* Relay Board ESP8266 ESP32
* channel-1 D1 GPIO-21
* channel-2 D2 GPIO-19
* channel-3 D5 GPIO-18
* channel-4 D6 GPIO-4
*/
// Define the Sensor serial port pins
#define PZEM_RX_PIN 27
#define PZEM_TX_PIN 26
//#define CAYENNE_DEBUG
#define CAYENNE_PRINT Serial
//if your have esp8266 then uncomment below line
//#include <CayenneMQTTESP8266.h>
//if your have esp32 then uncomment below line
#include <CayenneMQTTESP32.h>
//---------------------------------
#include <HardwareSerial.h>
#include <PZEM004Tv30.h>
#include <Wire.h>
// for esp32 - Software Serial pin 27 (RX) & 26 (TX)
HardwareSerial pzemSerial(2); // Define the hardware serial port to use
// Create the PZEM004Tv30 instance using the hardware serial port
PZEM004Tv30 pzem(&pzemSerial, PZEM_RX_PIN, PZEM_TX_PIN);
//---------------------------------
#include <DHT.h>
//#define DHTPIN D4 // for esp8266
#define DHTPIN 15 // for esp32
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// WiFi network info.
char ssid[] = "MAHAKAL";
char wifiPassword[] = "sateri456";
// Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
char username[] = "e42ca720-da94-11ed-8485-5b7d3ef089d0";
char password[] = "d506a9932e50c8d6cfd02755888422763687e900";
char clientID[] = "21da4280-dbbc-11ed-8485-5b7d3ef089d0";
//Pin Declaration
//pin for ESP8266
//#define pin1_channel D1
//#define pin2_channel D2
//#define pin3_channel D5
//#define pin4_channel D6
//pin for ESP32
int pin1_channel = 21;
int pin2_channel = 19;
int pin3_channel = 18;
int pin4_channel = 4;
int RelayBoard = 1;
//==========================================================================
void setup() {Serial.begin(115200);Cayenne.begin(username, password, clientID, ssid, wifiPassword);
pinMode(pin1_channel, OUTPUT);
pinMode(pin2_channel, OUTPUT);
pinMode(pin3_channel, OUTPUT);
pinMode(pin4_channel, OUTPUT);
pzemSerial.begin(9600, SERIAL_8N1, PZEM_RX_PIN, PZEM_TX_PIN);
}
//==========================================================================
void loop() {Cayenne.loop();}
//==========================================================================
CAYENNE_OUT_DEFAULT(){
float TempData = dht.readTemperature();
float HumData = dht.readHumidity();
//-------------------------------------------------------------------------------------------
float voltage = pzem.voltage();
if (voltage != NAN) {Serial.print("Voltage: ");Serial.print(voltage);Serial.println("V");}
else {Serial.println("Error reading voltage");}
float current = pzem.current();
if (current != NAN) {Serial.print("Current: ");Serial.print(current);Serial.println("A");}
else {Serial.println("Error reading current");}
float power = pzem.power();
if (current != NAN) {Serial.print("Power: ");Serial.print(power);Serial.println("W");}
else {Serial.println("Error reading power");}
float energy = pzem.energy();
if (current != NAN) {Serial.print("Energy: ");Serial.print(energy, 3);Serial.println("kWh");}
else {Serial.println("Error reading energy");}
float frequency = pzem.frequency();
if (current != NAN) {Serial.print("Frequency: ");Serial.print(frequency, 1);Serial.println("Hz");}
else {Serial.println("Error reading frequency");}
float pf = pzem.pf();
if (current != NAN) {Serial.print("PF: ");Serial.println(pf);}
else {Serial.println("Error reading power factor");}
Serial.println();
delay(2000);
//-------------------------------------------------------------------------------------------
//Testing Data:
// float voltage = random(1000, 2000); // 1000V to 2000V
// float current = random(1, 30); // 1A to 30A
// float power = random(100, 200); // 100W to 20W
// float energy = random(1, 200); // 1kWh to 200kWh
// float frequency = random(100, 270); // 100Hz to 270Hz
// float pf = random(100, 200); // 1pF to 200pF - (power factor)
//-------------------------------------------------------------------------------------------
//Controls:
/*
* Control Condition:
*
* when voltage get above Voltage_threshold (eg: Voltage_threshold= 1000)
* OR TempData is above 31 degree:
*
* then all relay will turn OFF
* Otherwise all relay will turn ON and do their work
*
*
*/
if (voltage >= voltage_min && voltage <= voltage_max
|| TempData >= 31
|| frequency <= Frequency_threshold_min && frequency >= Frequency_threshold_max
){
// HIGH means Relay "OFF" this is called as Active -Low State
// ALL Relay OFF
digitalWrite(pin1_channel, HIGH);
digitalWrite(pin2_channel, HIGH);
digitalWrite(pin3_channel, HIGH);
digitalWrite(pin4_channel, HIGH);
RelayBoard = 0;
}
else{
// ALL Relay ON
digitalWrite(pin1_channel, LOW);
digitalWrite(pin2_channel, LOW);
digitalWrite(pin3_channel, LOW);
digitalWrite(pin4_channel, LOW);
RelayBoard = 1;
}
//Serial Printing on Monitor - put buadrate as 115200
Serial.print("Temp: "); Serial.print(TempData);
Serial.print(" Hum: "); Serial.print(HumData);Serial.println("");
Serial.print("Voltage: "); Serial.print(voltage);Serial.println("");
Serial.print("Current: "); Serial.print(current);Serial.println("");
Serial.print("Power: "); Serial.print(power);Serial.println("");
Serial.print("Energy: "); Serial.print(energy);Serial.println("");
Serial.print("Frequency: "); Serial.print(frequency);Serial.println("");
Serial.print("Power Factor: "); Serial.print(pf);Serial.println("");
Serial.print("Relay Status: "); Serial.print(RelayBoard);Serial.println("");
Serial.println("----------------------------------------");
//-------------------------------------------------------------------------------------------
// Write data to Cayenne Server
Cayenne.virtualWrite(0, voltage);
Cayenne.virtualWrite(1, current);
Cayenne.virtualWrite(2, power);
Cayenne.virtualWrite(3, energy);
Cayenne.virtualWrite(4, frequency);
Cayenne.virtualWrite(5, pf);
Cayenne.virtualWrite(6, TempData);
Cayenne.virtualWrite(7, HumData);
Cayenne.virtualWrite(8, RelayBoard);
}