197 lines
5.8 KiB
Plaintext
197 lines
5.8 KiB
Plaintext
#include <ThingerESP8266.h> // Library Thinger.io untuk ESP8266
|
|
#include <PZEM004Tv30.h> // Library untuk sensor PZEM004Tv30
|
|
#include <ESP8266WiFi.h> // Library ESP8266WiFi untuk manajemen koneksi Wi-Fi
|
|
|
|
#define USERNAME "wahyuee" // Username Thinger.io
|
|
#define DEVICE_ID "NodeMCU_PZEM" // ID perangkat Thinger.io
|
|
#define DEVICE_CREDENTIAL "abogoboga" // Kredensial perangkat Thinger.io
|
|
|
|
ThingerESP8266 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); // Objek ThingerESP8266
|
|
|
|
const char* ssid = "Wahyu";
|
|
const char* password = "wahyu123";
|
|
|
|
// Pin yang terhubung ke relay 4 channel
|
|
const int relay1 = D0;
|
|
const int relay2 = D1;
|
|
const int relay3 = D3;
|
|
const int relay4 = D4;
|
|
const int buzzerPin = D2; // Pin buzzer
|
|
|
|
PZEM004Tv30 pzem(14, 12); // GPIO14(D5) to Tx PZEM004; GPIO12(D6) to Rx PZEM004
|
|
|
|
float totalPower =0.0; // Total daya dalam watt-menit
|
|
float Voltage, Current, Power, Energy, Frequency, PF, VA, VAR, totalCost; // Variabel untuk menyimpan data sensor
|
|
unsigned long startTime = 0; // Waktu awal setiap menit
|
|
bool relay1State = HIGH; // Relay1 awalnya dalam keadaan hidup
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
|
|
startTime = millis(); // Mengatur waktu awal pengukuran
|
|
|
|
pinMode(relay1, OUTPUT);
|
|
pinMode(relay2, OUTPUT);
|
|
pinMode(relay3, OUTPUT);
|
|
pinMode(relay4, OUTPUT);
|
|
pinMode(buzzerPin, OUTPUT);
|
|
|
|
|
|
WiFi.begin(ssid, password);
|
|
while(WiFi.status() != WL_CONNECTED)
|
|
{
|
|
delay(1000);
|
|
Serial.println("Menghubungkan ke WiFi...");
|
|
}
|
|
Serial.println("WiFi terhubung!");
|
|
Serial.print("Alamat IP: ");
|
|
Serial.println(WiFi.localIP());
|
|
delay(1000);
|
|
|
|
thing.add_wifi(ssid, password); // Menambahkan koneksi Wi-Fi ke Thinger.io
|
|
|
|
// Mendefinisikan endpoint untuk data sensor pada Thinger.io
|
|
thing["PZEM"] >> [] (pson & out) {
|
|
out["voltage"] = String(Voltage,2);
|
|
out["current"] = String(Current,2);
|
|
out["power"] = String(Power,2);
|
|
out["energy"] = String(Energy,2);
|
|
out["frequency"] = String(Frequency,2);
|
|
out["faktor daya"] = String(PF,2);
|
|
out["Apparent Power"] = String(VA,2);
|
|
out["Reactive Power"] = String(VAR,2);
|
|
out["Total Biaya"] = String(totalCost,2);
|
|
};
|
|
// Mendefinisikan endpoint untuk setiap relay pada Thinger.io
|
|
thing["Perangkat 1"] << digitalPin(relay1);
|
|
thing["Perangkat 2"] << digitalPin(relay2);
|
|
thing["Perangkat 3"] << digitalPin(relay3);
|
|
thing["Perangkat 4"] << digitalPin(relay4);
|
|
}
|
|
|
|
void loop() {
|
|
thing.handle(); // Menghandle koneksi dan komunikasi dengan Thinger.io
|
|
|
|
// Membaca data dari sensor PZEM-004T
|
|
Voltage = pzem.voltage();
|
|
Current = pzem.current();
|
|
Power = pzem.power();
|
|
Energy = pzem.energy();
|
|
Frequency = pzem.frequency();
|
|
PF = pzem.pf();
|
|
// Menghitung Apparent Power (VA)
|
|
if (PF == 0) {
|
|
VA = 0;
|
|
} else {
|
|
VA = Power / PF;
|
|
}
|
|
// Menghitung Reactive Power (VAR)
|
|
if (PF == 0) {
|
|
VAR = 0;
|
|
} else {
|
|
VAR = Power / PF * sqrt(1-sq(PF));
|
|
}
|
|
// Memeriksa validitas data
|
|
if (isnan(Voltage)) {
|
|
Serial.println("Error membaca tegangan");
|
|
} else {
|
|
// Menampilkan nilai-nilai pada Serial console
|
|
Serial.print("Voltage : ");
|
|
Serial.print(Voltage);
|
|
Serial.println("V");
|
|
}
|
|
if (isnan(Current)) {
|
|
Serial.println("Error membaca arus");
|
|
} else {
|
|
Serial.print("Current : ");
|
|
Serial.print(Current);
|
|
Serial.println("A");
|
|
}
|
|
if (isnan(Power)) {
|
|
Serial.println("Error membaca daya");
|
|
} else {
|
|
Serial.print("Power : ");
|
|
Serial.print(Power);
|
|
Serial.println("W");
|
|
}
|
|
|
|
if (isnan(Frequency)) {
|
|
Serial.println("Error membaca frekuensi");
|
|
} else {
|
|
Serial.print("Frequency : ");
|
|
Serial.print(Frequency);
|
|
Serial.println("Hz");
|
|
}
|
|
if (isnan(PF)) {
|
|
Serial.println("Error membaca faktor daya");
|
|
} else {
|
|
Serial.print("Faktor Daya : ");
|
|
Serial.print(PF);
|
|
Serial.println("PF");
|
|
}
|
|
if (isnan(VA)) {
|
|
Serial.println("Error membaca apparent power");
|
|
} else {
|
|
Serial.print("Apparent Power : ");
|
|
Serial.print(VA);
|
|
Serial.println("VA");
|
|
}
|
|
if (isnan(VAR)) {
|
|
Serial.println("Error membaca reactive power");
|
|
} else {
|
|
Serial.print("Reactive Power : ");
|
|
Serial.print(VAR);
|
|
Serial.println("VAR");
|
|
}
|
|
if (isnan(Energy)) {
|
|
Serial.println("Error membaca energi");
|
|
} else {
|
|
// Menghitung total daya dalam watt-menit
|
|
totalPower += Power * ((millis() - startTime) / 1000.0) / 60.0; // Mengubah watt-detik menjadi watt-menit
|
|
// Memeriksa apakah satu detik telah berlalu
|
|
if (millis() - startTime >= 1000) { // 1000 milidetik = 1 detik
|
|
Energy = totalPower / 1000.0; // Mengubah watt-menit menjadi kilowatt-jam
|
|
totalCost = Energy * 1352.0; // Mengalikan dengan biaya per kilowatt-jam
|
|
Serial.print("Energy : ");
|
|
Serial.print(Energy);
|
|
Serial.println("kWh");
|
|
}
|
|
}
|
|
if (isnan(totalCost)){
|
|
Serial.println("Error menghitung biaya");
|
|
} else {
|
|
Serial.print("Total Biaya: ");
|
|
Serial.println(totalCost);
|
|
startTime = millis(); // Mengatur ulang waktu awal untuk detik berikutnya
|
|
}
|
|
|
|
// Mengaktifkan buzzer jika Apparent Power dalam rentang 90-100 VA
|
|
if (VA >= 90 && VA <= 100) {
|
|
digitalWrite(buzzerPin, HIGH);
|
|
delay(1000);
|
|
digitalWrite(buzzerPin, LOW);
|
|
delay(1000);
|
|
thing.call_endpoint("monitor_listrik"); // memanggil endpoint yang telah dibuat
|
|
} else {
|
|
digitalWrite(buzzerPin, LOW);
|
|
}
|
|
|
|
// Jika Apparent Power lebih dari 100 VA, matikan relay1
|
|
if (VA > 100) {
|
|
if (relay1State == HIGH) {
|
|
digitalWrite(relay1, LOW);
|
|
relay1State = LOW;
|
|
thing.call_endpoint("monitor_listrik1"); // memanggil endpoint yang telah dibuat
|
|
}
|
|
} else {
|
|
digitalWrite(relay1, HIGH);
|
|
relay1State = HIGH;
|
|
thing.call_endpoint("monitor_listrik2");
|
|
delay(60000)
|
|
}
|
|
}
|
|
|
|
Serial.println();
|
|
delay(1000);
|
|
}
|