#include <AccelStepper.h>
#include <LiquidCrystal.h>
#define step 2
#define dir 3
#define trig 7
#define echo 6
#define rs 8
#define en 9
#define d4 10
#define d5 11
#define d6 12
#define d7 13
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
AccelStepper stepper(AccelStepper::DRIVER, step, dir);
int doorpos = 0;
int entry_count = 0;
const int threshold_dist = 30;
void setup() {
lcd.begin(16, 2);
lcd.print("Door: Closed");
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
stepper.setMaxSpeed(1000);
stepper.setAcceleration(500);
Serial1.begin(115200);
Serial1.println("System Initialized");
}
void loop() {
long distance = avg_dist();
Serial1.print("Distance: ");
Serial1.println(distance);
if (distance < threshold_dist && doorpos == 0) {
open();
} else if (distance >= threshold_dist && doorpos == 1) {
close();
}
delay(200);
}
long avg_dist() {
long tot_dist = 0;
int readings = 5;
for (int i = 0; i < readings; i++) {
long duration;
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
long distance = (duration * 0.034) / 2;
tot_dist += distance;
delay(50);
}
return tot_dist / readings;
}
void open() {
stepper.moveTo(200);
stepper.runToPosition();
doorpos = 1;
entry_count++;
display_stat();
}
void close() {
stepper.moveTo(0);
stepper.runToPosition();
doorpos = 0;
display_stat();
}
void display_stat() {
lcd.clear();
lcd.print("Door: ");
if (doorpos == 1) {
lcd.print("Open");
} else {
lcd.print("Closed");
}
lcd.setCursor(0, 1);
lcd.print("Entries: ");
lcd.print(entry_count);
}