#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#include <PZEM004Tv30.h>
#include <time.h>
// Config WiFi
#define WIFI_SSID "bbt_2.4G"
#define WIFI_PASSWORD "BMUi2509"
// Config Firebase
#define FIREBASE_HOST "https://electric-67d28.firebaseio.com/"
#define FIREBASE_AUTH "electric-67d28.firebaseapp.com"
#ifndef min
#define min(a,b) ((a)<(b)?(a):(b))
#endif
float calBill(float Unit, float ft, bool over_150_Unit_per_month = false) ;
// Config time
int timezone = 7;
// Config bill
#define FIX_FT -15.90
char ntp_server1[20] = "ntp.ku.ac.th";
char ntp_server2[20] = "fw.eng.ku.ac.th";
char ntp_server3[20] = "time.uni.net.th";
int dst = 0;
unsigned long lastUpdateEnergy = 0, lastUpdateFirebase = 0;
float Volt, Amp, Power;
unsigned long Energy = 0;
PZEM004Tv30 pzem(D7,D6); // (RX,TX) connect to TX,RX of PZEM
IPAddress ip(192, 168, 1, 1);
void setup() {
Serial.begin(115200);
Serial.println();
pzem.setAddress(ip);
while (!pzem.setAddress(ip)) {
Serial.println("Connecting to PZEM...");
delay(500);
}
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("connecting");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("connected: ");
Serial.println(WiFi.localIP());
configTime(timezone * 3600, dst, ntp_server1, ntp_server2, ntp_server3);
Serial.println("Waiting for time");
while (!time(nullptr)) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.println("Now: " + getTime());
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
}
void loop() {
if ((millis() - lastUpdateEnergy) >= 1000) {
lastUpdateEnergy = millis();
unsigned long startTime = millis();
Volt = pzem.voltage(ip);
Volt = Volt > 0 ? Volt : 0;
Amp = pzem.current(ip);
Amp = Amp > 0 ? Amp : 0;
Power = Volt * Amp;
Energy += Power;
/*Serial.print("Load time: ");
Serial.print(millis() - startTime);
Serial.println("ms");
Serial.println("Voltage: " + String(Volt, 2));
Serial.println("Current: " + String(Amp, 2));
Serial.println("Power: " + String(Power, 2));
Serial.println("Energy: " + String(Energy));
Serial.println("--------------------");
*/
}
time_t now = time(nullptr);
struct tm* nowTime = localtime(&now);
if ((nowTime->tm_sec % 30) == 0) {
lastUpdateFirebase = millis();
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();
root["volt"] = Volt;
root["amp"] = Amp;
root["time"] = getTime();
String name = Firebase.push("/logPower", root);
// handle error
if (Firebase.failed()) {
Serial.print("pushing failed:");
Serial.println(Firebase.error());
return;
}
Serial.print("pushed: /logPower/");
Serial.println(name);
Firebase.setInt("/energy", Energy);
if (Firebase.failed()) {
Serial.print("pushing failed:");
Serial.println(Firebase.error());
return;
}
Firebase.setFloat("/amount", calBill(Energy / 1000, FIX_FT, false));
if (Firebase.failed()) {
Serial.print("pushing failed:");
Serial.println(Firebase.error());
return;
}
}
delay(0); // Disable WDT
}
String getTime() {
time_t now = time(nullptr);
struct tm* newtime = localtime(&now);
String tmpNow = "";
tmpNow += String(newtime->tm_year + 1900);
tmpNow += "-";
tmpNow += String(newtime->tm_mon + 1);
tmpNow += "-";
tmpNow += String(newtime->tm_mday);
tmpNow += " ";
tmpNow += String(newtime->tm_hour);
tmpNow += ":";
tmpNow += String(newtime->tm_min);
tmpNow += ":";
tmpNow += String(newtime->tm_sec);
return tmpNow;
}
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, 150) * Rate400;
if (Unit >= 401) total += (Unit - 400) * RateMore400;
}
total += Service;
total += Unit * (ft / 100);
total += total * 7 / 100;
return total;
}
This Error
conversion from 'IPAddress' to 'uint8_t {aka unsigned char}' is ambiguous
pzem.setAddress(ip);