มีใครช่วยแก้ให้ blynk ออนไลน์ได้ไหมครับ

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();
}

1