code
#include
#include
// Pins & Devices
int startButton = 4;
int onLed = -1;
int stepperPinStart = 9;
int buzzerPin = 5;
Stepper stepper(200, stepperPinStart, stepperPinStart+2, stepperPinStart+1, stepperPinStart+3);
LiquidCrystal_I2C lcd(0x27,16,2);
// Elevator specifics
int elevatorFloorPins[4] = {6, 7, 13, 8};
int elevatorLightPins[4] = {A3, A2, 2, 3};
int elevatorFloorSteps[4] = {4300, 2860, 1300, 0};
int curFloorSteps = 0;
char curFloor = -1;
int steps = 0;
int beeped = 0;
int shownInactive = 0;
int started = 0;
// Queueing stack
char queue[256] = {0}; // For memory conservation
int queuePtr = 3;
void handleBeep() {
if(!beeped && curFloorSteps == steps) {
Serial.println("Beeped");
beeped = 1;
digitalWrite(buzzerPin, HIGH);
delay(100);
digitalWrite(buzzerPin, LOW);
if(curFloor != -1) changeLed(curFloor);
}
}
void handleButtons() {
int i;
for(i=0;i<4;i++) {
if(digitalRead(elevatorFloorPins[i]) == LOW) {
started = 1;
if(queue[queuePtr] != i) { queue[++queuePtr] = i;
Serial.println(i+1); }
}
}
}
// I understand this is an awful way to handle this but I can't think of something that’s both better and practical
void popBottomOfQueue() {
char temp[256];
int i;
for(i=1;i= 0 || !shownInactive) {
changeLcd(curFloor, queue[0]);
if(queuePtr == -1) shownInactive = 1;
}
if(queuePtr >= 0) {
shownInactive = 0;
curFloorSteps = elevatorFloorSteps[queue[0]];
curFloor = queue[0];
Serial.println(curFloorSteps);
popBottomOfQueue();
}
}
}
void handleSteps() {
if(steps < curFloorSteps) {
beeped = 0;
stepper.step(1);
steps++;
}
if(steps > curFloorSteps) {
beeped = 0;
stepper.step(-1);
steps--;
}
}
void changeLed(char floor) {
int i;
for(i=0;i<4;i++) digitalWrite(elevatorLightPins[i], LOW);
digitalWrite(elevatorLightPins[floor], HIGH);
delay(200);
digitalWrite(elevatorLightPins[floor], LOW);
}
void changeLcd(char floor, char nextFloor) {
char msg[32];
if(!started) return;
if(floor == -1) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Travelling");
lcd.setCursor(0, 1); sprintf(msg, "Next Floor %d", nextFloor+1);
lcd.print(msg); return; }
sprintf(msg, "Floor %d", floor + 1); // Floor starts at 0
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(msg);
lcd.setCursor(0, 1);
if(queuePtr == -1) { lcd.print("Queue empty"); return; }
sprintf(msg, "Next Floor %d", nextFloor + 1);
lcd.print(msg);
}
void setup() {
queue[0] = 2;
queue[1] = 3;
queue[2] = 0;
queue[3] = 1;
pinMode(startButton, INPUT_PULLUP);
pinMode(onLed, OUTPUT);
pinMode(buzzerPin, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Press button");
lcd.setCursor(0, 1);
lcd.print("to start");
int i;
for(i=0;i<4;i++) pinMode(elevatorFloorPins[i], INPUT_PULLUP);
for(i=0;i<4;i++) pinMode(elevatorLightPins[i], OUTPUT);
while(digitalRead(startButton) == HIGH); // Await button press
stepper.setSpeed(100);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Floor 4");
lcd.setCursor(0, 1);
lcd.print("Queue empty");
Serial.begin(9600);
}
void loop() {
handleButtons();
handleSteps();
handleBeep();
handleQueue();
}