#include <WiFi.h>
#include <PubSubClient.h>
#include "DHTesp.h"
#include <AccelStepper.h>
const int SENSOR_PIN = 15;
DHTesp sensor;
const char* networkName = "Wokwi-GUEST";
const char* networkPass = "";
const char* mqttBroker = "test.mosquitto.org";
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
unsigned long prevTime = 0;
AccelStepper fanMotor(AccelStepper::FULL4WIRE, 32, 26, 27, 14);
float fanSpeed = 0;
void connectWiFi() {
delay(100);
Serial.println();
Serial.print("Connecting WiFi to ");
Serial.println(networkName);
WiFi.mode(WIFI_STA);
WiFi.begin(networkName, networkPass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected");
Serial.print("Assigned IP: ");
Serial.println(WiFi.localIP());
}
void mqttCallback(char* topic, byte* message, unsigned int length) {
Serial.print("Received [");
Serial.print(topic);
Serial.print("]: ");
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
}
Serial.println();
}
void mqttReconnect() {
while (!mqttClient.connected()) {
Serial.print("Connecting to MQTT...");
String clientID = "FanController-";
clientID += String(random(0xffff), HEX);
if (mqttClient.connect(clientID.c_str())) {
Serial.println("MQTT Connected");
mqttClient.subscribe("/esp32/fancontrol");
} else {
Serial.print("MQTT failed, rc=");
Serial.print(mqttClient.state());
Serial.println(" retrying in 5 seconds");
delay(5000);
}
}
}
void setFanSpeed(float tempValue) {
fanSpeed = 0;
if (tempValue >= 10 && tempValue < 20)
fanSpeed = 600;
else if (tempValue >= 20 && tempValue < 30)
fanSpeed = 1200;
else if (tempValue >= 30 && tempValue < 40)
fanSpeed = 1600;
else if (tempValue >= 40)
fanSpeed = 2000;
fanMotor.setSpeed(fanSpeed);
fanMotor.runSpeed();
}
void setup() {
Serial.begin(115200);
connectWiFi();
mqttClient.setServer(mqttBroker, 1883);
mqttClient.setCallback(mqttCallback);
sensor.setup(SENSOR_PIN, DHTesp::DHT22);
fanMotor.setMaxSpeed(2000);
fanMotor.setAcceleration(1000);
}
void loop() {
if (!mqttClient.connected()) {
mqttReconnect();
}
mqttClient.loop();
unsigned long currentTime = millis();
if (currentTime - prevTime > 2500) {
prevTime = currentTime;
TempAndHumidity values = sensor.getTempAndHumidity();
String temperature = String(values.temperature, 2);
String humidity = String(values.humidity, 1);
Serial.print("Temp: ");
Serial.println(temperature);
Serial.print("Humidity: ");
Serial.println(humidity);
mqttClient.publish("/esp32/temperature", temperature.c_str());
mqttClient.publish("/esp32/humidity", humidity.c_str());
setFanSpeed(values.temperature);
String fanSpeedStr = String(fanSpeed, 0);
Serial.print("Current Fan Speed: ");
Serial.println(fanSpeedStr);
mqttClient.publish("/esp32/fanSpeed", fanSpeedStr.c_str());
}
}