#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <Servo.h>
#include <AccelStepper.h>
#include <math.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myservo;
// DHT Sensor
#define DHTPIN 5 // DHT22 data pin connected to digital pin 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Misc Definitions
int buzzer = 4;
int LED = 13;
int button = 2;
int lightSensor = A0;
int potentiometer = A3;
int servo = 3;
int relay = 7;
int readTime = 1000;
int pirPin = 6;
// Motion Sensor
int pirState = LOW;
int value = 0;
// Stepper Motor
int dirPin = 10;
int stepPin = 9;
bool direction = 1;
// LDR
float GAMMA = 0.7;
float RL10 = 50;
void setup() {
dht.begin();
lcd.init();
lcd.backlight();
pinMode(buzzer, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(button, INPUT_PULLUP);
myservo.attach(servo);
pinMode(relay, OUTPUT);
pinMode(potentiometer, INPUT);
pinMode(dirPin, OUTPUT);
pinMode(stepPin, OUTPUT);
}
void loop() {
float LDR = analogRead(lightSensor);
float voltage = LDR / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
int input = analogRead(potentiometer);
int level = map(input,0,1023,0,100000);
if (lux < level) {
myservo.write(0); // closes curtain
digitalWrite(LED, HIGH);
lcd.print("Curtain Closed");
delay(readTime);
lcd.clear();
}
else {
myservo.write(90); // opens curtain
digitalWrite(LED, LOW);
lcd.print("Curtain Opened");
delay(readTime);
lcd.clear();
}
bool buttonState = digitalRead(button);
digitalWrite(relay, !buttonState);
if (buttonState) lcd.write("Appliance Deactivated");
if (!buttonState) lcd.write("Appliance Activated");
delay(readTime);
lcd.clear();
int value = digitalRead(pirPin);
int motionDetectedTime = 0;
if (value) {
motionDetectedTime = millis();
if (!pirState) {
pirState = HIGH;
tone(buzzer, 500);
lcd.print("Motion detected");
delay(2000);
lcd.clear();
noTone(buzzer);
}
} else {
if (pirState) {
pirState = LOW;
}
}
}