// Pin definitions
const int GoingDownLED = 1;
const int GoingUpLED = 2;
const int Floor0LED = 3;
const int Floor1LED = 4;
const int EmergencyLED = 5;
const int MotorForwards = 13;
const int MotorBackwards = 14;
const int CallButton = 6;
const int Level0Button = 7;
const int Level1Button = 8;
const int DoorsClosed1Sensor = 9;
const int DoorsClosed0Sensor = 10;
const int Floor1Sensor = 11;
const int Floor0Sensor = 12;
enum ElevatorState {
IDLE,
MOVING_UP,
MOVING_DOWN,
EMERGENCY
};
ElevatorState currentState = IDLE;
bool callButtonHandled = false;
bool level0ButtonHandled = false;
bool level1ButtonHandled = false;
void setup() {
// Initialize all pins
pinMode(GoingDownLED, OUTPUT);
pinMode(GoingUpLED, OUTPUT);
pinMode(Floor0LED, OUTPUT);
pinMode(Floor1LED, OUTPUT);
pinMode(EmergencyLED, OUTPUT);
pinMode(MotorForwards, OUTPUT);
pinMode(MotorBackwards, OUTPUT);
pinMode(CallButton, INPUT);
pinMode(Level0Button, INPUT);
pinMode(Level1Button, INPUT);
pinMode(DoorsClosed1Sensor, INPUT);
pinMode(DoorsClosed0Sensor, INPUT);
pinMode(Floor1Sensor, INPUT);
pinMode(Floor0Sensor, INPUT);
// Set initial states
initializeOutputs();
}
void loop() {
updateFloorLEDs();
if (handleEmergency()) {
currentState = EMERGENCY;
return;
}
if (currentState == IDLE) {
if (digitalRead(CallButton) == HIGH && !callButtonHandled && digitalRead(DoorsClosed1Sensor) == HIGH && digitalRead(DoorsClosed0Sensor) == HIGH) {
callButtonHandled = true;
if (digitalRead(Floor1Sensor) == HIGH) {
currentState = MOVING_DOWN;
moveDown();
} else if (digitalRead(Floor0Sensor) == HIGH) {
currentState = MOVING_UP;
moveUp();
}
} else if (digitalRead(CallButton) == LOW) {
callButtonHandled = false;
}
if (digitalRead(Level1Button) == HIGH && !level1ButtonHandled && digitalRead(DoorsClosed1Sensor) == HIGH && digitalRead(DoorsClosed0Sensor) == HIGH && digitalRead(Floor0Sensor) == HIGH) {
level1ButtonHandled = true;
currentState = MOVING_UP;
moveUp();
} else if (digitalRead(Level1Button) == LOW) {
level1ButtonHandled = false;
}
if (digitalRead(Level0Button) == HIGH && !level0ButtonHandled && digitalRead(DoorsClosed1Sensor) == HIGH && digitalRead(DoorsClosed0Sensor) == HIGH && digitalRead(Floor1Sensor) == HIGH) {
level0ButtonHandled = true;
currentState = MOVING_DOWN;
moveDown();
} else if (digitalRead(Level0Button) == LOW) {
level0ButtonHandled = false;
}
}
}
// Function to initialize outputs
void initializeOutputs() {
digitalWrite(GoingDownLED, LOW);
digitalWrite(GoingUpLED, LOW);
digitalWrite(Floor0LED, LOW);
digitalWrite(Floor1LED, LOW);
digitalWrite(EmergencyLED, LOW);
digitalWrite(MotorForwards, LOW);
digitalWrite(MotorBackwards, LOW);
}
// Function to update LEDs based on floor and door sensors
void updateFloorLEDs() {
if (digitalRead(Floor1Sensor) == HIGH && digitalRead(DoorsClosed1Sensor) == HIGH) {
digitalWrite(Floor1LED, HIGH);
digitalWrite(Floor0LED, LOW);
digitalWrite(GoingUpLED, LOW);
digitalWrite(GoingDownLED, LOW);
currentState = IDLE;
} else if (digitalRead(Floor0Sensor) == HIGH && digitalRead(DoorsClosed0Sensor) == HIGH) {
digitalWrite(Floor1LED, LOW);
digitalWrite(Floor0LED, HIGH);
digitalWrite(GoingUpLED, LOW);
digitalWrite(GoingDownLED, LOW);
currentState = IDLE;
} else if (digitalRead(DoorsClosed1Sensor) == LOW) {
digitalWrite(Floor1LED, LOW);
} else if (digitalRead(DoorsClosed0Sensor) == LOW) {
digitalWrite(Floor0LED, LOW);
}
}
// Function to handle emergency state
bool handleEmergency() {
if (digitalRead(Floor1Sensor) == LOW && digitalRead(Floor0Sensor) == LOW) {
digitalWrite(EmergencyLED, HIGH);
delay(500);
digitalWrite(EmergencyLED, LOW);
delay(500);
digitalWrite(GoingDownLED, LOW);
digitalWrite(GoingUpLED, LOW);
digitalWrite(Floor0LED, LOW);
digitalWrite(Floor1LED, LOW);
currentState = IDLE;
return true;
}
return false;
}
// Function to move elevator up
void moveUp() {
digitalWrite(Floor0LED, LOW);
digitalWrite(GoingUpLED, HIGH);
delay(2000);
digitalWrite(MotorForwards, HIGH);
delay(10000);
digitalWrite(MotorForwards, LOW);
delay(1000);
digitalWrite(Floor1LED, HIGH);
digitalWrite(GoingUpLED, LOW);
}
// Function to move elevator down
void moveDown() {
digitalWrite(Floor1LED, LOW);
digitalWrite(GoingDownLED, HIGH);
delay(2000);
digitalWrite(MotorBackwards, HIGH);
delay(10000);
digitalWrite(MotorBackwards, LOW);
delay(1000);
digitalWrite(Floor0LED, HIGH);
digitalWrite(GoingDownLED, LOW);
}