commit d1e83eeb9435a57675bc746a018a46201a4537e5 Author: Ahmad_Faizin Date: Tue Jul 30 09:25:58 2024 +0700 kode_esp32 diff --git a/TKK_E32210638 b/TKK_E32210638 new file mode 100644 index 0000000..9ce5ea9 --- /dev/null +++ b/TKK_E32210638 @@ -0,0 +1,280 @@ +#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); +} \ No newline at end of file