#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#define MQ135_PIN 34
#define DHTPIN 15
#define DHTTYPE DHT22
#define LED_HIJAU 18
#define LED_MERAH 19
#define BUZZER 5
#define BATAS_UDARA 1500
DHT dht(DHTPIN, DHTTYPE);
// WiFi khusus Wokwi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker
const char* mqtt_server = "broker.emqx.io";
const int mqtt_port = 1883;
// Topic untuk MQTTX dan dashboard
const char* mqtt_topic = "scatech/monitoring/data";
WiFiClient espClient;
PubSubClient client(espClient);
void setup_wifi() {
Serial.print("Menghubungkan WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi terhubung");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
void reconnect_mqtt() {
while (!client.connected()) {
Serial.print("Menghubungkan MQTT... ");
String clientId = "ESP32_Scatech_";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("berhasil");
} else {
Serial.print("gagal, rc=");
Serial.print(client.state());
Serial.println(" coba lagi 2 detik");
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED_HIJAU, OUTPUT);
pinMode(LED_MERAH, OUTPUT);
pinMode(BUZZER, OUTPUT);
analogReadResolution(12);
dht.begin();
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_MERAH, LOW);
noTone(BUZZER);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
Serial.println("Monitoring Kualitas Udara dan Kelembaban");
}
void loop() {
if (!client.connected()) {
reconnect_mqtt();
}
client.loop();
int airQuality = analogRead(MQ135_PIN);
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
if (isnan(suhu) || isnan(kelembaban)) {
Serial.println("Gagal membaca sensor DHT22!");
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_MERAH, HIGH);
tone(BUZZER, 1000);
delay(2000);
return;
}
String statusUdara;
Serial.println("====================");
Serial.print("Air Quality : ");
Serial.println(airQuality);
Serial.print("Suhu : ");
Serial.print(suhu);
Serial.println(" C");
Serial.print("Kelembaban : ");
Serial.print(kelembaban);
Serial.println(" %");
if (airQuality < BATAS_UDARA) {
digitalWrite(LED_HIJAU, HIGH);
digitalWrite(LED_MERAH, LOW);
noTone(BUZZER);
statusUdara = "BAIK";
Serial.println("Status Udara : BAIK");
} else {
digitalWrite(LED_HIJAU, LOW);
digitalWrite(LED_MERAH, HIGH);
tone(BUZZER, 1000);
statusUdara = "BURUK";
Serial.println("Status Udara : BURUK");
}
String payload = "{";
payload += "\"suhu\":";
payload += String(suhu, 1);
payload += ",";
payload += "\"kelembaban\":";
payload += String(kelembaban, 1);
payload += ",";
payload += "\"airQuality\":";
payload += String(airQuality);
payload += ",";
payload += "\"status\":\"";
payload += statusUdara;
payload += "\"";
payload += "}";
client.publish(mqtt_topic, payload.c_str());
Serial.print("Publish MQTT ke topic ");
Serial.print(mqtt_topic);
Serial.print(" : ");
Serial.println(payload);
delay(2000);
}