#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHT_TYPE DHT22
#define DHT_PIN 4
#define PHOTORESISTOR_PIN 33
#define MOTION_SENSOR_PIN 13
#define WHITE_LED_PIN 14
#define RELAY_AC_PIN 18
#define RELAY_HUMIDIFIER_PIN 19
DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
const float GAMMA = 0.7;
const float RL10 = 50.0;
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* hostname = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
const char* espClientName = "IOT/S10245577";
int PORTNUM = 1883;
unsigned long previousMillis = 0;
const long interval = 2000;
bool lightState = LOW;
bool acState = LOW;
bool humidifierState = LOW;
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void connectMQTT() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect(espClientName)) {
Serial.println("Connected");
MQTTSubscribe();
} else {
Serial.print("Failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String messageTemp;
Serial.print("Message received in topic: ");
Serial.print(topic);
Serial.print(" length is: ");
Serial.println(length);
Serial.print("Data received from broker: ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
messageTemp += (char)payload[i];
}
Serial.println();
if (String(topic) == "IOT/S10245577") {
if (messageTemp == "turn on light") {
if (lightState == LOW) {
Serial.print("Turning on the light");
digitalWrite(WHITE_LED_PIN, HIGH);
lightState = HIGH;
}
} else if (messageTemp == "turn off light") {
if (lightState == HIGH) {
Serial.print("Turning off the light");
digitalWrite(WHITE_LED_PIN, LOW);
lightState = LOW;
}
} else if (messageTemp == "turn on AC") {
if (acState == LOW) {
Serial.print("Turning on the AC");
digitalWrite(RELAY_AC_PIN, HIGH);
acState = HIGH;
}
} else if (messageTemp == "turn off AC") {
if (acState == HIGH) {
Serial.print("Turning off the AC");
digitalWrite(RELAY_AC_PIN, LOW);
acState = LOW;
}
} else if (messageTemp == "turn on humidifier") {
if (humidifierState == LOW) {
Serial.print("Turning on the humidifier");
digitalWrite(RELAY_HUMIDIFIER_PIN, HIGH);
humidifierState = HIGH;
}
} else if (messageTemp == "turn off humidifier") {
if (humidifierState == HIGH) {
Serial.print("Turning off the humidifier");
digitalWrite(RELAY_HUMIDIFIER_PIN, LOW);
humidifierState = LOW;
}
}
}
}
void setup_MQTT() {
client.setServer(hostname, PORTNUM);
client.setCallback(callback);
}
void MQTTSubscribe() {
client.subscribe("IOT/S10245577");
client.subscribe("IOT/S10245577/data");
}
void setup() {
Serial.begin(115200);
pinMode(MOTION_SENSOR_PIN, INPUT);
pinMode(WHITE_LED_PIN, OUTPUT);
pinMode(RELAY_AC_PIN, OUTPUT);
pinMode(RELAY_HUMIDIFIER_PIN, OUTPUT);
Wire.begin(21, 22);
lcd.init();
lcd.backlight();
dht.begin();
setup_wifi();
setup_MQTT();
}
void loop() {
if (!client.connected()) {
connectMQTT();
}
client.loop();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
int motionDetected = digitalRead(MOTION_SENSOR_PIN);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int analogValue = analogRead(PHOTORESISTOR_PIN);
analogValue = map(analogValue, 4095, 0, 1024, 0);
float voltage = analogValue / 1024.0 * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
int lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
Serial.print("Analog Value: ");
Serial.println(analogValue);
Serial.print("Lux: ");
Serial.println(lux);
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DHT Error");
} else {
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" *C ");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(humidity);
lcd.print(" %");
}
char tempStr[10];
char humidityStr[10];
char luxStr[10];
dtostrf(temperature, 1, 2, tempStr);
dtostrf(humidity, 1, 2, humidityStr);
dtostrf(lux, 1, 2, luxStr);
client.publish("IOT/S10245577/temperature", tempStr);
client.publish("IOT/S10245577/humidity", humidityStr);
client.publish("IOT/S10245577/lux", luxStr);
if (motionDetected) {
if (lux > 512) {
digitalWrite(WHITE_LED_PIN, LOW);
lightState = LOW;
} else {
digitalWrite(WHITE_LED_PIN, HIGH);
lightState = HIGH;
}
if (temperature > 26.0) {
if (acState == LOW) {
Serial.println("Temperature > 26C. Turning on AC.");
digitalWrite(RELAY_AC_PIN, HIGH);
acState = HIGH;
}
} else {
if (acState == HIGH) {
Serial.println("Temperature <= 26C. Turning off AC.");
digitalWrite(RELAY_AC_PIN, LOW);
acState = LOW;
}
}
if (humidity < 30.0) {
if (humidifierState == LOW) {
Serial.println("Humidity < 30%. Turning on Humidifier.");
digitalWrite(RELAY_HUMIDIFIER_PIN, HIGH);
humidifierState = HIGH;
}
} else {
if (humidifierState == HIGH) {
Serial.println("Humidity >= 30%. Turning off Humidifier.");
digitalWrite(RELAY_HUMIDIFIER_PIN, LOW);
humidifierState = LOW;
}
}
} else {
Serial.println("No motion detected. Turning off all devices.");
if (lightState == HIGH) {
digitalWrite(WHITE_LED_PIN, LOW);
lightState = LOW;
}
if (acState == HIGH) {
digitalWrite(RELAY_AC_PIN, LOW);
acState = LOW;
}
if (humidifierState == HIGH) {
digitalWrite(RELAY_HUMIDIFIER_PIN, LOW);
humidifierState = LOW;
}
}
}
}