#include <Arduino.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
// -------- Pins --------
#define TRIG_PIN 5
#define ECHO_PIN 18
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define RED_LED_PIN 2
#define GREEN_LED_PIN 15
#define BLUE_LED_PIN 19
// -------- Limits --------
#define TEMP_LIMIT 35
#define HUM_LIMIT 60
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHT_PIN, DHT_TYPE);
float temperature = 0;
float humidity = 0;
float distance = 0;
// ───────── Door Monitoring Task ─────────
void ultrasonicTask(void *pvParameters) {
for (;;) {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration > 0) {
distance = (duration * 0.034) / 2;
Serial.print("Door Distance: ");
Serial.println(distance);
if (distance > 200) {
Serial.println("Door OPEN!");
digitalWrite(BLUE_LED_PIN, HIGH); // Blue LED ON
}
else {
Serial.println("Door CLOSED");
digitalWrite(BLUE_LED_PIN, LOW); // Blue LED OFF
}
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
// ───────── Temperature & Humidity Task ─────────
void dhtTask(void *pvParameters) {
for (;;) {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (!isnan(h) && !isnan(t)) {
temperature = t;
humidity = h;
Serial.printf("Temp: %.1fC | Humidity: %.1f%%\n", t, h);
if (t < TEMP_LIMIT && h < HUM_LIMIT) {
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(RED_LED_PIN, LOW);
Serial.println("SYSTEM NORMAL");
}
else {
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(RED_LED_PIN, HIGH);
if (t >= TEMP_LIMIT && h >= HUM_LIMIT) {
Serial.println("TEMP & HUMIDITY HIGH");
}
else if (t >= TEMP_LIMIT) {
Serial.println("TEMPERATURE HIGH");
}
else if (h >= HUM_LIMIT) {
Serial.println("HUMIDITY HIGH");
}
}
}
vTaskDelay(pdMS_TO_TICKS(2000));
}
}
// ───────── LCD Display Task ─────────
void lcdTask(void *pvParameters) {
for (;;) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T:");
lcd.print(temperature);
lcd.print("C H:");
lcd.print(humidity);
lcd.setCursor(0,1);
if (temperature < TEMP_LIMIT && humidity < HUM_LIMIT) {
lcd.print("SYSTEM NORMAL");
}
else if (temperature >= TEMP_LIMIT && humidity >= HUM_LIMIT) {
lcd.print("TEMP&HUM HIGH");
}
else if (temperature >= TEMP_LIMIT) {
lcd.print("TEMP HIGH");
}
else if (humidity >= HUM_LIMIT) {
lcd.print("HUMID HIGH");
}
vTaskDelay(pdMS_TO_TICKS(2000));
}
}
// ───────── Setup ─────────
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT); // Blue LED pin
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
dht.begin();
lcd.init();
lcd.backlight();
xTaskCreate(ultrasonicTask, "DoorTask", 2048, NULL, 1, NULL);
xTaskCreate(dhtTask, "EnvTask", 2048, NULL, 1, NULL);
xTaskCreate(lcdTask, "LCDTask", 4096, NULL, 1, NULL);
}
void loop() {
vTaskDelete(NULL);
}