#include // Library Thinger.io untuk ESP8266 #include // Library untuk sensor PZEM004Tv30 #include // 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); }