#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Wire.h>
#include <DHTesp.h>
#include <ArduinoJson.h>
#include <SPIFFS.h>
const char* ssid = "SSID";
const char* password = "PASS";
#define RED_LED 12
#define GREEN_LED 13
#define BLUE_LED 14
#define LIGHT_1 2
#define LIGHT_2 4
#define LIGHT_3 5
#define LIGHT_4 18
#define LIGHT_5 19
#define FAN_IN1 32
#define FAN_IN2 33
#define FAN2_IN3 27
#define FAN2_IN4 26
#define DHT_PIN 15
float temperature = 0.0;
float humidity = 0.0;
bool fanStatus = false;
bool fan2Status = false;
bool fanAutoMode = true;
bool fan2AutoMode = true;
bool light1Status = false;
bool light2Status = false;
bool light3Status = false;
bool light4Status = false;
bool light5Status = false;
String rgbStatus = "OFF";
void setRedLight();
void setGreenLight();
void setBlueLight();
void setLightsOff();
void turnFanOn();
void turnFanOff();
void turnFan2On(); // New function for second fan
void turnFan2Off(); // New function for second fan
void updateSensorData();
String getDeviceStates();
DHTesp dht;
AsyncWebServer server(80);
AsyncEventSource events("/events");
void setRedLight() {
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, LOW);
}
void setGreenLight() {
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(BLUE_LED, LOW);
}
void setBlueLight() {
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, HIGH);
}
void setLightsOff() {
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, LOW);
}
void turnFanOn() {
digitalWrite(FAN_IN1, LOW);
digitalWrite(FAN_IN2, HIGH);
fanStatus = true;
}
void turnFanOff() {
digitalWrite(FAN_IN1, LOW);
digitalWrite(FAN_IN2, LOW);
fanStatus = false;
}
void turnFan2On() {
digitalWrite(FAN2_IN3, LOW);
digitalWrite(FAN2_IN4, HIGH);
fan2Status = true;
}
void turnFan2Off() {
digitalWrite(FAN2_IN3, LOW);
digitalWrite(FAN2_IN4, LOW);
fan2Status = false;
}
void updateSensorData() {
TempAndHumidity data = dht.getTempAndHumidity();
if (!isnan(data.temperature) && !isnan(data.humidity)) {
temperature = data.temperature;
humidity = data.humidity;
}
}
String getDeviceStates() {
JsonDocument doc;
doc["temperature"] = temperature;
doc["humidity"] = humidity;
doc["fan"] = fanStatus;
doc["fanAutoMode"] = fanAutoMode;
doc["fan2"] = fan2Status; // Add fan2 status to JSON
doc["fan2AutoMode"] = fan2AutoMode; // Add fan2 auto mode to JSON
doc["light1"] = light1Status;
doc["light2"] = light2Status;
doc["light3"] = light3Status;
doc["light4"] = light4Status;
doc["light5"] = light5Status;
doc["rgb"] = rgbStatus;
String jsonString;
serializeJson(doc, jsonString);
return jsonString;
}
void setup() {
Serial.begin(115200);
if (!SPIFFS.begin(true)) {
Serial.println("An error occurred while mounting SPIFFS");
return;
}
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
pinMode(LIGHT_1, OUTPUT);
pinMode(LIGHT_2, OUTPUT);
pinMode(LIGHT_3, OUTPUT);
pinMode(LIGHT_4, OUTPUT);
pinMode(LIGHT_5, OUTPUT);
pinMode(FAN_IN1, OUTPUT);
pinMode(FAN_IN2, OUTPUT);
pinMode(FAN2_IN3, OUTPUT); // Initialize new fan pins
pinMode(FAN2_IN4, OUTPUT); // Initialize new fan pins
digitalWrite(LIGHT_1, LOW);
digitalWrite(LIGHT_2, LOW);
digitalWrite(LIGHT_3, LOW);
digitalWrite(LIGHT_4, LOW);
digitalWrite(LIGHT_5, LOW);
setLightsOff();
turnFanOff();
turnFan2Off(); // Initialize new fan as off
dht.setup(DHT_PIN, DHTesp::DHT11);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/index.html", "text/html");
});
server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/style.css", "text/css");
});
server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(SPIFFS, "/script.js", "application/javascript");
});
server.on("/status", HTTP_GET, [](AsyncWebServerRequest * request) {
request->send(200, "application/json", getDeviceStates());
});
server.on("/light1", HTTP_POST, [](AsyncWebServerRequest * request) {
if (request->hasParam("state", true)) {
String state = request->getParam("state", true)->value();
light1Status = (state == "1");
digitalWrite(LIGHT_1, light1Status);
request->send(200, "text/plain", "OK");
} else {
request->send(400, "text/plain", "Bad Request");
}
});
server.on("/light2", HTTP_POST, [](AsyncWebServerRequest * request) {
if (request->hasParam("state", true)) {
String state = request->getParam("state", true)->value();
light2Status = (state == "1");
digitalWrite(LIGHT_2, light2Status);
request->send(200, "text/plain", "OK");
} else {
request->send(400, "text/plain", "Bad Request");
}
});
server.on("/light3", HTTP_POST, [](AsyncWebServerRequest * request) {
if (request->hasParam("state", true)) {
String state = request->getParam("state", true)->value();
light3Status = (state == "1");
digitalWrite(LIGHT_3, light3Status);
request->send(200, "text/plain", "OK");
} else {
request->send(400, "text/plain", "Bad Request");
}
});
server.on("/light4", HTTP_POST, [](AsyncWebServerRequest * request) {
if (request->hasParam("state", true)) {
String state = request->getParam("state", true)->value();
light4Status = (state == "1");
digitalWrite(LIGHT_4, light4Status);
request->send(200, "text/plain", "OK");
} else {
request->send(400, "text/plain", "Bad Request");
}
});
server.on("/light5", HTTP_POST, [](AsyncWebServerRequest * request) {
if (request->hasParam("state", true)) {
String state = request->getParam("state", true)->value();
light5Status = (state == "1");
digitalWrite(LIGHT_5, light5Status);
request->send(200, "text/plain", "OK");
} else {
request->send(400, "text/plain", "Bad Request");
}
});
server.on("/fan", HTTP_POST, [](AsyncWebServerRequest * request) {
if (request->hasParam("state", true) && request->hasParam("mode", true)) {
String state = request->getParam("state", true)->value();
String mode = request->getParam("mode", true)->value();
fanAutoMode = (mode == "auto");
if (!fanAutoMode) {
fanStatus = (state == "1");
if (fanStatus) {
turnFanOn();
} else {
turnFanOff();
}
}
request->send(200, "text/plain", "OK");
} else {
request->send(400, "text/plain", "Bad Request");
}
});
server.on("/fan2", HTTP_POST, [](AsyncWebServerRequest * request) {
if (request->hasParam("state", true) && request->hasParam("mode", true)) {
String state = request->getParam("state", true)->value();
String mode = request->getParam("mode", true)->value();
fan2AutoMode = (mode == "auto");
if (!fan2AutoMode) {
fan2Status = (state == "1");
if (fan2Status) {
turnFan2On();
} else {
turnFan2Off();
}
}
request->send(200, "text/plain", "OK");
} else {
request->send(400, "text/plain", "Bad Request");
}
});
events.onConnect([](AsyncEventSourceClient * client) {
if (client->lastId()) {
Serial.printf("Client reconnected! Last message ID that it got is: %u\n", client->lastId());
}
client->send(getDeviceStates().c_str(), "status", millis(), 1000);
});
server.addHandler(&events);
server.begin();
}
void loop() {
static unsigned long lastSensorUpdate = 0;
static unsigned long lastEventUpdate = 0;
if (millis() - lastSensorUpdate >= 1000) {
updateSensorData();
lastSensorUpdate = millis();
if (temperature >= 33) {
setRedLight();
rgbStatus = "red";
} else if (temperature < 33 && temperature >= 23) {
setGreenLight();
rgbStatus = "green";
} else {
setBlueLight();
rgbStatus = "blue";
}
if (fanAutoMode) {
if (temperature >= 33) {
turnFanOn();
} else {
turnFanOff();
}
}
if (fan2AutoMode) {
if (temperature >= 35) {
turnFan2On();
} else {
turnFan2Off();
}
}
}
if (millis() - lastEventUpdate >= 1000) {
events.send(getDeviceStates().c_str(), "status", millis());
lastEventUpdate = millis();
}
}