#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Konfigurasi WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Konfigurasi MQTT
const char* mqtt_server = "broker.hivemq.com"; // Menggunakan broker publik
const int mqtt_port = 1883;
const char* mqtt_topic = "sensor/airquality";
// Pin Konfigurasi
const int SENSOR_PIN = 34; // Pin potentiometer
const int LED_GREEN = 18; // Pin LED hijau
const int LED_YELLOW = 5; // Pin LED kuning
const int LED_ORANGE = 17; // Pin LED oranye
const int LED_RED = 16; // Pin LED merah
const int BUZZER_PIN = 19; // Pin buzzer
// Inisialisasi objek
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD (0x27 atau 0x3F)
// Variabel untuk menyimpan nilai sensor
int airQuality = 0;
unsigned long lastMsg = 0;
// Fungsi untuk mendapatkan status kualitas udara
String getAirQualityStatus(int value) {
if (value <= 50) {
return "Good";
} else if (value <= 100) {
return "Moderate";
} else if (value <= 200) {
return "Unhealthy";
} else {
return "Very Unhealthy";
}
}
void updateLCD(int value) {
lcd.clear();
// Baris pertama: Air Quality: [nilai]
lcd.setCursor(0, 0);
lcd.print("Air Quality: ");
lcd.print(value);
// Baris kedua: Status kualitas udara
lcd.setCursor(0, 1);
lcd.print(getAirQualityStatus(value));
}
// Callback function untuk MQTT untuk menangani pesan yang diterima
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message received on topic: ");
Serial.println(topic);
Serial.print("Message: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void setup() {
Serial.begin(115200);
// Inisialisasi pin
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_ORANGE, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.print("Air Quality");
lcd.setCursor(0, 1);
lcd.print("Monitoring");
// Koneksi WiFi
setup_wifi();
// Konfigurasi MQTT
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void setup_wifi() {
delay(100);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
if(WiFi.status() == WL_CONNECTED) {
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("");
Serial.println("WiFi connection failed!");
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
client.subscribe(mqtt_topic); // Subscribe ke topic yang sama
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void updateLEDs(int value) {
// Matikan semua LED
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_ORANGE, LOW);
digitalWrite(LED_RED, LOW);
digitalWrite(BUZZER_PIN, LOW);
// Nyalakan LED sesuai nilai
if (value <= 50) {
digitalWrite(LED_GREEN, HIGH); // Kualitas bagus
} else if (value <= 100) {
digitalWrite(LED_YELLOW, HIGH); // Kualitas sedang
} else if (value <= 200) {
digitalWrite(LED_ORANGE, HIGH); // Tidak sehat
} else {
digitalWrite(LED_RED, HIGH); // Sangat tidak sehat
digitalWrite(BUZZER_PIN, HIGH); // Aktifkan buzzer
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
unsigned long now = millis();
if (now - lastMsg > 2000) { // Kirim data setiap 2 detik
lastMsg = now;
// Baca nilai sensor (potentiometer)
airQuality = analogRead(SENSOR_PIN);
// Konversi nilai ADC (0-4095) ke PPM (0-500)
airQuality = map(airQuality, 0, 4095, 0, 500);
// Update LED dan LCD
updateLEDs(airQuality);
updateLCD(airQuality);
// Kirim data ke MQTT
String msg = String(airQuality);
client.publish(mqtt_topic, msg.c_str());
// Print ke Serial untuk debugging
Serial.print("Air Quality: ");
Serial.print(airQuality);
Serial.println(" PPM");
}
}