#include <WiFi.h>
#include <MQTT.h>
#include "DHT.h"
// =======================
// WiFi
// =======================
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
// =======================
// MQTT
// =======================
WiFiClient net;
MQTTClient client;
const char* broker = "broker.hivemq.com";
const int port = 1883;
const char* clientID = "3t2oVEaHzt";
// =======================
// Pin Sensor & Aktuator
// =======================
#define DHT_PIN 5
#define DHT_TYPE DHT22
#define LED_RED 27
#define LED_BLUE 26
#define TRIG_PIN 23
#define ECHO_PIN 22
DHT dht(DHT_PIN, DHT_TYPE);
long durasi;
int jarak;
// =======================
// Koneksi WiFi
// =======================
void connectWiFi() {
Serial.print("Menghubungkan WiFi");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("\n✔ WiFi Connected!");
}
// =======================
// Callback MQTT
// =======================
void onMessage(String &topic, String &payload) {
Serial.println("========== MQTT MESSAGE ==========");
Serial.println("Topic : " + topic);
Serial.println("Payload : " + payload);
// LED 1
if (topic == "sabet/iot/led1") {
digitalWrite(LED_RED, payload.toInt());
client.publish("sabet/iot/statusled1", payload.toInt() ? "ON" : "OFF");
}
// LED 2
if (topic == "sabet/iot/led2") {
digitalWrite(LED_BLUE, payload.toInt());
client.publish("sabet/iot/statusled2", payload.toInt() ? "ON" : "OFF");
}
// ALL LED ON
if (topic == "sabet/iot/all_led_on") {
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_BLUE, HIGH);
client.publish("sabet/iot/statusled1", "ON");
client.publish("sabet/iot/statusled2", "ON");
}
// ALL LED OFF
if (topic == "sabet/iot/all_led_off") {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_BLUE, LOW);
client.publish("sabet/iot/statusled1", "OFF");
client.publish("sabet/iot/statusled2", "OFF");
}
}
// =======================
// Fungsi Ultrasonik
// =======================
int bacaUltrasonik() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(3);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
durasi = pulseIn(ECHO_PIN, HIGH);
jarak = durasi * 0.034 / 2;
return jarak;
}
// =======================
// Publish Data Sensor
// =======================
void publishData() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int cm = bacaUltrasonik();
Serial.print("Temp: ");
Serial.print(temp);
Serial.print(" | Hum: ");
Serial.print(hum);
Serial.print(" | Jarak: ");
Serial.print(cm);
Serial.println(" cm");
client.publish("sabet/iot/dht/temp", String(temp));
client.publish("sabet/iot/dht/humi", String(hum));
client.publish("sabet/iot/level/cm", String(cm));
// Level ketinggian air
if (cm < 51) {
client.publish("sabet/iot/level/rendah", "ON");
client.publish("sabet/iot/level/sedang", "OFF");
client.publish("sabet/iot/level/tinggi", "OFF");
}
else if (cm <= 100) {
client.publish("sabet/iot/level/rendah", "OFF");
client.publish("sabet/iot/level/sedang", "ON");
client.publish("sabet/iot/level/tinggi", "OFF");
}
else {
client.publish("sabet/iot/level/rendah", "OFF");
client.publish("sabet/iot/level/sedang", "OFF");
client.publish("sabet/iot/level/tinggi", "ON");
}
}
// =======================
// Koneksi MQTT
// =======================
void connectMQTT() {
client.begin(broker, port, net);
client.onMessage(onMessage);
Serial.print("Menghubungkan MQTT");
while (!client.connect(clientID)) {
Serial.print(".");
delay(500);
}
Serial.println("\n✔ MQTT Connected!");
client.subscribe("sabet/iot/#");
}
// =======================
// Setup
// =======================
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(LED_RED, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
connectWiFi();
connectMQTT();
}
// =======================
// Loop
// =======================
unsigned long lastSend = 0;
void loop() {
client.loop();
if (!client.connected()) {
connectMQTT();
}
if (millis() - lastSend > 1000) {
lastSend = millis();
publishData();
}
}