อยากจะสอบถามว่าทำไม ต่อ 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;
}