#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
#define LIGHT_SENSOR_PIN A0
#define PIR_SENSOR_PIN 3
#define RED_LED_PIN 4
#define GREEN_LED_PIN 5
#define BLUE_LED_PIN 6
#define BUZZER_PIN 7
#define TEMP_HIGH 30
#define TEMP_LOW 20
#define NIGHT_MODE_START 22 // 10 PM
#define NIGHT_MODE_END 6 // 6 AM
DHT dht(DHTPIN, DHTTYPE); // Initialize the DHT sensor
LiquidCrystal_I2C lcd(0x27, 16, 2); // Initialize LCD with I2C address
unsigned long lastDisplayUpdate = 0;
unsigned long lastSerialUpdate = 0;
unsigned long lastMotionDetection = 0;
bool motionDetected = false;
bool nightModeActive = false;
void setup() {
Serial.begin(9600);
dht.begin(); // Initialize the DHT sensor
lcd.begin(16, 2); // Initialize the LCD with columns and rows
lcd.backlight(); // Turn on the backlight
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(PIR_SENSOR_PIN, INPUT);
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
void loop() {
unsigned long currentMillis = millis();
int lightLevel = analogRead(LIGHT_SENSOR_PIN);
motionDetected = digitalRead(PIR_SENSOR_PIN);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Error");
return;
}
if (currentMillis - lastDisplayUpdate >= 5000) {
updateDisplay(temperature, humidity, lightLevel);
lastDisplayUpdate = currentMillis;
}
if (currentMillis - lastSerialUpdate >= 10000) {
sendSerialData(temperature, humidity, lightLevel);
lastSerialUpdate = currentMillis;
}
if (motionDetected && lightLevel < 100) { // Assuming light level < 100 is considered dark
tone(BUZZER_PIN, 1000); // Activate buzzer
delay(3000); // Alarm duration
noTone(BUZZER_PIN); // Stop buzzer
}
if (currentMillis - lastMotionDetection >= 30000 && !motionDetected) {
lcd.noBacklight();
} else {
lcd.backlight();
}
updateTemperatureLED(temperature);
if (currentMillis % 86400000 < (24 - NIGHT_MODE_START) * 3600000 || currentMillis % 86400000 >= NIGHT_MODE_END * 3600000) {
nightModeActive = false;
} else {
nightModeActive = true;
}
}
void updateDisplay(float temperature, float humidity, int lightLevel) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print("% Lght: ");
lcd.print(lightLevel);
}
void sendSerialData(float temperature, float humidity, int lightLevel) {
String jsonData = "{";
jsonData += "\"temperature\": " + String(temperature) + ",";
jsonData += "\"humidity\": " + String(humidity) + ",";
jsonData += "\"light_level\": " + String(lightLevel);
jsonData += "}";
Serial.println(jsonData);
}
void updateTemperatureLED(float temperature) {
if (temperature > TEMP_HIGH) {
digitalWrite(RED_LED_PIN, HIGH);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, LOW);
} else if (temperature < TEMP_LOW) {
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
digitalWrite(BLUE_LED_PIN, HIGH);
} else {
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, HIGH);
digitalWrite(BLUE_LED_PIN, LOW);
}
}