280 lines
8.5 KiB
Plaintext
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);
|
|
} |