multiple
lines
#define BLYNK_TEMPLATE_ID "TMPL63P_V0WTR"
#define BLYNK_TEMPLATE_NAME "Project"
#define BLYNK_AUTH_TOKEN "9uSnn3jgNQrpRBo-nlpnOwZT3bygPQri"
#define BLYNK_FIRMWARE_VERSION "1.10.5"
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TimeLib.h> //Time
#include <WidgetRTC.h> //Time
#include <EEPROM.h>//EEPROM
#include <PZEM004Tv30.h> // <--- https://github.com/mandulaj/PZEM-004T-v30
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
// ข้อมูลเครือข่าย WiFi
char auth[] = "9uSnn3jgNQrpRBo-nlpnOwZT3bygPQri"; // กำหนด Auth Token ของคุณที่ได้จากแอป Blynk
char ssid[] = "test611"; // ชื่อเครือข่าย WiFi
char pass[] = "12345678"; // รหัสผ่านเครือข่าย WiFi
int count = 0;
int count_table = 0;
int v21, v22, Minute, Hour, pin_v24;
float cost_old = 0;
float cost_total = 0;
float cost_today = 0;
long last_time;
String currentDate, currentTime;
PZEM004Tv30 pzem(12, 14); //D6/Tx pzem ,D5/Rx pzem
BlynkTimer timer;
WidgetRTC rtc;
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
// ตั้งค่า Line Notify
const char* lineNotifyToken = "SfnZIv51x4lZuMi6WSC1ak2MrKuaMg5KxSQzV8oYWO7"; // Token สำหรับ Line Notify
void EEPROM_count();
BLYNK_WRITE(V25) { // ตั้งค่าเวลาผ่าน Input Widget
TimeInputParam t(param);
Hour = t.getStartHour();
Minute = t.getStartMinute();
}
BLYNK_WRITE(V21) {
v21 = param.asInt(); // รับค่า v21 จาก Selector
}
BLYNK_WRITE(V22) {
v22 = param.asInt(); // รับค่า v22 จาก Date Input
}
void EEPROM_count() {
EEPROM.put(100, count_table); // บันทึกค่า count_table ลงใน EEPROM
EEPROM.commit();
}
BLYNK_WRITE(V23_RESET) { // รีเซ็ตค่า kWh ด้วยการกดปุ่ม
int pin_v23 = param.asInt();
if (v21 == 2 && pin_v23 == 1) {
pzem.resetEnergy();
cost_old = 0;
EEPROM.put(0, cost_old); // บันทึกข้อมูลใน EEPROM
EEPROM.commit();
Blynk.virtualWrite(V20, "add", count_table, String(count_table) + " | " + currentDate + " - " + currentTime + " รีเซ็ตค่า kWh ด้วยการกดปุ่ม", 0); // เพิ่มข้อมูลลงในตาราง
EEPROM_count();
sendLineNotify("รีเซ็ตค่าไฟแล้ว"); // ส่งการแจ้งเตือนผ่าน Line Notify
}
}
BLYNK_WRITE(V24) { // รีเซ็ตตารางค่าไฟ
pin_v24 = param.asInt();
if (pin_v24 == 1) {
last_time = millis();
}
}
BLYNK_CONNECTED() {
rtc.begin(); // ซิงค์เวลาเมื่อเชื่อมต่อ
Blynk.syncVirtual(V21, V22, V25); // อัปเดตค่า V21, V22, V25
//Blynk.virtualWrite(V20, "add", count_table, String(count_table) + " | " + currentDate + " - " + currentTime + "Connected ", 0);
//EEPROM_count();
}
void sendLineNotify(String message) {
if (WiFi.status() == WL_CONNECTED) {
WiFiClientSecure client;
if (client.connect("notify-api.line.me", 443)) {
String req = String("POST /api/notify HTTP/1.1\r\n") +
"Host: notify-api.line.me\r\n" +
"Authorization: Bearer " + lineNotifyToken + "\r\n" +
"Cache-Control: no-cache\r\n" +
"User-Agent: ESP8266\r\n" +
"Content-Type: application/x-www-form-urlencoded\r\n" +
"Content-Length: " + String(17 + message.length()) + "\r\n\r\n" +
"message=" + message;
client.print(req);
delay(10);
client.stop();
}
}
}
void sendEnergyNotify(float energy, float total) {
String message = "Energy: " + String(energy, 3) + " kWh\n";
message += "Total: " + String(total, 1) + " Baht";
sendLineNotify(message);
}
void read_pzem() {
float voltage = pzem.voltage();
if(!isnan(voltage)){
Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V");
Blynk.virtualWrite(V10,voltage);
} else {
Serial.println("Error reading voltage");
}
float current = pzem.current();
if (!isnan(current)) {
Serial.print("Current: "); Serial.print(current); Serial.println("A");
Blynk.virtualWrite(V11, current);
} else {
Serial.println("Error reading current");
}
float power = pzem.power();
if (!isnan(power)) {
Serial.print("Power: "); Serial.print(power); Serial.println("W");
Blynk.virtualWrite(V12, power);
} else {
Serial.println("Error reading power");
}
float energy = pzem.energy();
if (!isnan(energy)) {
Serial.print("Energy: "); Serial.print(energy, 3); Serial.println("kWh");
Blynk.virtualWrite(V13, energy, 3);
float rate_1 = 0;
float rate_2 = 0;
float rate_3 = 0;
if (energy > 0 && energy <= 150) { // หน่วยที่ 0-150
rate_1 = energy * 3.2484;
}
if (energy > 150) {
rate_1 = 150 * 3.2484;
}
if (energy >= 151 && energy <= 400) { // หน่วยที่ 151-400
rate_2 = (energy - 150) * 4.2218;
}
if (energy > 400) { // เกิน 400
rate_2 = 250 * 4.2218;
rate_3 = (energy - 400) * 4.4217;
}
float ft = energy * (-0.116);
float total_vat = (rate_1 + rate_2 + rate_3 + ft + 38.22) * 0.07;
float total = (rate_1 + rate_2 + rate_3 + ft + 38.22) + total_vat;
cost_total = total;
Blynk.virtualWrite(V16, total, 1);
// ส่งข้อมูล Energy และ Total ไปยัง Line Notify
sendEnergyNotify(energy, total);
} else {
Serial.println("Error reading energy");
}
float pf = pzem.pf();
if (!isnan(pf)) {
Serial.print("PF: "); Serial.println(pf);
Blynk.virtualWrite(V15, pf);
} else {
Serial.println("Error reading power factor");
}
Serial.println();
}
void setup()
{
Serial.begin(9600);
Blynk.begin(auth, ssid, pass, "blynk.clound" , 80);
EEPROM.begin(512); // กำหนดขนาดของ EEPROM
EEPROM.get(100, count_table); // อ่านค่า count_table จาก EEPROM
EEPROM.get(0, cost_old); // อ่านค่า cost_old จาก EEPROM
Blynk.virtualWrite(V20, "clear"); // เคลียร์ตาราง V20 ในแอป Blynk
rtc.begin(); // ซิงค์เวลา RTC
// อื่น ๆ ใน setup()
}
void loop()
{
Blynk.run();
timer.run();
}