// Kitchen buttons
int Bku = 6; // button Kitchen UP
int Bkd = 5; // button Kitchen DOWN
// Dining room buttons
int Bdu = 4; // button Dining UP
int Bdd = 3; // button Dining DOWN
// Emergency button
int Be = 8;
int kSensor = 9;
int dSensor = 10;
// LEDs
int Mov_up_LED = 12;//red
int Mov_dwn_LED = 13;//green
int At_Kitchen_LED = 52; //green
int At_Dining_LED = 50; //red
enum ElevatorState { IDLE, MOVING_UP, MOVING_DOWN, Kitchen, Dinning };
ElevatorState currentState = IDLE;
unsigned long moveStartTime = 0;
const unsigned long moveDuration = 5000;
void setup() {
Serial.begin(9600);
pinMode(Bku, INPUT_PULLUP);
pinMode(Bkd, INPUT_PULLUP);
pinMode(Bdu, INPUT_PULLUP);
pinMode(Bdd, INPUT_PULLUP);
pinMode(Be, INPUT_PULLUP);
pinMode(kSensor, INPUT_PULLUP);
pinMode(dSensor, INPUT_PULLUP);
pinMode(Mov_up_LED, OUTPUT);
pinMode(Mov_dwn_LED, OUTPUT);
pinMode(At_Kitchen_LED, OUTPUT);
pinMode(At_Dining_LED, OUTPUT);
}
void loop() {
// Button/sensor inputs
bool be = !digitalRead(Be);
bool bku = !digitalRead(Bku);
bool bkd = !digitalRead(Bkd);
bool bdu = !digitalRead(Bdu);
bool bdd = !digitalRead(Bdd);
bool ks = !digitalRead(kSensor);
bool ds = !digitalRead(dSensor);
if(bku || bdu == 1)
{
currentState = MOVING_UP;
digitalWrite(Mov_up_LED, HIGH);
moveStartTime = millis();
Serial.println("Elevator moving up...");
}
else if(bkd || bdd == 1)
{
currentState = MOVING_DOWN;
digitalWrite(Mov_dwn_LED, HIGH);
moveStartTime = millis();
Serial.println("Elevator moving dn...");
}
// Emergency stop
if (be) {
currentState = IDLE;
stopElevator();
return;
}
if (ks == 1)
{
currentState = Kitchen;
}
if (ds == 1)
{
currentState = Dinning;
}
switch (currentState) {
case IDLE:
if ((bku || bdu) && !bkd && !bdd) {//any up pb was pressed, and down pb was not
currentState = MOVING_UP;
digitalWrite(Mov_up_LED, HIGH);
moveStartTime = millis();
Serial.println("Elevator moving up...");
}
else if ((bkd || bdd) && !bku && !bdu) {
currentState = MOVING_DOWN;
digitalWrite(Mov_dwn_LED, HIGH);
moveStartTime = millis();
Serial.println("Elevator moving down...");
}
break;
case MOVING_UP:
digitalWrite(At_Kitchen_LED, LOW);
digitalWrite(At_Dining_LED, LOW);
if (millis() - moveStartTime >= moveDuration) {// 5s has passed
digitalWrite(Mov_up_LED, LOW);
//currentState = Dinning;
//Serial.println("Reached dining room.");
}
break;
case MOVING_DOWN:
digitalWrite(At_Kitchen_LED, LOW);
digitalWrite(At_Dining_LED, LOW);
if (millis() - moveStartTime >= moveDuration) {
digitalWrite(Mov_dwn_LED, LOW);
//currentState = Kitchen;
//Serial.println("Reached kitchen.");
}
break;
case Kitchen:
digitalWrite(At_Kitchen_LED, HIGH);
break;
case Dinning:
digitalWrite(At_Dining_LED, HIGH);
break;
}
delay(50); // small debounce
}
void stopElevator() {
digitalWrite(Mov_up_LED, LOW);
digitalWrite(Mov_dwn_LED, LOW);
Serial.println("EMERGENCY STOP: Elevator halted.");
}
Bottom/kitchen Floor's Pushbuttons
Upper/dinning Floor's Pushbuttons
Emergency
Climbing
Downing
at Kitchen
at Dinning