#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
// Konfigurasi WiFi
const char* ssid = "Nama WiFi Anda";
const char* password = "Kata Sandi WiFi Anda";
// Konfigurasi MQTT
const char* mqttServer = "IP_Broker_MQTT";
const int mqttPort = 1883;
const char* mqttUser = "User_MQTT";
const char* mqttPassword = "Password_MQTT";
const char* clientID = "ESP32_Client";
// Konfigurasi sensor suhu dan kelembapan
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Konfigurasi sensor tingkat air dalam tandon air
const int trigPin = 23;
const int echoPin = 22;
// Konfigurasi relay lampu teras dan pompa air
const int relayLampuPin = 2;
const int relayPompaPin = 3;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(relayLampuPin, OUTPUT);
pinMode(relayPompaPin, OUTPUT);
dht.begin();
// Menghubungkan ke jaringan WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Menghubungkan ke WiFi...");
}
Serial.println("Terhubung ke WiFi");
// Menghubungkan ke broker MQTT
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
while (!client.connected()) {
Serial.println("Menghubungkan ke MQTT...");
if (client.connect(clientID, mqttUser, mqttPassword)) {
Serial.println("Terhubung ke MQTT");
} else {
Serial.print("Gagal menghubungkan ke MQTT, mencoba lagi dalam 5 detik...");
delay(5000);
}
}
}
void loop() {
client.loop();
// Membaca suhu dan kelembapan
float suhu = dht.readTemperature();
float kelembapan = dht.readHumidity();
// Membaca tingkat air dalam tandon air
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1; // Konversi ke sentimeter
// Mengepublish data ke MQTT
char suhuStr[6];
char kelembapanStr[6];
char tingkatAirStr[6];
dtostrf(suhu, 4, 2, suhuStr);
dtostrf(kelembapan, 4, 2, kelembapanStr);
itoa(distance, tingkatAirStr, 10);
client.publish("rumah/suhu", suhuStr);
client.publish("rumah/kelembapan", kelembapanStr);
client.publish("tandon/tingkatAir", tingkatAirStr);
// Kontrol lampu teras dan pompa air berdasarkan kondisi tertentu
if (suhu > 28.0) {
digitalWrite(relayLampuPin, HIGH); // Hidupkan lampu teras jika suhu tinggi
} else {
digitalWrite(relayLampuPin, LOW); // Matikan lampu teras jika suhu normal
}
if (distance < 10) {
digitalWrite(relayPompaPin, HIGH); // Hidupkan pompa air jika tingkat air rendah
} else {
digitalWrite(relayPompaPin, LOW); // Matikan pompa air jika tingkat air cukup
}
delay(60000); // Baca dan publish data setiap 60 detik
}
void callback(char* topic, byte* payload, unsigned int length) {
// Tambahkan kode untuk menangani pesan yang diterima jika diperlukan
}