#include <WiFi.h>
#include <PubSubClient.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
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);
Servo fanServo;
const int SERVO_PIN = 18;
void setup() {
Serial.begin(115200);
fanServo.attach(SERVO_PIN);
lcd.init();
lcd.backlight();
lcd.print("ceiling fan ");
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) message += (char)payload[i];
int speed = message.toInt();
int angle = map(speed, 0, 3, 0, 180); // 0–3 → 0–180°
fanServo.write(angle);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("MQTT Received");
lcd.setCursor(0, 1);
lcd.print("Speed: ");
lcd.print(speed);
}
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
}
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32_Receiver")) {
client.subscribe("home/fan/speed");
} else {
delay(2000);
}
}
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
}