#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define PIN_R 23
#define PIN_G 19
#define PIN_B 18
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 16, 2);
float suhu = 0;
float hum = 0;
void setRGB(int r, int g, int b) {
analogWrite(PIN_R, r);
analogWrite(PIN_G, g);
analogWrite(PIN_B, b);
}
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(suhu);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Hum : ");
lcd.print(hum);
lcd.print("%");
}
void callback(char* topic, byte* payload, unsigned int length) {
payload[length] = '\0';
String data = String((char*)payload);
if (String(topic) == "esp32/temperature") {
suhu = data.toFloat();
Serial.printf("Terima suhu: %.2f C\n", suhu);
if (suhu < 25) setRGB(0, 0, 255);
else if (suhu <= 30) setRGB(0, 255, 0);
else setRGB(255, 0, 0);
} else if (String(topic) == "esp32/humidity") {
hum = data.toFloat();
Serial.printf("Terima hum: %.2f %%\n", hum);
}
updateLCD();
}
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
Serial.print(".");
}
Serial.println("\nWiFi connected");
}
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32Subscriber")) {
Serial.println("MQTT connected");
client.subscribe("esp32/temperature");
client.subscribe("esp32/humidity");
} else {
delay(2000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PIN_R, OUTPUT);
pinMode(PIN_G, OUTPUT);
pinMode(PIN_B, OUTPUT);
lcd.init();
lcd.backlight();
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
}