#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <ESP32Servo.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io";// MQTT broker
const int mqtt_port = 1883;
// MQTT topics
const char* dht22_topic = "esp32/dht22";
const char* servo_topic = "esp32/servo";
const char* fan_topic = "esp32/fan";
const char* led_topic = "esp32/led";
// Pin configuration
#define DHTPIN 15 // DHT22 data pin
#define DHTTYPE DHT22 // DHT22 sensor
#define SERVO_PIN 5 // Servo motor pin
#define FAN_PIN 13 // Fan pin (PWM)
#define LED_PIN 2 // Built-in LED pin
// Global variables
DHT dht(DHTPIN, DHTTYPE);
WiFiClient espClient;
PubSubClient client(espClient);
Servo servo;
int ledState = LOW;
// Function prototypes
void setup_wifi();
void reconnect();
void callback(char* topic, byte* message, unsigned int length);
void readDHT22Data();
void handleServo(String payload);
void handleFan(String payload);
void handleLED(String payload);
void setup() {
// Initialize Serial
Serial.begin(115200);
// Initialize DHT sensor
dht.begin();
// Initialize servo
servo.attach(SERVO_PIN);
servo.write(90); // Default position
// Initialize LED and Fan pins
pinMode(LED_PIN, OUTPUT);
pinMode(FAN_PIN, OUTPUT);
// Attach Fan to PWM channel
// Connect to WiFi and MQTT
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Periodically send DHT22 data
static unsigned long lastDHT22Read = 0;
if (millis() - lastDHT22Read >= 5000) { // Every 5 seconds
lastDHT22Read = millis();
readDHT22Data();
}
}
// Connect to WiFi
void setup_wifi() {
delay(10);
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected.");
}
// Reconnect to MQTT broker
void reconnect() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("ESP32_Client")) {
Serial.println("Connected to MQTT.");
// Subscribe to topics
client.subscribe(servo_topic);
client.subscribe(fan_topic);
client.subscribe(led_topic);
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds...");
delay(5000);
}
}
}
// Handle incoming MQTT messages
void callback(char* topic, byte* message, unsigned int length) {
String payload;
for (unsigned int i = 0; i < length; i++) {
payload += (char)message[i];
}
if (String(topic) == servo_topic) {
handleServo(payload);
} else if (String(topic) == fan_topic) {
handleFan(payload);
} else if (String(topic) == led_topic) {
handleLED(payload);
}
}
// Read and publish DHT22 sensor data
void readDHT22Data() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT22 sensor.");
return;
}
String temp = String(temperature, 1);
client.publish("/esp32/temp", temp.c_str());
String hum = String(humidity, 1);
client.publish("/esp32/hum", hum.c_str());
}
// Control the servo motor
void handleServo(String payload) {
int angle = payload.toInt();
angle = constrain(angle, 0, 180);
servo.write(angle);
Serial.println("Servo set to angle: " + String(angle));
}
// Control the fan (PWM)
void handleFan(String payload) {
int speed = payload.toInt();
speed = constrain(speed, 0, 100);
int pwmValue = map(speed, 0, 100, 0, 255);
ledcWrite(0, pwmValue); // Set the PWM duty cycle for Fan pin
Serial.println("Fan speed set to: " + String(speed) + "%");
}
// Toggle the LED
void handleLED(String payload) {
if (payload == "toggle") {
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
Serial.println("LED toggled to: " + String(ledState ? "ON" : "OFF"));
}
}