#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <RTClib.h>
#include <Servo.h>
// Pin assignments
const int pirPin = 2; // PIR Motion Sensor
const int dhtPin = 3; // DHT22 Sensor
const int ldrPin = A0; // LDR (Photoresistor)
const int ledPin = 4; // LED for light control
const int alertLedPin = 5; // LED for security alert
const int acLedPin = 6; // LED for air conditioner
const int curtainLedPin = 7; // LED for curtains
const int buzzerPin = 8; // Buzzer
const int servoPin = 10; // Servo motor for smart lock
const int buttonPin = 11; // Push button for manual lock/unlock
const int dataPin = 13; // Connects to pin 14 on the 74HC595
const int clockPin = 12; // Connects to pin 11 on the 74HC595
const int latchPin = 9; // Connects to pin 12 on the 74HC595
// Shift Register Pins
const int secondPirPin = 1; // Q1 on the 74HC595 shift register
const int newLedPin = 2; // Q2 on the 74HC595 shift register
// DHT setup
#define DHT_TYPE DHT22
DHT dht(dhtPin, DHT_TYPE);
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// RTC setup
RTC_DS1307 rtc;
// Servo setup
Servo myServo;
bool lockState = false; // false = unlocked, true = locked
// Shift Register state
byte shiftRegisterState = 0;
// Function prototypes
void displayInitialMessage();
void initializeSystem();
void readSensors();
void updateLcdDisplay(float temperature, float humidity);
void controlLights(int ldrValue);
void handleSecurityAlert(int pirState);
void controlAirConditioner(float temperature);
void controlCurtains(DateTime now);
void controlDoorLock();
void toggleLock();
void updateShiftRegister();
void handleSecondMotionSensor();
void setup() {
Serial.begin(9600);
pinMode(pirPin, INPUT);
pinMode(ldrPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(alertLedPin, OUTPUT);
pinMode(acLedPin, OUTPUT);
pinMode(curtainLedPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
myServo.attach(servoPin);
myServo.write(0); // Start with the door unlocked
// Initialize RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
displayInitialMessage();
initializeSystem();
}
void loop() {
readSensors();
DateTime now = rtc.now();
controlCurtains(now);
controlDoorLock();
handleSecondMotionSensor(); // Handle second motion sensor
delay(2000); // Wait for 2 seconds before next loop
}
void displayInitialMessage() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Smart Home System");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(2000);
}
void initializeSystem() {
digitalWrite(ledPin, LOW);
digitalWrite(alertLedPin, LOW);
digitalWrite(acLedPin, LOW);
digitalWrite(curtainLedPin, LOW);
digitalWrite(buzzerPin, LOW);
}
void readSensors() {
// Read PIR sensor
int pirState = digitalRead(pirPin);
// Read DHT22 sensor
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Read LDR sensor
int ldrValue = analogRead(ldrPin);
// Read second PIR sensor
bool secondPirState = bitRead(shiftRegisterState, secondPirPin);
// Print values to Serial Monitor
Serial.print("PIR: ");
Serial.print(pirState);
Serial.print("\tSecond PIR: ");
Serial.print(secondPirState);
Serial.print("\tTemperature: ");
Serial.print(temperature);
Serial.print("°C\tHumidity: ");
Serial.print(humidity);
Serial.print("%\tLDR: ");
Serial.println(ldrValue);
// Update LCD display
updateLcdDisplay(temperature, humidity);
// Control lights based on LDR value
controlLights(ldrValue);
// Handle security alert based on PIR sensor
handleSecurityAlert(pirState);
// Control air conditioner based on temperature
controlAirConditioner(temperature);
}
void updateLcdDisplay(float temperature, float humidity) {
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("%");
}
void controlLights(int ldrValue) {
if (ldrValue < 500) {
digitalWrite(ledPin, HIGH); // Turn on LED if it's dark
} else {
digitalWrite(ledPin, LOW); // Turn off LED if it's light
}
}
void handleSecurityAlert(int pirState) {
if (pirState == HIGH) {
for (int i = 0; i < 10; i++) {
tone(8, 800); // Sound buzzer
digitalWrite(alertLedPin, HIGH);
delay(50);
noTone(8);
digitalWrite(alertLedPin, LOW);
delay(150);
tone(8, 900);
digitalWrite(alertLedPin, HIGH);
delay(50);
noTone(8);
digitalWrite(alertLedPin, LOW);
}
} else {
digitalWrite(alertLedPin, LOW);
noTone(8);
}
}
void controlAirConditioner(float temperature) {
if (temperature > 27.0) {
digitalWrite(acLedPin, HIGH); // Turn on AC (represented by LED)
} else {
digitalWrite(acLedPin, LOW); // Turn off AC (represented by LED)
}
}
void controlCurtains(DateTime now) {
if (now.hour() >= 7 && now.hour() < 19) {
digitalWrite(curtainLedPin, LOW); // Open curtains (represented by LED)
} else {
digitalWrite(curtainLedPin, HIGH); // Close curtains (represented by LED)
}
}
void controlDoorLock() {
if (digitalRead(buttonPin) == LOW) {
toggleLock();
delay(500); // Debounce delay
}
}
void toggleLock() {
if (lockState) {
myServo.write(0); // Unlock door
lockState = false;
} else {
myServo.write(90); // Lock door
lockState = true;
}
}
void updateShiftRegister() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, shiftRegisterState);
digitalWrite(latchPin, HIGH);
}
void handleSecondMotionSensor() {
bool motionDetected = bitRead(shiftRegisterState, secondPirPin);
if (motionDetected) {
bitSet(shiftRegisterState, newLedPin); // Turn on new LED
updateShiftRegister();
delay(6000); // Keep the LED on for 6 seconds
bitClear(shiftRegisterState, newLedPin); // Turn off new LED
updateShiftRegister();
}
}