#include <AccelStepper.h>
#include <LiquidCrystal.h>
const int rs = 7;
const int en = 6;
const int d4 = 5;
const int d5 = 4;
const int d6 = 3;
const int d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int ldr = 26;
const int step = 15;
const int dir = 14;
const int DT = 12;
const int CLK = 13;
const int SW = 11;
const int light_thrshold = 500;
AccelStepper stepper(AccelStepper::DRIVER, step, dir);
const int stepperrev = 200;
const int stepsopen = stepperrev * 10;
const int stepsclose = -stepperrev * 10;
volatile int encoder_pos = 0;
int last_encoderpos = 0;
int curttainpos = 0; // 0 for closed, 1 for open
void setup() {
lcd.begin(16, 2);
lcd.print("Curtain Control");
pinMode(ldr, INPUT);
pinMode(DT, INPUT);
pinMode(CLK, INPUT);
pinMode(SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(DT), encoderISR, CHANGE);
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
lcd.setCursor(0, 1);
lcd.print("Light Level: ");
}
void loop() {
int lightLevel = analogRead(ldr);
lcd.setCursor(0, 0);
lcd.print("Curtain Control");
lcd.setCursor(0, 1);
lcd.print("Light: ");
lcd.print(lightLevel);
lcd.print(" ");
if (lightLevel > light_thrshold) {
if (curttainpos == 0) {
opencurtain();
curttainpos = 1; // Mark as open
}
} else {
if (curttainpos == 1) {
closeCurtain();
curttainpos = 0; // Mark as closed
}
}
if (encoder_pos != last_encoderpos) {
if (encoder_pos > last_encoderpos) {
stepper.moveTo(stepper.currentPosition() + 100);
} else {
stepper.moveTo(stepper.currentPosition() - 100);
}
last_encoderpos = encoder_pos;
stepper.run();
}
stepper.run();
}
void opencurtain() {
lcd.setCursor(0, 1);
lcd.print("Curtain: Opening ");
stepper.moveTo(stepsopen);
while (stepper.distanceToGo() != 0) {
stepper.run();
}lcd.clear();
}
void closeCurtain() {
lcd.setCursor(0, 1);
lcd.print("Curtain: Closing ");
stepper.moveTo(stepsclose);
while (stepper.distanceToGo() != 0) {
stepper.run();
}lcd.clear();
}
void encoderISR() {
if (digitalRead(CLK) == LOW) {
encoder_pos++;
} else {
encoder_pos--;
}
}