ahmad_faizin/TKK_E32210638

280 lines
8.5 KiB
Plaintext

#include <ThingerESP32.h>
#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);
}