กด รีเซ็ตเเต่ ค่าไฟฟ้าไม่เป็น 0 Pzem

ผมต้องการให้มีปุ่มกดรีเซ็ท ค่าไฟฟ้า เพิ่มขึ้นมาต้องทำยังไงครับ

ผมต้องการให้มัน รีเซ็ต ยอดเงิน ทุกๆๆ 1 ครั้งของเดือน เเละให้ nodemcu รีเซ็ตตัวมันเองต้องทำยังไงครับ

ปล.ไม่ได้เขียนเองนะครับได้จาก youtube

type or paste code here
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TimeLib.h> 
#include <WidgetRTC.h> 
#include <EEPROM.h>

#include <PZEM004Tv30.h> 


char auth[] = "";


char ssid[] = "";
char pass[] = "";
char server[] = "oasiskit.com";
int port = 8080;

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;


BLYNK_WRITE(V25) { // Input time ดึงค่าเวลา
  TimeInputParam t(param);
  Hour = t.getStartHour();
  Minute = t.getStartMinute();             
}


BLYNK_WRITE(V21)
{   
  v21 = param.asInt(); // Get value v21 Selector
}

BLYNK_WRITE(V22)
{   
  v22 = param.asInt(); // Get value v22 Date Input
}

BLYNK_WRITE(V23) {         //man reset kWh  
  int pin_v23 = param.asInt(); 
  if(v21 == 2 && pin_v23 == 1){
  pzem.resetEnergy();
  cost_old = 0;
  EEPROM.put(0, cost_old); // put data EEPROM
  EEPROM.commit();
  Blynk.virtualWrite(V20, "add", count_table, String(count_table) + " | " + currentDate + " - " + currentTime + "Man reset kWh", 0); //Add data to table
  EEPROM_count();
 }
}



BLYNK_WRITE(V24) { //reset table
  pin_v24 = param.asInt();

  if(pin_v24 == 1){
    last_time = millis(); 
  }

}

BLYNK_CONNECTED() {
  rtc.begin(); // Synchronize time on connection
  Blynk.syncVirtual(V21,V22,V25); //update V21 select,V22 date ,V25 input time
  
  
}

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;
      //int x = (int)energy%1; 
      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.153);
      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);

    } else {
        Serial.println("Error reading energy");
    }

    float frequency = pzem.frequency();
    if( !isnan(frequency) ){
        Serial.print("Frequency: "); Serial.print(frequency, 1); Serial.println("Hz");
        Blynk.virtualWrite(V14,frequency, 1);
    } else {
        Serial.println("Error reading frequency");
    }

    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 Check_time()
{
  // You can call hour(), minute(), ... at any time
  // Please see Time library examples for details
  currentTime = String(hour()) + ":" + minute();// + ":" + second(); //read time
  //String currentDate = String(day()) + "/" + month() + "/" + year();
  currentDate = String(day()) + "/" + month(); // read date
  
  if(count == 0 && hour() == Hour && minute() == Minute) { //time compare
       EEPROM.get(0, cost_old); //Get data EEPROM
       cost_today = cost_total-cost_old;
       Blynk.virtualWrite(V20, "add", count_table, String(count_table) + " | " + currentDate + " - " + currentTime + " cost : "+ cost_today + " Baht", 0); //add data to table
       EEPROM_count();
       cost_old = cost_total; // set cost_total to cost_old
       EEPROM.put(0, cost_old); // put data EEPROM 
       EEPROM.commit();
       if(day() == v22 && v21 == 1) { //auto reset kWh
          Blynk.virtualWrite(V20, "add", count_table, String(count_table) + " | " +  currentDate + " - " + currentTime + " Bill : "+ cost_total + " Baht", 0); //add data to table
          EEPROM_count(); 
          delay(500);
          pzem.resetEnergy(); 
          cost_old = 0; 
   
       }
       count = 1;
  }else if (minute() != Minute && count > 0){
       count = 0;
  }

}

void setup()
{
  // Debug console
  Serial.begin(9600);
  EEPROM.begin(256);
  count_table = 0;
  //EEPROM.get(0, cost_old); //Get data EEPROM
  EEPROM.get(30, count_table); //Get data EEPROM
  
 Blynk.begin(auth, ssid, pass, "oasiskit.com", 8080);
  
  setSyncInterval(10 * 60); // Sync interval in seconds (10 minutes)
  // Setup a function to be called every second
  timer.setInterval(2000L, read_pzem);
  timer.setInterval(20000L, Check_time);
}

void EEPROM_count()
{
  count_table++;
  EEPROM.put(30, count_table); // put data EEPROM  
  EEPROM.commit();
}

void loop()
{
  Blynk.run();
  timer.run(); // Initiates BlynkTimer

  if(pin_v24 == 1 && millis() - last_time > 5000) { //กดค้าง 5 Sec เพื่อ reset table
     last_time = millis();
     Blynk.virtualWrite(V20, "clr"); //Clear table
     count_table = 0;
     EEPROM.put(30, count_table); // put data EEPROM  
     EEPROM.commit();
     Serial.println("Reset");
 }
}

ถ้าเป็นผม ผมจะใช้วิธี เช็ค วันที่ online ว่าเท่ากับวันที่ 30 หรือ 1 ก็ให้เคลียร์ค่าไฟ และรีเซตบอร์ด 1 ครั้ง

กรณีโค้ตในกระทู้นี้คือ

ลอง print ออกมาดูว่าแต่ละวันมันได้ค่าตรงหรือไม่

หาตัวแปรที่เก็บค่าไฟ

จากโจทย์ สมมติ ว่าให้รีเซตทุกๆ วันที่ 1 ก็สร้าง if ไว้ใน void loop() ก็ได้ ประมาณนี้

 if( currentDate == “1” ){ // เมื่อถึงวันที่ 1 ในทุกๆ เดือนให้ทำงานลูปนี้

cost_total = 0; // ค่าไฟเท่ากับ 0 
ESP.reset(); // รีเซ็ตบอร์ด 1 ครั้ง

}

ขอบคุณครับเดียวจะมาอัพเดตอีกที ตอนนี้พอกด.ในblynkให้ส่งไปในไลน์ blynk ขึ้น disconnect เเละบอร์ดรีเซ็ทตัวเอง ไม่รู้เป็นเพราะอะไร

1 Like

บางกรณีที่เคยเจอคือ text string มันแยกย่อยเกินไป พยายามรวมให้น้อยที่สุด