PZEM 400tv30 ต่อ blynk แล้วค่า FT ไม่ขึ้นแก้ไขยังไงคับ

อยากจะสอบถามว่าทำไม ต่อ PZEM-004T-v3.0 ค่า FT มันแสดง 0.0 อะคับ

#include <ESP8266WiFi.h>
#include <PZEM004Tv30.h>
#define BLYNK_PRINT Serial
#include <BlynkSimpleEsp8266.h>
#include <ThingspeakClient.h>
#include <EEPROM.h>

#define FIRST_ADDRESS 0
#define MAX_ATTEMPTS 10
#define min(a,b) ((a)<(b)?(a):(b))

PZEM004Tv30 pzem(4, 5); // RX,TX d2,d1

const char* ssid     = "Surachet";
const char* password = "11110000";
char auth[] = "mCysxv9DMoUy1BqVLdq0pnNUoADTAl3k";  //Blynk Token
char server[] = "blynk.iot-cm.com";
int port = 8080;

WiFiClient client;
ThingspeakClient thingspeak;
const char* host = "api.thingspeak.com";
const String THINGSPEAK_CHANNEL_ID = "997188";
const String THINGSPEAK_API_READ_KEY = "O6GCR2IT07MJC00H";  //read key
const char* api   = "4LTULMR11UJELJ0X";  //write key

float v, i, p, e, b;
long milisec = 0;
float calBill(float Unit, float ft, bool over_150_Unit_per_month = false) ;
float FT = -11.9;
int firstState;
unsigned long currentMillis, previousMillis, previousMillis2, previousMillis3, readMillis = 0;
void setup() {
  Serial.begin(115200);
  Serial.println("Starting...");

    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      
      delay(500);
      Serial.print(".");
    }
   Serial.println("WiFi connected");  
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  Blynk.begin(auth, ssid, password,"blynk.iot-cm.com", 8080);

  EEPROM.begin(512);
  firstState = EEPROM.read(FIRST_ADDRESS);
  Serial.println(firstState);

  if (firstState == 5) {
    Serial.print("use again:");
    thingspeak.getLastChannelItem(THINGSPEAK_CHANNEL_ID, THINGSPEAK_API_READ_KEY);
    String f1 = (thingspeak.getFieldValue(3));
    String f2 = (thingspeak.getFieldValue(4));
    String f3 = (thingspeak.getFieldValue(5));
    e = f1.toFloat();
    b = f2.toFloat();
    FT = f3.toFloat();
  } else {
    Serial.print("use new:");
    Serial.println("first write eeprom");
    EEPROM.write(0, 5);
    EEPROM.commit();
  }

  ReadPzem();
  currentMillis = previousMillis = previousMillis2 = previousMillis3 = readMillis = millis();
  Serial.println(FT);
  Blynk.virtualWrite(V7, FT);
  b = calBill(e, FT, true);
}

void loop() {
  currentMillis = millis();
  Blynk.run();

  if (currentMillis - readMillis >= 1000) {
    ReadPzem();
    SetBlynk();
  }

  if (currentMillis - previousMillis3 >= 30000) UpdateThingspeak();
}

void ReadPzem() {
  readMillis = millis();
  unsigned long time;

  v = getVoltage();
  i = getCurrent();
  p = v * i;
  if (p >= 1) {
    time += 1;
    e += (p * time) / (1000 * 3600);
    b = calBill(e, FT, true);
  } else {
    time = 0;
  }

  Serial.print("Volt: "); Serial.print(v); Serial.print("V\n");
  Serial.print("Current: "); Serial.print(i); Serial.print("A\n");
  Serial.print("power Now: "); Serial.print(p); Serial.print("W\n");
  Serial.print("Energy: "); Serial.print(e, 3); Serial.print("kWh\n");
  Serial.print("Cost: "); Serial.print(b, 3); Serial.print("฿\n");
  Serial.print("FT: "); Serial.println(FT);
  Serial.println("--------------------");

}

void SetBlynk() {
  Blynk.virtualWrite(V0, v);
  Blynk.virtualWrite(V1, i);
  Blynk.virtualWrite(V2, p);
  Blynk.virtualWrite(V4, e);
  Blynk.virtualWrite(V5, b);
  Blynk.virtualWrite(V6, FT);
}

void UpdateThingspeak() {
  previousMillis3 = millis();
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

  String etemp = String(e, 3);
  String btemp = String(b, 3);

  // We now create a URI for the request
  String url = "/update?api_key=";
  url += api;
  url += "&field1=";
  url += v;
  url += "&field2=";
  url += i;
  url += "&field3=";
  url += p;
  url += "&field4=";
  url += etemp;
  url += "&field5=";
  url += btemp;
  url += "&field6=";
  url += FT;

  Serial.print("Requesting URL: ");
  Serial.println(url);
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  delay(10);

  // Read all the lines of the reply from server and print them to Serial
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  Serial.println();
  Serial.println("closing connection");
}
float calBill(float Unit, float ft, bool over_150_Unit_per_month) {
  float Service = over_150_Unit_per_month ? 38.22 : 8.19;

  float total = 0;

  if (!over_150_Unit_per_month) {
    float Rate15 = 2.3488;
    float Rate25 = 2.9882;
    float Rate35 = 3.2405;
    float Rate100 = 3.6237;
    float Rate150 = 3.7171;
    float Rate400 = 4.2218;
    float RateMore400 = 4.4217;

    if (Unit >= 6) total += min(Unit, 15) * Rate15;
    if (Unit >= 16) total += min(Unit - 15, 10) * Rate25;
    if (Unit >= 26) total += min(Unit - 25, 10) * Rate35;
    if (Unit >= 36) total += min(Unit - 35, 65) * Rate100;
    if (Unit >= 101) total += min(Unit - 100, 50) * Rate150;
    if (Unit >= 151) total += min(Unit - 150, 250) * Rate400;
    if (Unit >= 401) total += (Unit - 400) * RateMore400;
  } else {
    float Rate150 = 3.2484;
    float Rate400 = 4.2218;
    float RateMore400 = 4.4217;

    total += min(Unit, 150) * Rate150;
    if (Unit >= 151) total += min(Unit - 150, 250) * Rate400;
    if (Unit >= 401) total += (Unit - 400) * RateMore400;
  }

  total += Service;
  total += Unit * (ft / 100);
  total += total * 7 / 100;

  return total;
}

float getVoltage() {
  int i = 0;
  float r = -1.0;
  do {
    r = pzem.voltage();
    wdt_reset();
    i++;
  } while ( i < MAX_ATTEMPTS && r < 0.0);
  return r;
}

float getCurrent() {
  int i = 0;
  float r = -1.0;
  do {
    r = pzem.current();
    wdt_reset();
    i++;
  } while ( i < MAX_ATTEMPTS && r < 0.0);
  return r;
}

ในเว็บนี้มีคำตอบข้อนี้อยู่ ลองใช้สกิลการค้นหาดู แล้วเอามาแปะให้หน่อย อยากรู้ว่าจะหาเจอไหม?? :grin:

แก้เองแล้วคับ 555 ทำผิดเอง ขอบคุณคับแอดมิน

1 Likes

เยี่ยทเลยครับ แก้อะไรไปถึงได้สรุปให้หน่อยครับ

ผมเพิ่ม code ในส่วนนี้ไปอีกคับเลยได้

BLYNK_WRITE(V7) {
  FT = param[0].asFloat();
}

BLYNK_WRITE(V8) {
  p = 0.0;
  e = 0.0;
  b = 0.0;
}