#include #define USERNAME "ahmadfaizin8" #define DEVICE_ID "ESP32" #define DEVICE_CREDENTIAL "roblox.com" const char* SSID = "Home"; const char* SSID_PASSWORD = "sijiloro"; // Definisikan pin relay const int relayTeras = 23; const int relaySamping = 22; const int relayRuangTamu = 21; const int relayKamar = 19; const int relayPLTS1 = 18; // Relay pertama untuk PLTS const int relayPLTS2 = 5; // Relay kedua untuk PLTS const int relayAutoPLTS = 15; // Relay untuk mengaktifkan/mematikan mode otomatis PLTS // Definisikan pin sensor LDR const int ldrPin = 34; // Definisikan pin buzzer const int buzzerPin = 13; // Definisikan pin push button const int buttonPin = 4; // Ambang batas untuk mendeteksi cahaya matahari const int ldrThreshold = 1000; // Variabel untuk menyimpan status mode otomatis bool autoMode = false; // Variabel untuk menyimpan status tombol sebelumnya bool lastButtonState = HIGH; // Inisialisasi Thinger.io ThingerESP32 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL); void setup() { Serial.begin(115200); // Inisialisasi Serial Monitor Serial2.begin(9600, SERIAL_8N1, 16, 17); // RX, TX pada pin 16 dan 17 // Menghubungkan ke WiFi Serial.print("Connecting to WiFi"); WiFi.begin(SSID, SSID_PASSWORD); // Menunggu sampai WiFi terhubung while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); // Konfigurasikan pin relay sebagai output pinMode(relayTeras, OUTPUT); pinMode(relaySamping, OUTPUT); pinMode(relayRuangTamu, OUTPUT); pinMode(relayKamar, OUTPUT); pinMode(relayPLTS1, OUTPUT); // Konfigurasi pin relay PLTS1 sebagai output pinMode(relayPLTS2, OUTPUT); // Konfigurasi pin relay PLTS2 sebagai output pinMode(relayAutoPLTS, OUTPUT); // Konfigurasi pin relay Auto PLTS sebagai output // Konfigurasikan pin buzzer sebagai output pinMode(buzzerPin, OUTPUT); // Konfigurasikan pin push button sebagai input dengan pull-up internal pinMode(buttonPin, INPUT_PULLUP); // Inisialisasi relay dalam kondisi mati (tergantung pada logika relay Anda, biasanya HIGH atau LOW) digitalWrite(relayTeras, HIGH); digitalWrite(relaySamping, HIGH); digitalWrite(relayRuangTamu, HIGH); digitalWrite(relayKamar, HIGH); digitalWrite(relayPLTS1, HIGH); // Inisialisasi relay PLTS1 dalam kondisi mati digitalWrite(relayPLTS2, HIGH); // Inisialisasi relay PLTS2 dalam kondisi mati digitalWrite(relayAutoPLTS, HIGH); // Inisialisasi relay Auto PLTS dalam kondisi mati // Tentukan resource pada Thinger.io untuk mengirim semua data sekaligus thing["all_data"] >> [](pson &out){ String data = Serial2.readStringUntil('\n'); float solarVoltage = parseData(data, "solar"); float batteryVoltage = parseData(data, "battery"); float acVoltage = parseData(data, "ac_voltage"); float acCurrent = parseData(data, "ac_current"); float acPower = parseData(data, "ac_power"); float acEnergy = parseData(data, "ac_energy"); float acFrequency = parseData(data, "ac_frequency"); float acPowerFactor = parseData(data, "ac_power_factor"); // Memasukkan data ke dalam pson if (solarVoltage >= 0) out["solar_voltage"] = solarVoltage; if (batteryVoltage >= 0) out["battery_voltage"] = batteryVoltage; if (acVoltage >= 0) out["ac_voltage"] = acVoltage; if (acCurrent >= 0) out["ac_current"] = acCurrent; if (acPower >= 0) out["ac_power"] = acPower; if (acEnergy >= 0) out["ac_energy"] = acEnergy; if (acFrequency >= 0) out["ac_frequency"] = acFrequency; if (acPowerFactor >= 0) out["ac_power_factor"] = acPowerFactor; Serial.println("All data sent to Thinger.io successfully"); }; // Resource untuk mengendalikan mode otomatis thing["auto_mode"] << [](pson &in) { if (in.is_empty()) { in = autoMode; } else { autoMode = in; } }; // Menambahkan resource untuk mengendalikan relay dan LED indikator melalui Thinger.io thing["relayTeras"] << [](pson &in){ if (in.is_empty()) { in = (digitalRead(relayTeras) == LOW); } else { digitalWrite(relayTeras, in ? LOW : HIGH); buzz(); // Panggil fungsi buzz setiap ada perubahan kondisi relay } }; thing["ledTeras"] >> [](pson &out){ out = (digitalRead(relayTeras) == LOW); }; thing["relaySamping"] << [](pson &in){ if (in.is_empty()) { in = (digitalRead(relaySamping) == LOW); } else { digitalWrite(relaySamping, in ? LOW : HIGH); buzz(); // Panggil fungsi buzz setiap ada perubahan kondisi relay } }; thing["ledSamping"] >> [](pson &out){ out = (digitalRead(relaySamping) == LOW); }; thing["relayRuangTamu"] << [](pson &in){ if (in.is_empty()) { in = (digitalRead(relayRuangTamu) == LOW); } else { digitalWrite(relayRuangTamu, in ? LOW : HIGH); buzz(); // Panggil fungsi buzz setiap ada perubahan kondisi relay } }; thing["ledRuangTamu"] >> [](pson &out){ out = (digitalRead(relayRuangTamu) == LOW); }; thing["relayKamar"] << [](pson &in){ if (in.is_empty()) { in = (digitalRead(relayKamar) == LOW); } else { digitalWrite(relayKamar, in ? LOW : HIGH); buzz(); // Panggil fungsi buzz setiap ada perubahan kondisi relay } }; thing["ledKamar"] >> [](pson &out){ out = (digitalRead(relayKamar) == LOW); }; // Resource untuk mengendalikan relay PLTS melalui Thinger.io thing["relayPLTS"] << [](pson &in){ if (in.is_empty()) { in = (digitalRead(relayPLTS1) == LOW && digitalRead(relayPLTS2) == LOW); } else { if (in) { turnOnPLTSRelay(); } else { turnOffPLTSRelay(); } buzz(); // Panggil fungsi buzz setiap ada perubahan kondisi relay } }; // Resource untuk mengendalikan relay Auto PLTS melalui Thinger.io thing["relayAutoPLTS"] << [](pson &in){ if (in.is_empty()) { in = (digitalRead(relayAutoPLTS) == LOW); } else { digitalWrite(relayAutoPLTS, in ? LOW : HIGH); buzz(); // Panggil fungsi buzz setiap ada perubahan kondisi relay } }; } void loop() { // Baca nilai LDR int ldrValue = analogRead(ldrPin); // Tampilkan nilai LDR di Serial Monitor // Serial.print("LDR Value: "); // Serial.println(ldrValue); // Baca status button bool buttonState = digitalRead(buttonPin); // Aktifkan atau matikan relay PLTS berdasarkan status button hanya jika ada perubahan if (buttonState != lastButtonState) { if (buttonState == HIGH) { // Tombol ditekan, aktifkan relay PLTS turnOnPLTSRelay(); } else { // Tombol dilepas, matikan relay PLTS turnOffPLTSRelay(); } lastButtonState = buttonState; // Simpan status tombol saat ini } // Jika mode otomatis aktif, kontrol relay berdasarkan nilai LDR if (autoMode) { if (ldrValue > ldrThreshold) { Serial.println("Sunlight detected, turning on all relays..."); turnOnRelaysSequentially(); } else { Serial.println("No sunlight detected, turning off all relays..."); turnOffRelaysSequentially(); } } // Jalankan Thinger.io thing.handle(); } // Fungsi untuk parse data berdasarkan tag float parseData(String data, String tag) { int startIndex = data.indexOf(tag + ":"); if (startIndex == -1) return -1; int endIndex = data.indexOf(",", startIndex); if (endIndex == -1) endIndex = data.length(); String valueStr = data.substring(startIndex + tag.length() + 1, endIndex); return valueStr.toFloat(); } // Fungsi untuk menyalakan semua relay secara berurutan void turnOnRelaysSequentially() { digitalWrite(relayTeras, LOW); delay(500); digitalWrite(relaySamping, LOW); delay(500); digitalWrite(relayRuangTamu, LOW); delay(500); digitalWrite(relayKamar, LOW); } // Fungsi untuk mematikan semua relay secara berurutan void turnOffRelaysSequentially() { digitalWrite(relayKamar, HIGH); delay(500); digitalWrite(relayRuangTamu, HIGH); delay(500); digitalWrite(relaySamping, HIGH); delay(500); digitalWrite(relayTeras, HIGH); } void turnOnPLTSRelay() { digitalWrite(relayPLTS1, LOW); // Nyalakan relay PLTS1 delay(1000); // Tunggu 2 detik digitalWrite(relayPLTS2, LOW); // Nyalakan relay PLTS2 buzz(); } void turnOffPLTSRelay() { digitalWrite(relayPLTS2, HIGH); // Matikan relay PLTS2 delay(1000); // Tunggu 2 detik digitalWrite(relayPLTS1, HIGH); // Matikan relay PLTS1 buzz(); } void buzz() { // Nyalakan buzzer selama 100ms digitalWrite(buzzerPin, HIGH); delay(500); digitalWrite(buzzerPin, LOW); }