#include <WiFi.h>
#include <MQTT.h>
#include "DHT.h"
// =======================
// Konfigurasi WiFi
// =======================
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
// =======================
// Konfigurasi MQTT
// =======================
WiFiClient net;
MQTTClient client;
const char* broker = "broker.hivemq.com";
const int port = 1883;
const char* clientID = "3t2oVEaHzt"; // Gunakan Client ID kamu
// =======================
// Pin Sensor dan Aktuator
// =======================
#define DHT22Pin 5
#define ledRed 27
#define ledBlue 26
#define trigPin 23
#define echoPin 22
DHT dht(DHT22Pin, DHT22);
long duration;
int distance;
unsigned long lastMillis = 0;
// =======================
// Koneksi WiFi
// =======================
void connectWiFi() {
Serial.print("Menghubungkan ke WiFi");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.println("\nā
Terhubung ke WiFi!");
}
// =======================
// Callback MQTT
// =======================
void subscribeData(String &topic, String &data) {
Serial.println("===========================");
Serial.print("š© Topic: ");
Serial.println(topic);
Serial.print("š¦ Data: ");
Serial.println(data);
if (topic == "sabet/iot/led1") {
digitalWrite(ledRed, data.toInt());
client.publish("sabet/iot/statusled1", data.toInt() ? "ON" : "OFF", true, 1);
}
else if (topic == "sabet/iot/led2") {
digitalWrite(ledBlue, data.toInt());
client.publish("sabet/iot/statusled2", data.toInt() ? "ON" : "OFF", true, 1);
}
else if (topic == "sabet/iot/all_led_on") {
digitalWrite(ledRed, HIGH);
digitalWrite(ledBlue, HIGH);
client.publish("sabet/iot/statusled1", "ON", true, 1);
client.publish("sabet/iot/statusled2", "ON", true, 1);
}
else if (topic == "sabet/iot/all_led_off") {
digitalWrite(ledRed, LOW);
digitalWrite(ledBlue, LOW);
client.publish("sabet/iot/statusled1", "OFF", true, 1);
client.publish("sabet/iot/statusled2", "OFF", true, 1);
}
}
// =======================
// Sensor Ultrasonik
// =======================
void ultrasonic() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
Serial.print("š Jarak: ");
Serial.print(distance);
Serial.println(" cm");
if (distance >= 0 && distance < 51) {
client.publish("sabet/iot/level/rendah", "ON", true, 1);
client.publish("sabet/iot/level/sedang", "OFF", true, 1);
client.publish("sabet/iot/level/tinggi", "OFF", true, 1);
}
else if (distance >= 51 && distance <= 100) {
client.publish("sabet/iot/level/rendah", "OFF", true, 1);
client.publish("sabet/iot/level/sedang", "ON", true, 1);
client.publish("sabet/iot/level/tinggi", "OFF", true, 1);
}
else {
client.publish("sabet/iot/level/rendah", "OFF", true, 1);
client.publish("sabet/iot/level/sedang", "OFF", true, 1);
client.publish("sabet/iot/level/tinggi", "ON", true, 1);
}
}
// =======================
// Publish Data Sensor
// =======================
void publishData() {
float hum = dht.readHumidity();
float temp = dht.readTemperature();
ultrasonic();
Serial.print("š”ļø Suhu: ");
Serial.print(temp);
Serial.print(" °C | š§ Kelembapan: ");
Serial.print(hum);
Serial.println(" %");
client.publish("sabet/iot/dht/temp", String(temp), true, 1);
client.publish("sabet/iot/dht/humi", String(hum), true, 1);
client.publish("sabet/iot/level/cm", String(distance), true, 1);
}
// =======================
// Koneksi MQTT
// =======================
void connectMQTT() {
client.begin(broker, port, net);
client.onMessage(subscribeData);
Serial.print("Menghubungkan ke broker MQTT");
while (!client.connect(clientID)) { // gunakan Client ID
Serial.print(".");
delay(1000);
}
Serial.println("\nā
Terhubung ke broker MQTT!");
client.subscribe("sabet/iot/#", 1);
}
// =======================
// Setup Awal
// =======================
void setup() {
Serial.begin(9600);
pinMode(ledRed, OUTPUT);
pinMode(ledBlue, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
dht.begin();
connectWiFi();
connectMQTT();
}
// =======================
// Loop Utama
// =======================
void loop() {
client.loop();
// Reconnect jika terputus
if (!client.connected()) {
connectMQTT();
}
// Publish setiap 1 detik
if (millis() - lastMillis > 1000) {
lastMillis = millis();
publishData();
}
}