#include <WiFi.h>
#include <MQTT.h>
#include <Wire.h>
#include <RTClib.h> // Library untuk RTC (Real-Time Clock)
// Konfigurasi WiFi
const char* ssid = "Wokwi-GUEST"; // Ganti dengan SSID WiFi kamu
const char* password = ""; // Ganti dengan password WiFi kamu
// Konfigurasi MQTT
const char* mqttServer = "mountainrat662.cloud.shiftr.io";
const char* mqttUser = "mountainrat662";
const char* mqttPassword = "b0X48fxDejD3HhdU";
const int mqttPort = 1883;
WiFiClient net;
MQTTClient client;
// Pin definisi
const int pirPin = 13; // Pin untuk sensor PIR
const int ledPin = 12; // Pin untuk LED (simulasi lampu)
// Variabel untuk menyimpan status
bool isRoomOccupied = false; // Apakah ada orang di ruangan
bool isSleepingTime = false; // Apakah waktu tidur
// RTC
RTC_DS3231 rtc;
DateTime now;
// Waktu tidur (dapat diatur oleh pengguna)
int sleepHourStart = 22; // Jam mulai tidur (default: 22:00)
int sleepHourEnd = 5; // Jam bangun tidur (default: 05:00)
// Variabel untuk interval pencetakan waktu
unsigned long lastPrintTime = 0;
const unsigned long printInterval = 10000; // Interval 10 detik
// Fungsi untuk menghubungkan ke WiFi
void setupWiFi() {
Serial.println("Menghubungkan ke WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Terhubung ke WiFi!");
}
// Fungsi untuk menghubungkan ke broker MQTT
void reconnect() {
while (!client.connect("ESP32Client", mqttUser, mqttPassword)) {
Serial.print("Menghubungkan ke MQTT...");
Serial.print("Gagal, rc=");
Serial.print(client.lastError());
delay(2000);
}
Serial.println("Terhubung ke broker MQTT");
// Set Will message
client.publish("home/livingroom/lamp", "offline");
}
void setup() {
pinMode(pirPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// Inisialisasi serial monitor
Serial.begin(115200);
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("RTC tidak ditemukan");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC kehilangan daya, mengatur ulang waktu!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Membaca waktu tidur dari serial
Serial.println("Set jam tidur (0-23):");
while (Serial.available() == 0) {}
sleepHourStart = Serial.parseInt();
Serial.println("Set jam bangun (0-23):");
while (Serial.available() == 0) {}
sleepHourEnd = Serial.parseInt();
Serial.print("Jam tidur diset ke: ");
Serial.println(sleepHourStart);
Serial.print("Jam bangun diset ke: ");
Serial.println(sleepHourEnd);
// Setup WiFi dan MQTT
setupWiFi();
client.begin(mqttServer, mqttPort, net);
reconnect();
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
now = rtc.now(); // Baca waktu saat ini
// Periksa interval untuk mencetak waktu saat ini
if (millis() - lastPrintTime >= printInterval) {
Serial.print("Waktu saat ini: ");
Serial.print(now.hour());
Serial.print(":");
Serial.println(now.minute());
lastPrintTime = millis(); // Reset waktu terakhir cetak
}
// Perbaikan logika waktu tidur
if (sleepHourStart < sleepHourEnd) {
isSleepingTime = (now.hour() >= sleepHourStart && now.hour() < sleepHourEnd);
} else {
isSleepingTime = (now.hour() >= sleepHourStart || now.hour() < sleepHourEnd);
}
int pirState = digitalRead(pirPin); // Membaca status dari PIR sensor
if (!isSleepingTime) {
// Jika bukan waktu tidur, kontrol lampu berdasarkan deteksi gerakan
if (pirState == HIGH) {
// Ada gerakan, nyalakan lampu
isRoomOccupied = true;
digitalWrite(ledPin, HIGH);
Serial.println("Lampu ON: Ada gerakan terdeteksi");
client.publish("home/livingroom/lamp", "on"); // Kirim pesan MQTT
delay(5000); // Delay untuk menghindari spam
} else {
// Tidak ada gerakan, cek apakah ruangan kosong
if (isRoomOccupied) {
// Ruangan kosong, matikan lampu setelah beberapa saat
delay(5000); // Tunggu 5 detik sebelum mematikan lampu
isRoomOccupied = false;
digitalWrite(ledPin, LOW);
Serial.println("Lampu OFF: Ruangan kosong");
client.publish("home/livingroom/lamp", "off"); // Kirim pesan MQTT
delay(5000); // Delay untuk menghindari spam
}
}
} else {
// Jika waktu tidur, matikan lampu dan abaikan deteksi gerakan
digitalWrite(ledPin, LOW);
client.publish("home/livingroom/lamp", "off"); // Kirim pesan MQTT
Serial.println("Waktu tidur: Lampu tetap OFF");
}
delay(1000); // Delay untuk pembacaan berikutnya
}