#define BLYNK_PRINT Serial
#include <Wire.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <PZEM004Tv30.h>
#include <ESP_Line_Notify.h>
#define BLYNK_TEMPLATE_ID "TMPL6VKRhCnLI"
#define BLYNK_TEMPLATE_NAME "CPE122 SmartPlug"
#define BLYNK_AUTH_TOKEN "zkE9TcG1_gf2HoUzKsma3NpP2tESJeyA"
char auth[] = "zkE9TcG1_gf2HoUzKsma3NpP2tESJeyA";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
/* Define the LineNotifyClient object */
LineNotifyClient line;
/* Function to print the sending result via Serial (optional) */
void printRessult(LineNotifySendingResult result);
/* The sending callback function (optional) */
void sendingCallback(LineNotifySendingResult result);
#if !defined(PZEM_RX_PIN) && !defined(PZEM_TX_PIN)
#define PZEM_RX_PIN 16
#define PZEM_TX_PIN 17
#endif
#if !defined(PZEM_SERIAL)
#define PZEM_SERIAL Serial2
#endif
#if defined(ESP32)
/*************************
* ESP32 initialization
* ---------------------
*
* The ESP32 HW Serial interface can be routed to any GPIO pin
* Here we initialize the PZEM on Serial2 with RX/TX pins 16 and 17
*/
PZEM004Tv30 pzem(PZEM_SERIAL, PZEM_RX_PIN, PZEM_TX_PIN);
#elif defined(ESP8266)
/*************************
* ESP8266 initialization
* ---------------------
*
* Not all Arduino boards come with multiple HW Serial ports.
* Serial2 is for example available on the Arduino MEGA 2560 but not Arduino Uno!
* The ESP32 HW Serial interface can be routed to any GPIO pin
* Here we initialize the PZEM on Serial2 with default pins
*/
//PZEM004Tv30 pzem(Serial1);
#else
/*************************
* Arduino initialization
* ---------------------
*
* Not all Arduino boards come with multiple HW Serial ports.
* Serial2 is for example available on the Arduino MEGA 2560 but not Arduino Uno!
* The ESP32 HW Serial interface can be routed to any GPIO pin
* Here we initialize the PZEM on Serial2 with default pins
*/
PZEM004Tv30 pzem(PZEM_SERIAL);
#endif
BlynkTimer timer;
// This function is called every time the Virtual Pin 0 state changes
// BLYNK_WRITE(V1)
// {
// // Set incoming value from pin V0 to a variable
// int value = param.asInt();
// //Serial.println("value Red : "+ String(value));
// if(value)
// {
// digitalWrite(25,HIGH); // ส่งให้ไฟติด
// }
// else
// {
// digitalWrite(25,LOW); // ส่งให้ไฟดับ
// }
// }
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
// Serial.println("Hello, ESP32!");
Blynk.begin(auth, ssid, pass);
pinMode(25, OUTPUT);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(200);
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
line.reconnect_wifi = true;
Serial.println("Test Line notify with new library...");
line.token = "olw1CGnsDUCxHDZL5HDGd7hkrxJT1SoeizKqpYablzG";
//line.message = "I love beem ";
LineNotifySendingResult result = LineNotify.send(line);
// Print the sending result
printRessult(result);
}
void loop() {
Blynk.run();
timer.run();
// put your main code here, to run repeatedly:
delay(100); // this speeds up the simulation // ดีเลย์ 1000ms
// Print the custom address of the PZEM
Serial.print("Custom Address:");
Serial.println(pzem.readAddress(), HEX);
// Read the data from the sensor
float voltage = pzem.voltage();
if(isnan(voltage))
{
Serial.println("Error reading voltage");
line.message = "Error reading voltage";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
else
{
Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V");
line.message = "Voltage: "; (voltage); "V";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
float current = pzem.current();
if (isnan(current))
{
Serial.println("Error reading current");
line.message = "Error reading current";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
else
{
Serial.print("Current: "); Serial.print(current); Serial.println("A");
line.message = "Current: (current) A";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
float power = pzem.power();
if (isnan(power))
{
Serial.println("Error reading power");
line.message = "Error reading power";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
else
{
Serial.print("Power: "); Serial.print(power); Serial.println("W");
line.message = "Power:"; (power); "W";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
float energy = pzem.energy();
if (isnan(energy))
{
Serial.println("Error reading energy");
line.message = "Error reading energy";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
else
{
Serial.print("Energy: "); Serial.print(energy,3); Serial.println("kWh");
line.message = "Energy: "; (energy,3); "kWh";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
float frequency = pzem.frequency();
if (isnan(frequency))
{
Serial.println("Error reading frequency");
line.message = "Error reading frequency";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
else
{
Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz");
line.message = "Frequency: "; (frequency, 1); "A";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
float pf = pzem.pf();
if (isnan(pf))
{
Serial.println("Error reading power factor");
line.message = "Error reading power factor";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
else
{
Serial.print("PF: "); Serial.println(pf);
line.message = "PF: "; (pf); "A";
LineNotifySendingResult result = LineNotify.send(line);
delay(100);
}
Serial.println();
}
// BLYNK_WRITE(V1)
// {
// // Set incoming value from pin V0 to a variable
// int value = param.asInt();
// //Serial.println("value Red : "+ String(value));
// if(value)
// {
// digitalWrite(25,HIGH); // ส่งให้ไฟติด
// }
// else
// {
// digitalWrite(25,LOW); // ส่งให้ไฟดับ
// }
// }
/* Function to print the sending result via Serial */
void printRessult(LineNotifySendingResult result)
{
if (result.status == LineNotify_Sending_Success)
{
Serial.printf("Status: %s\n", "success");
Serial.printf("Text limit: %d\n", result.quota.text.limit);
Serial.printf("Text remaining: %d\n", result.quota.text.remaining);
Serial.printf("Image limit: %d\n", result.quota.image.limit);
Serial.printf("Image remaining: %d\n", result.quota.image.remaining);
Serial.printf("Reset: %d\n", result.quota.reset);
}
else if (result.status == LineNotify_Sending_Error)
{
Serial.printf("Status: %s\n", "error");
Serial.printf("error code: %d\n", result.error.code);
Serial.printf("error msg: %s\n", result.error.message.c_str());
}
}
/* The sending callback function (optional) */
void sendingCallback(LineNotifySendingResult result)
{
if (result.status == LineNotify_Sending_Begin)
{
Serial.println("Sending begin");
}
else if (result.status == LineNotify_Sending_Upload)
{
Serial.printf("Uploaded %s, %d%s\n", result.file_name.c_str(), (int)result.progress, "%");
}
else if (result.status == LineNotify_Sending_Success)
{
Serial.println("Sending success\n\n");
Serial.printf("Text limit: %d\n", result.quota.text.limit);
Serial.printf("Text remaining: %d\n", result.quota.text.remaining);
Serial.printf("Image limit: %d\n", result.quota.image.limit);
Serial.printf("Image remaining: %d\n", result.quota.image.remaining);
Serial.printf("Reset: %d\n", result.quota.reset);
}
else if (result.status == LineNotify_Sending_Error)
{
Serial.println("Sending failed\n\n");
Serial.printf("error code: %d\n", result.error.code);
Serial.printf("error msg: %s\n", result.error.message.c_str());
}
}