#include <Adafruit_Sensor.h>
#include <DHT.h>
#include "WiFi.h"
#include <PubSubClient.h>
const int KY_AOUT = 34;
const int DHTPIN = 4;
const int BUZZER_PIN = 19;
const int pinMQ = 35;
const int LED_PIN = 2;
#define DHTTYPE DHT22
//connect wifi
const char *ssid = "Wokwi-GUEST";
const char *password = "";
//connect mqtt
const char *mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char *mqtt_topic_temp = "/sensor/temp";
const char *mqtt_topic_flame = "/sensor/flame";
const char *mqtt_topic_gas = "/sensor/gas";
WiFiClient espClient;
PubSubClient client(espClient);
// Deklarasi Variabel untuk Pengiriman Data ke MQTT
unsigned long lastMsg = 0;
#define MSG_INTERVAL 2000 // Interval pengiriman data
DHT dht (DHTPIN,DHTTYPE);
const int treshold_api = 2500;
const int treshold_gas = 3630; //sekitar 450 ppm
const int treshold_suhu = 60;
// Method untuk Menghubungkan kembali ke MQTT jika Koneksi Terputus
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32Client1")) {
Serial.println("Connected to MQTT");
} else {
Serial.print("Failed with state ");
Serial.println(client.state());
delay(1000);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Set up MQTT client
client.setServer(mqtt_server, mqtt_port);
reconnect();
dht.begin();
pinMode(KY_AOUT, INPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
}
void loop() {
//cel koneksi mqtt mqtt
if (!client.connected()) {
reconnect();
}
client.loop();
// --- Pembatas per Loop agar mudah dibaca ---
Serial.println("\n====================== MONITORING ======================");
// 1. Read & Logika Api
int analogValue = analogRead(KY_AOUT);
Serial.print("Sensor Api : ");
Serial.println(analogValue);
// kirim data api ke mqtt broker
char FlameStr[8];
dtostrf(analogValue, 1, 2, FlameStr);
client.publish(mqtt_topic_flame, FlameStr);
Serial.print("Flame_Level MQTT : ");
Serial.println(FlameStr);
// Sensor Gas
int gasVal = analogRead(pinMQ);
Serial.print("Sensor Gas : ");
Serial.println(gasVal);
// kirim data gas ke mqtt broker
char gasStr[8];
dtostrf(gasVal, 1, 2, gasStr);
client.publish(mqtt_topic_gas, gasStr);
Serial.print("Gas_Value MQTT : ");
Serial.println(gasStr);
// Sensor Suhu
float t = dht.readTemperature();
if (isnan(t)) {
Serial.println("Gagal membaca dari sensor DHT!");
return;
}
Serial.print("Sensor Suhu : ");
Serial.print(t);
Serial.println(" °C");
// kirim data temp ke mqtt broker
char tempStr[8];
dtostrf(t, 1, 2, tempStr);
client.publish(mqtt_topic_temp, tempStr);
Serial.print("Temp MQTT : ");
Serial.println(tempStr);
// Logika API
if (analogValue >= treshold_api) {
Serial.println("Status Api : [BAHAYA] API TERDETEKSI!");
tone(BUZZER_PIN, 4000, 1000);
} else {
Serial.println("Status Api : [NORMAL]");
}
// Logika Gas
if (gasVal >= treshold_gas) {
Serial.println("Status Gas : [BAHAYA] KEBOCORAN GAS!");
tone(BUZZER_PIN, 4000, 500);
} else {
Serial.println("Status Gas : [NORMAL]");
}
// Logika Suhu
if (t >= treshold_suhu) {
Serial.println("Status Suhu : [BAHAYA] SUHU TINGGI!!");
} else {
Serial.println("Status Suhu : [NORMAL]");
}
delay(1000);
}