#include <WiFi.h>
#include <DHT.h>
#include <MQTT.h>
// 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;
// Definisi pin
#define DHTPIN 21 // Pin untuk DHT22
#define DHTTYPE DHT22 // Tipe DHT yang digunakan
#define FAN_RELAY_PIN 16 // Pin relay untuk Kipas
#define AC_RELAY_PIN 17 // Pin relay untuk AC
#define PIR_PIN 13 // Pin untuk PIR sensor
// Inisialisasi DHT sensor
DHT dht(DHTPIN, DHTTYPE);
// Variabel untuk status
bool isPersonPresent = false; // Status kehadiran orang
float temperature = 0.0; // Suhu yang dibaca
// Fungsi untuk menghubungkan ke WiFi
void setupWiFi() {
Serial.print("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(FAN_RELAY_PIN, OUTPUT);
pinMode(AC_RELAY_PIN, OUTPUT);
pinMode(PIR_PIN, INPUT);
Serial.begin(115200);
dht.begin();
// Setup WiFi dan MQTT
setupWiFi();
client.begin(mqttServer, mqttPort, net);
reconnect();
}
void loop() {
// Membaca suhu
temperature = dht.readTemperature(); // Membaca suhu dalam Celsius
// Cek apakah pembacaan suhu valid
if (isnan(temperature)) {
Serial.println("Gagal membaca suhu!");
return;
}
// Cek kehadiran orang
isPersonPresent = digitalRead(PIR_PIN) == HIGH; // Membaca status PIR
// Kontrol Kipas dan AC berdasarkan suhu dan kehadiran orang
if (isPersonPresent) {
// Jika ada orang dan suhu lebih dari 30 derajat
if (temperature > 30) {
digitalWrite(FAN_RELAY_PIN, HIGH); // Nyalakan Kipas
digitalWrite(AC_RELAY_PIN, LOW); // Matikan AC
Serial.println("Kipas ON, AC OFF");
client.publish("home/livingroom/status", "Kipas ON, AC OFF");
} else {
digitalWrite(FAN_RELAY_PIN, LOW); // Matikan Kipas jika suhu <= 30
Serial.println("Kipas OFF");
client.publish("home/livingroom/status", "Kipas OFF");
}
} else {
// Jika tidak ada orang dan suhu lebih dari 30 derajat
if (temperature > 30) {
digitalWrite(FAN_RELAY_PIN, LOW); // Matikan Kipas
digitalWrite(AC_RELAY_PIN, HIGH); // Nyalakan AC
Serial.println("Kipas OFF, AC ON");
client.publish("home/livingroom/status", "Kipas OFF, AC ON");
} else if (temperature <= 26) {
digitalWrite(AC_RELAY_PIN, LOW); // Matikan AC jika suhu <= 26
Serial.println("AC OFF: Suhu cukup dingin");
client.publish("home/livingroom/status", "AC OFF: Suhu cukup dingin");
}
}
// Tampilkan suhu di serial monitor
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.println(" °C");
delay(2000); // Delay sebelum pembacaan berikutnya
}