ว่าด้วยเรื่อง Pzem 004t v3.0 จะวัดพลังงาน+ค่าใช้จ่าย/เดือน

ราตรีสวัสดิ์ที่รัก PUYOL ฉันมีข้อผิดพลาดนี้เมื่อรวบรวม
ESP8266_Pzem_004t_v3.0_v3: 28: 51: ข้อผิดพลาด: Scheduler.h: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

2 Likes

@GAMIX Hi where are you from

hi from mexico

1 Like

Please capture picture error a paste to comment.

ฉันกำลังติดตั้งหลายไลบรารีรวมถึง ESP8266 ตารางเวลาและมันแสดงให้ฉันเห็นข้อผิดพลาดของการ์ด

ที่รักของฉัน Remy ใจดีมากสำหรับเวลาที่จะแสดงความคิดเห็นในข้อผิดพลาดการรวบรวมของฉันได้รับการแก้ไขแล้วและแสดงให้ฉันข้อผิดพลาดนี้โดยการเพิ่มห้องสมุดและรวบรวมมัน

Please paste full your code.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <FS.h>
#include <DNSServer.h>
#include <ArduinoJson.h>
#define BLYNK_MAX_SENDBYTES 1200
#include <BlynkSimpleEsp8266.h>
#include <EEPROM.h>


//------------------------------       Configuración en la sección Blynk        ------------------------------------------------//
#define BLYNK_DEBUG
#define BLYNK_PRINT Serial

int blynkIsDownCount = 0;

char blynk_token[34] = "8dwBaSBOE8htLFrK37JPAYB1hm8TaQkU";//Ingrese nuestro Blynk_token enviado por Blynk por correo electrónico al crear un nuevo proyecto.  8dwBaSBOE8htLFrK3217JPA1YB1hm8TaQkU"
BlynkTimer timer;

//----------------------------------  Determine el número de pin del nodo MCU ESP 8266.  --------------------------------------------//

#define D0 16 //Use el LED azul del MCU ESP8266 para tener una luz intermitente de acuerdo con el código escrito.

#define D3 0 // Úselo como un botón para acceder a la configuración AP de acuerdo con las necesidades del usuario.
//------------------------------------------------------------------------------------------------------------------------//

#include <Scheduler.h>   


// ------------------------Se puede utilizar la biblioteca de pantallas LCD. De esta manera, puede crear un personaje.---------------------------------//
#include <LCD.h>                          // Las líneas 1 y 2 se pueden cambiar.
#include <Wire.h>                         // Las líneas 1 y 2 se pueden cambiar.
#include <LiquidCrystal_I2C.h>            //Esta línea debe estar solo en la línea 3. Si va a las líneas 1 y 2, no se compilará.
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //// Establezca la dirección del dispositivo de pantalla LCD con conexión I2C.
//------------------------------------------------------------------------------------------------------------------------//



bool shouldSaveConfig = false;

//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}
//------------------------------------------------------------------------------------------------------------------------//


//-------------Para el servidor local distribuido, agregue **** solo 2 líneas--------------   (??????? Blynk Server ??????????????)  ----------//
char server[] = "oasiskit.com";
int port = 8080;
//------------------------------------------------------------------------------------------------------------------------//


#include <PZEM004Tv30.h>
PZEM004Tv30 pzem(12, 13); // 12(D6)=RX , 13(D7) = TX  :  TX->D6(GPIO012),RX->D7(GPIO013)
//La variable toma Ft de Blynk para almacenar en la EEPROM.
float Ft;
String Ft_1;
float Ft_2;

//La variable toma la fecha de Blynk y la almacena en la EEPROM.
float Rst_D;
String Rst_D1;
float Rst_D2;

//La variable toma el valor de hora de Blynk para almacenarlo en la EEPROM.
float Rst_H;
String Rst_H1;
float Rst_H2;

//La variable toma el valor minuto de Blynk para almacenarlo en la EEPROM.
float Rst_M;
String Rst_M1;
float Rst_M2;

//Variable para recibir facturas mensuales de electricidad.
float Electric_bill;
float kWh_1;
float kWh_2;
float kWh_3;
float kWh_T;
float kWh_T1;

//Presione el botón Restablecer kWh de Blynk.
int Blynkreset_kWh;
WidgetLED led_rst_kWh(V12);//Se ENCENDERÁ cuando mantenga presionado el botón durante 5 segundos


//RTC Library
#include "Arduino.h"
#include "Wire.h"
#include "uRTCLib.h"
// uRTCLib rtc;
uRTCLib rtc(0x68);

//Establezca la programación de correo electrónico solo una vez
int Email_status = 0;
int Email_status1 = 0;


BLYNK_WRITE(V10)

{
  Ft_1 = param.asString();//Heredar texto de Blynk en String

  Ft_2 = Ft_1.toFloat();//Convertir valor de cadena a flotante
  //Ingresamos el valor de Blynk como String = -0.116 para que Ft_1 lo obtenga.
  //Ft obtendrá la conversión de Ft_1 a Float = -0.12
  // Verás que el valor de Folat se redondea a 2 decimales, no mayor debido a la capacidad del dispositivo en sí.
  // causando que el costo se vuelva loco alrededor del 3.44%, causando la factura de electricidad / mes 3.44% menos que el valor real, aproximadamente 0.64 (150 unidades) - 2.14 (500 unidades) baht
  // Este proyecto no cambiará ningún valor porque el valor es ligeramente diferente (1 mes no usa menos de 500 unidades con seguridad)

  //Este conjunto se hizo en caso de que No está conectado a la aplicación Blynk, aún puede ver todos los valores correctamente Pero cada vez que se cambia el valor de Ft, la fecha, hora y minuto deben configurarse a través de la aplicación Blynk cada vez

  EEPROM.put(0, Ft_2); //Escriba el valor Ft_2 que es un flotante en la Dirección 0.
  EEPROM.commit(); //Terminar de escribir

  Ft = EEPROM.get(0, Ft_2);//Leer Ft_2 como flotante de la dirección 0
  Serial.println(Ft);//Mostrar Ft en el monitor serie
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("...... Sync Ft .....");
  lcd.setCursor(6, 3);
  lcd.print(Ft, 3);
  delay(2000);
  lcd.clear();

}


BLYNK_WRITE(V20)//Restablezca kWh automático para la fecha establecida desde Blynk en la máquina.
{
  Rst_D1 = param.asString();//Heredar texto de Blynk en String

  Rst_D2 = Rst_D1.toFloat();//Convertir valor de cadena a flotante
  
  //Este conjunto se hizo en caso de que No está conectado a la aplicación Blynk, todavía puede obtener el valor Rst kWh, pero cada vez que los cambios de fecha y hora deben configurarse a través de la aplicación Blynk
  EEPROM.put(20, Rst_D2); //Escriba el valor flotante Rst_D2 en la dirección 20.
  EEPROM.commit(); //Terminar de escribir

  Rst_D = EEPROM.get(20, Rst_D2);//Lea Rst_2, Flotante de la dirección 20.
  Serial.println(Rst_D);//Mostrar Rst en Serial Monitor
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Sync Auto Rst By Day");
  lcd.setCursor(0, 2);
  lcd.print("     Day:  ");
  lcd.setCursor(10, 2);
  lcd.print(Rst_D, 0);
  delay(2000);
  lcd.clear();
}





BLYNK_WRITE(V21)//Restablezca kWh automático de acuerdo con las horas establecidas desde Blynk en la máquina.

{
  Rst_H1 = param.asString();//Heredar texto de Blynk en String
  Rst_H2 = Rst_H1.toFloat();//Convertir valor de cadena a flotante
  
  //Este conjunto se hizo en caso de que No está conectado a la aplicación Blynk, todavía puede obtener el valor Rst kWh, pero cada vez que los cambios de fecha y hora deben configurarse a través de la aplicación Blynk
  EEPROM.put(30, Rst_H2); //Escriba el valor Rst_H2 Float en la Dirección 30
  EEPROM.commit(); //Terminar de escribir
  
  Rst_H = EEPROM.get(30, Rst_H2);//Lea Rst_H2, Flotador de la dirección 30.
  Serial.println(Rst_H);//Mostrar Rst en Serial Monitor
  lcd.clear();
  lcd.setCursor(0, 1);
  lcd.print("Sync AutoRst By Hour");
  lcd.setCursor(0, 2);
  lcd.print("    Hour:  ");
  lcd.setCursor(10, 2);
  lcd.print(Rst_H, 0);
  delay(2000);
  lcd.clear();

}



BLYNK_WRITE(V22)//Restablezca el kWh automático de acuerdo con los minutos establecidos desde Blynk en la máquina.

{
  Rst_M1 = param.asString();//Heredar texto de Blynk en String

  Rst_M2 = Rst_M1.toFloat();//Convertir valor de cadena a flotante
  
  //Este conjunto se hizo en caso de que No está conectado a la aplicación Blynk, todavía puede obtener el valor Rst kWh, pero cada vez que los cambios de fecha y hora deben configurarse a través de la aplicación Blynk
  EEPROM.put(40, Rst_M2); //Escriba el valor Rst_H2 Float en la dirección 0
  EEPROM.commit(); //Terminar de escribir

  Rst_M = EEPROM.get(40, Rst_M2);//Leer Rst_M2, Flotar desde la dirección 40
  Serial.println(Rst_M);//Mostrar Rst en Serial Monitor
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("   Sync Auto Rst    ");
  lcd.setCursor(0, 1);
  lcd.print("     By Minute      ");
  lcd.setCursor(0, 3);
  lcd.print("  Minute:  ");
  lcd.setCursor(10, 3);
  lcd.print(Rst_M, 0);
  delay(2000);
  lcd.clear();

}











BLYNK_WRITE(V11)//Restablecer kWh en 5 segundos desde Blynk
{

  int pinValue = param.asInt();
  if (pinValue == 1) {
    Blynkreset_kWh = 1;
  }
  if (pinValue == 0) {
    Blynkreset_kWh = 0;
  }
}







//Blynk Server Connection
class Task_1 : public Task {
  protected:
    void setup() { }


    void loop()  {

      //-----------------------------------------------------------------------------------------------------------//
      if (Blynk.connected())
      {
        Blynk.run();
        digitalWrite(D0, LOW);

      } else {

        digitalWrite(D0, LOW);
        delay(200);
        digitalWrite(D0, HIGH);
        delay(100);

      }
      //-----------------------------------------------------------------------------------------------------------//

      timer.run();//Deja que Blynk tenga tiempo para trabajar.

      delay(500);

    }
} Task_1_task;



//Muestra los valores de PZEM.
class Task_2 : public Task {
  protected:
    void setup() { }


    void loop()  {

      float voltage = pzem.voltage();
      if (voltage != NAN) {
        //Serial.print("Voltage: "); Serial.print(voltage); Serial.println("V");
        lcd.setCursor(1, 0);
        lcd.print(voltage, 0);
        lcd.setCursor(4, 0);
        lcd.print("Vac");
        Blynk.virtualWrite(V1, voltage);
      } else {

      }


      float current = pzem.current();
      if (current != NAN) {
        //Serial.print("Current: "); Serial.print(current); Serial.println("A");
        lcd.setCursor(13, 0);
        lcd.print(current, 2);
        lcd.print(" A");
        Blynk.virtualWrite(V2, current);
      } else {

      }

      float power = pzem.power();
      if (current != NAN) {
        lcd.setCursor(0, 1);
        lcd.print(power, 2);
        lcd.setCursor(8, 1);
        lcd.print("W");


        Blynk.virtualWrite(V3, power);
      } else {

      }

      float energy = pzem.energy();
      if (current != NAN) {
        lcd.setCursor(10, 1);
        lcd.print(energy, 2);
        lcd.print(" kWh");
        Blynk.virtualWrite(V4, energy);
      } else {

      }

      float frequency = pzem.frequency();
      if (current != NAN) {
        lcd.setCursor(8, 0);
        lcd.print(frequency, 0);
        lcd.setCursor(10, 0);
        lcd.print("Hz");
        Blynk.virtualWrite(V5, frequency);
      } else {

      }

      float pf = pzem.pf();
      if (current != NAN) {

        Blynk.virtualWrite(V6, pf);
      } else {

      }
      delay(4000);

    }//loop



} Task_2_task;



//El cargo de electricidad se calculará de acuerdo con el uso en el hogar. Nuestras más de 150 unidades / mes. Cualquiera menos que esto puede pensar en la fórmula por nosotros mismos.
class Task_3 : public Task {
  protected:
    void setup() { }

    void loop()  {


      float energy = pzem.energy();

      // Presione el botón en la parte frontal del dispositivo durante 5 segundos para restablecer kWh.
      if (digitalRead(D3) == LOW) {
        delay(3000);
        pzem.resetEnergy();

      }

      // Presione el botón de Blynk durante 5 segundos para restablecer kWh. Mantenga presionado hasta que el LED se apague.
      if (Blynkreset_kWh == 1) {
        led_rst_kWh.on();
        delay(3000);
        pzem.resetEnergy();
        led_rst_kWh.off();
        pzem.resetEnergy();

      }
      if (Blynkreset_kWh == 0) {

        led_rst_kWh.off();

      }


      //  Reinicio automático kWh. La configuración es de Blynk, almacenada en la EEPROM de la máquina.
      // Envío de correo electrónico solo 1 vez.
      if (Rst_D == rtc.day() && Rst_H == rtc.hour() &&  Rst_M == rtc.minute() && Email_status == 0) {
        pzem.resetEnergy();
        //Serial.println ("restablecer kWh"); se restablecerá repetidamente en 1 minuto y se cancelará hasta que se cree un nuevo minuto.
        String body = String("La factura mensual de electricidad") + (rtc.month() - 1) + String(" Cantidad ") + Electric_bill + String(" Baht, el sistema tiene Reset Reset kWh = 0 *** *** Verifique el Ft *** mensual con By PUYIOT ");
        Blynk.email("mysmarthomepuy@gmail.com", " Notificación mensual de pago de electricidad ", body);
        delay(500);
        Email_status = 1;
        Email_status1 = 0;
      }
      else if (Rst_D == rtc.day() && Rst_H == rtc.hour() &&  Rst_M == rtc.minute() && Email_status == 1) {
        delay(10);
        Email_status1 = 1;
      }

      if (Rst_M != rtc.minute() && Email_status1 == 1 ) {
        delay(10);
        Email_status = 0;
      }



      //1.2 La tasa normal de consumo de electricidad es de más de 150 unidades por mes.
      //En nuestro país, este tipo de carga se utiliza para el tipo 1125, que consiste en usar electricidad más de 150 unidades / mes, la tasa es de 38,22 baht / mes.

      //1 - 150 baht 3.2484 baht por unidad
      
      if (energy >= 1 && energy <= 150) {
        kWh_1 = energy * 3.2484;
      }
      if (energy > 150) {
        kWh_1 = 150 * 3.2484;
      }


      //Unidades 151 - 400 por unidad 4.2218 baht

      if (energy >= 151 && energy <= 400) {
        kWh_2 = energy * 4.2218;
      }
      if (energy > 400) {
        kWh_2 = 250 * 4.2218;
        //401 -> 4.4217 baht por unidad
        kWh_3 = (energy - 400) * 4.4217;
      }


      //Gastos totales
      kWh_T = kWh_1 + kWh_2 + kWh_3;
      kWh_T1 = kWh_T + 38.22 + (energy * Ft);

      Electric_bill = kWh_T1 + (kWh_T1 * 0.07);

      lcd.setCursor(0, 3);
      lcd.print("B/M: ");
      lcd.setCursor(5, 3);
      lcd.print(Electric_bill , 2);
      lcd.setCursor(12, 3);
      //lcd.print("Bath");
      Blynk.virtualWrite(V7, Electric_bill);


      lcd.setCursor(13, 3);
      lcd.print(Rst_D, 0);
      //lcd.print("D");
      lcd.setCursor(15, 3);
      lcd.print(Rst_H, 0);
      lcd.setCursor(17, 3);
      lcd.print(":");
      //lcd.print("H");
      lcd.setCursor(18, 3);
      lcd.print(Rst_M, 0);

      delay(2000);

    }//loop






} Task_3_task;



//Mostrar dd:mm:yy   hh:mm
class Task_4 : public Task {
  protected:
    void setup() { }

    void loop()  {
      rtc.refresh();
      int year_ = rtc.year() + 43; //+43 para obtener el año 63

      lcd.setCursor(0, 2);

      //Agregue 0 en caso de número, día, mes, hora, minuto, segundo
      if (rtc.day() < 10)
      {
        lcd.print("0");
        lcd.print(rtc.day());
      }
      else lcd.print(rtc.day());
      lcd.print('-');


      if (rtc.month() < 10)
      {
        lcd.print("0");
        lcd.print(rtc.month());
      }
      else lcd.print(rtc.month());
      lcd.print('-');

      lcd.print(year_);

      lcd.setCursor(12, 2);

      if (rtc.hour() < 10)
      {
        lcd.print("0");
        lcd.print(rtc.hour());
      }
      else lcd.print(rtc.hour());

      lcd.print(':');



      if (rtc.minute() < 10)
      {
        lcd.print("0");
        lcd.print(rtc.minute());
      }
      else lcd.print(rtc.minute());

      lcd.print(':');



      if (rtc.second() < 10)
      {
        lcd.print("0");
        lcd.print(rtc.second());
      }
      else lcd.print(rtc.second());


      delay(1000);



    }
} Task_4_task;








//------------------------------------------------------------------------------------------------------------------------//
//*********************************************       void setup        **************************************************//
//------------------------------------------------------------------------------------------------------------------------//

void setup() {

  //-------IO NODE MCU Esp8266-------//
  pinMode(D0, OUTPUT);      //Establezca el modo de funcionamiento para el pin D0 para señalar el pin en varias condiciones.
  pinMode(D3, INPUT_PULLUP);//Establezca el modo activo en pin D3 a pin Mantenga presionado el botón para establecer la configuración AP.


  // Deje que todos los LED se apaguen primero.
  digitalWrite(D0, LOW);//Permita que el LED azul se apague primero.

  //-------------------------------//


  Serial.begin(115200);
  //-------------------------------//

  EEPROM.begin(512);

  //Quiere saber si el valor de Ft que es un Flotante almacenado en la EEPROM es el valor = el valor que realmente se ingresa desde Bylnk.
  Ft = EEPROM.get(0, Ft_2);
  Serial.print("Ft in Void setup : ");
  Serial.println(Ft);

  //Me gustaría saber si el valor de fecha en el Flotante almacenado en la EEPROM tiene el valor = el valor que realmente se ingresó desde Bylnk.
  Rst_D = EEPROM.get(20, Rst_D2);
  Serial.print("Day in Void setup : ");
  Serial.println(Rst_D);

  //Me gustaría saber que el valor horario del Flotador almacenado en la EEPROM tiene el valor = el valor que realmente se ingresa desde Bylnk.
  Rst_H = EEPROM.get(30, Rst_H2);
  Serial.print("Hour in Void setup : ");
  Serial.println(Rst_H);

  //Quiere saber si el valor minuto que es un flotante almacenado en la EEPROM es el valor = el valor que realmente se ingresa desde Bylnk
  Rst_M = EEPROM.get(40, Rst_M2);
  Serial.print("Minute in Void setup : ");
  Serial.println(Rst_M);


  lcd.begin(20, 4);
  lcd.clear();




#ifdef ARDUINO_ARCH_ESP8266
  Wire.begin(4, 5); // GPIO4 = D2 and GPIO5 = D1 on ESP8266
#else
  Wire.begin();
#endif

  //rtc.set(0, 46, 11, 3, 3, 3, 20);//Use solo el temporizador. Si desea configurarlo, tome // Desarmar. Una vez configurado correctamente, luego tome // poner como antes.
  //  RTCLib::set(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year)







  //read configuration from FS json
  Serial.println("mounting FS...");//Mostrar el mensaje en el monitor serie.

  if (SPIFFS.begin()) {
    Serial.println("mounted file system");//Mostrar el mensaje en el monitor serie.

    if (SPIFFS.exists("/config.json")) {
      //file exists, reading and loading
      Serial.println("reading config file");//Mostrar el mensaje en el monitor serie.
      File configFile = SPIFFS.open("/config.json", "r");

      if (configFile) {
        Serial.println("opened config file");
        size_t size = configFile.size();
        // Allocate a buffer to store contents of the file.
        std::unique_ptr<char[]> buf(new char[size]);

        configFile.readBytes(buf.get(), size);
        DynamicJsonBuffer jsonBuffer;
        JsonObject& json = jsonBuffer.parseObject(buf.get());
        json.printTo(Serial);
        if (json.success()) {
          Serial.println("\nparsed json");//Mostrar el mensaje en el monitor serie.
          strcpy(blynk_token, json["blynk_token"]);

        } else {
          Serial.println("failed to load json config");//Mostrar el mensaje en el monitor serie.
        }
      }
    }
  } else {
    Serial.println("failed to mount FS");//Mostrar el mensaje en el monitor serie.
  }
  //end read



  //**************************        AP AUTO CONNECT   ********************************************//

  WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 34);

  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wifiManager;

  //set config save notify callback
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  wifiManager.addParameter(&custom_blynk_token);


  for (int i = 5; i > -1; i--) {  // Cuente 5 segundos antes de presionar el botón AP Config.
    digitalWrite(D0, HIGH);
    delay(500);
    digitalWrite(D0, LOW);
    delay(500);
    Serial.print (String(i) + " ");//Mostrar el mensaje en el monitor serie.
  }


  if (digitalRead(D3) == LOW) {
    digitalWrite(D0, LOW);
    Serial.println("Button Pressed");//Mostrar el mensaje en el monitor serie.

    wifiManager.resetSettings();//Borre el SSID y la contraseña que se guardó.


    // wifiManager.autoConnect(); Se usa para crear automáticamente puntos de acceso desde ESP + ChipID.

    if (!wifiManager.autoConnect("PUYIOT AP CONFIG")) {
      Serial.println("failed to connect and hit timeout");//Mostrar el mensaje en el monitor serie.
      delay(3000);
      //reset and try again, or maybe put it to deep sleep--reiniciar e intentar nuevamente, o quizás ponerlo en reposo profundo
      ESP.reset();
      delay(5000);

    }
  }



  Serial.println("Connected.......OK!)");//Mostrar el mensaje en el monitor serie.
  strcpy(blynk_token, custom_blynk_token.getValue());


  //save the custom parameters to FS
  if (shouldSaveConfig) {
    Serial.println("saving config");//Mostrar el mensaje en el monitor serie.
    DynamicJsonBuffer jsonBuffer;
    JsonObject& json = jsonBuffer.createObject();
    json["blynk_token"] = blynk_token;
    File configFile = SPIFFS.open("/config.json", "w");

    if (!configFile) {
      Serial.println("failed to open config file for writing");//Mostrar el mensaje en el monitor serie.
    }
    json.printTo(Serial);
    json.printTo(configFile);
    configFile.close();
    //end save
  }

  //**************************    TERMINA    AP AUTO CONNECT   *****************************************//




  Serial.println("local ip"); //Mostrar el mensaje en el monitor serie.
  delay(100);
  Serial.println(WiFi.localIP());//Mostrar el mensaje en el monitor serie.
  Serial.println("gateway");
  delay(100);
  Serial.println(WiFi.gatewayIP());
  Serial.println("subnetMask");
  delay(100);
  Serial.println(WiFi.subnetMask());
  Serial.println("SSID");
  delay(100);
  Serial.println(WiFi.SSID());
  Serial.println("Password");
  delay(100);
  Serial.println(WiFi.psk());


  // Blynk.config(blynk_token); //// Inicia una conexión normal del servidor Blynk.
  Blynk.config(blynk_token, server, port);
  ////Comience a conectarse a Blynk Server ********* para el servidor local que se entrega, servidor, puerto. Todo esto está hecho.



  timer.setInterval(30000L, reconnecting);  //Function reconnect




  Scheduler.start(&Task_1_task);
  Scheduler.start(&Task_2_task);
  Scheduler.start(&Task_3_task);
  Scheduler.start(&Task_4_task);

  Scheduler.begin();




}


//------------------------------------------------------------------------------------------------------------------------//
//*********************************************   TERMINA  void setup        **************************************************//
//------------------------------------------------------------------------------------------------------------------------//



//------------------------------------------------------------------------------------------------------------------------//
//*********************************************       void Loop        ***************************************************//
//------------------------------------------------------------------------------------------------------------------------//


void loop() {



}

//------------------------------------------------------------------------------------------------------------------------//
//*********************************************      Fin de void Loop       **************************************************//
//------------------------------------------------------------------------------------------------------------------------//





//------------------------------------------------------------------------------------------------------------------------//
void reconnecting()
{
  if (!Blynk.connected())
  {
    blynkIsDownCount++;
    BLYNK_LOG("blynk server is down! %d  times", blynkIsDownCount);
    Blynk.connect(5000);
  }
}


BLYNK_CONNECTED()
{

  Blynk.syncAll();//Sincronice todos los datos más recientes del servidor Blynk.
}

คำขอโทษสำหรับคนที่ฉันตอบว่าฉันเพิ่งรู้จักกับพอร์ทัลนี้และการแปลของฉันก็ซับซ้อน
คำขอโทษสำหรับคนที่ฉันตอบว่าฉันเพิ่งรู้จักกับพอร์ทัลนี้และการแปลของฉันก็ซับซ้อนรหัสของฉันก็เหมือนกันกับที่นี่ในพอร์ทัลESP8266_Pzem_004t_v3.0_v3.ino (23.6 KB)

i use library name : ESP8266Scheduler
you can Download here :

1 Like

Your check code has "}" Is that correct?

image

ผมมีเรื่องแจ้งครับ จากกระทู้ นี้ ผมคิดว่ามี สมาชิก หรือผู้ที่ต้องการทำโปรเจคนี้ กำลังทำและลอง Code อยู่หรือปล่าวไม่แน่ใจ คือใน Code ที่ผมแชร์ไป มันมี Gmail ผมอยู่ด้วย ซึ่งตอนนี้ผมแก้เป็น xxxx@gmail.com แล้ว มันมี Gmail ผม ส่งเข้ามาหาครับ รายงานแจ้งค่าไฟประจำเดือน ซึ่งมันไม่ใช่ของผมครับ คืออยากแจ้งให้คนที่ทดลองทำอยู่ ทราบว่า งานคุณนะ OK แล้ว แต่ กรุณาเปลี่ยน Gmail เป็น Gmail ของคุณด้วยนะครับ :sweat_smile:
ส่วนหนึ่งขอน้อมรับความผิดพลาดนะครับที่ไม่ดูให้ดีก่อน

1 Like

เมลมาจาก เมคซิโก รึป่าวครับพี่ 555 ดีที่ไม่เข้ารัวๆ

คิดได้ว่า จะหาความน่าเชื่อถือจาก PZEM ยังไง ก็เอาแบบง่ายๆ ที่คิดได้ดีกว่าครับ

วันที่ เวลา มิเตอร์การไฟฟ้า kWh PZEM kWh
6/3/2563 19.32 41608 (เกือบๆ 8) 21.978
6/3/2563 8.01 41604 (เกือบๆ4) 17.019
ค่าความต่าง 4 4.959

ค่าที่ได้แตกต่างกันเกือบ 1 หน่วย

ลองคิดหาสาเหตุ ค่าที่ผิดพลาดแบบง่ายๆ ดูก่อน

  1. เครื่องวัดของการไฟฟ้าเป็นแบบ Analog ส่วน PZEM เป็นแบบ Digital ก็ย่อมให้ค่าที่ออกมาแตกต่างกัน

  2. เครื่องวัดของการไฟฟ้าเป็นแบบ Analog มันบอกค่าจุดทศนิยมไม่ได้ ตำแหน่งสุดท้ายก็ต้องประมาณเอา

    31235

ในกรณีดังรูปหลักสุดท้าย อยู่ระหว่าง 3 กับ 4 ก็ต้องประมาณเอา ทำให้ค่าคลาดเคลื่อน กับแบบ Digital
3. ค่า Digital มากกว่าค่า Analog เป็นผลดีกับใคร :laughing:

เดี๋ยวพรุ่งนี้ จะเชคอีกทีครับ

Update ข้อมูล 14/03/2563

วันที่ เวลา มิเตอร์การไฟฟ้า kWh PZEM kWh
10/3/2563 9.19 41659 74.376
7/3/2563 8.46 41615 28.24
ค่าความต่าง 44 46.136
วันที่ เวลา มิเตอร์การไฟฟ้า kWh PZEM kWh
14/3/2563 8.3 41724 139.663
10/3/2563 9.19 41659 74.376
ค่าความต่าง 65 65.287

จะเห็นว่า ระหว่างเครื่องวัดแบบ Digital กับ Analog มีความใกล้เคียงกันมาก

2 Likes

พี่ทำแบบตารางเป็นด้วยหรอครับ ผมว่าผมยังไม่ได้ลงวิธีทำไว้นะ เยี่ยมไปเลยครับ :grin:

ตอนแรกกะพิมพ์ลงไป​ ระยะห่างมันไม่ได้​ ก็เลยไปทำในExcel​กะว่าจะcapture.ไม่เอาดีกว่า​ ก็อปตารางไปวางเลย​ ผลลัพธ์​ ก็เป็นอย่างที่เห็นครับ​ :sweat_smile:

2 Likes

หากผมใช้ pzem 2 ตัวต่อกับ esp8266 ตัวเดียวได้ไหมครับ เพื่อรับข้อมูลมาแสดงที่ blynk
ขอบคุณครับ

ยังไม่เคยลองครับ ถ้ามีข้อมูลอะไรก็เอามาลงไว้ก่อนก็ได้ครับ

สนใจทำโปรเจคนี้มากครับแต่ไม่รุ้จะเริ่มยังไง พอจะมีข้อมูลการทำแรกๆไม่ครับ