#include <Wire.h>
#include <WiFi.h>
#include <MQTT.h>
#include <LiquidCrystal_I2C.h>
#define BUZZER_PIN 13
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
// Pin I2C untuk ESP32
#define I2C_SDA 21
#define I2C_SCL 22
WiFiClient net;
MQTTClient client;
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_ROWS);
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
const char topic[] = "andra/andra";
void setup() {
Serial.begin(9600);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, HIGH);
delay(1000);
digitalWrite(BUZZER_PIN, LOW);
Wire.begin(I2C_SDA, I2C_SCL);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Waiting for Data");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("Terhubung ke WiFi");
client.begin("broker.emqx.io", net);
client.setWill("andra/andra/status", "Offline", true, 1);
client.onMessage(messageReceived);
connect();
}
void loop() {
client.loop();
delay(10);
if (!client.connected()) {
connect();
}
}
void connect() {
Serial.print("Menghubungkan ke broker MQTT...");
while (!client.connect("ESP32-Subscriber")) {
Serial.print(".");
delay(500);
}
Serial.println("Terhubung ke broker!");
client.publish("andra/andra/status", "Online", true, 1);
client.subscribe(topic);
}
void messageReceived(String &topic, String &payload) {
Serial.println("Pesan diterima di topik [" + topic + "]: " + payload);
float suhu = payload.toFloat();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: " + String(suhu) + "C");
if (suhu >= 40) {
digitalWrite(BUZZER_PIN, HIGH);
tone(BUZZER_PIN, 1000);
lcd.setCursor(0, 1);
lcd.print("Bahaya! Panas");
} else {
digitalWrite(BUZZER_PIN, LOW);
noTone(BUZZER_PIN);
lcd.setCursor(0, 1);
lcd.print("Suhu Normal");
}
}