// === Airplane Seat Booking System ===
// Final version with cleaned structure, no ternary operators
int ledMat_first[2][2] = {
{22, 23},
{26, 27}
};
int ledMat_eco[4][3] = {
{30, 31, 32},
{34, 35, 36},
{38, 39, 40},
{42, 43, 44}
};
bool ledStat_first[2][2];
bool ledStat_eco[4][3];
const unsigned long BLINK_INTERVAL = 500;
unsigned long lastBlinkTime = 0;
bool blinkState = false;
String inputString = "";
bool classSelected = false;
bool rowSelected = false;
bool colSelected = false;
bool confirmed = false;
int selectedClass = -1;
int selectedRow = -1;
int selectedCol = -1;
bool classPromptPrinted = false;
bool rowPromptPrinted = false;
bool colPromptPrinted = false;
bool confirmPromptPrinted = false;
void setup() {
Serial.begin(9600);
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++) {
pinMode(ledMat_first[i][j], OUTPUT);
ledStat_first[i][j] = false;
}
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++) {
pinMode(ledMat_eco[i][j], OUTPUT);
ledStat_eco[i][j] = false;
}
Serial.println("Welcome to the seat booking system.");
}
void loop() {
updateLEDs();
if (!classSelected) {
chooseClass();
} else if (!rowSelected) {
chooseRow();
} else if (!colSelected) {
chooseColumn();
} else if (!confirmed) {
confirmSeat();
}
}
// === Blink logic without delay ===
void updateBlinkState() {
unsigned long currentMillis = millis();
if (currentMillis - lastBlinkTime >= BLINK_INTERVAL) {
lastBlinkTime = currentMillis;
blinkState = !blinkState;
}
}
// === Update LED based on state ===
void updateLEDs() {
updateBlinkState();
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
digitalWrite(ledMat_first[i][j], LOW);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
digitalWrite(ledMat_eco[i][j], LOW);
if (!classSelected) {
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++) {
int pin = ledMat_first[i][j];
if (ledStat_first[i][j]) digitalWrite(pin, HIGH);
else digitalWrite(pin, blinkState ? HIGH : LOW);
}
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++) {
int pin = ledMat_eco[i][j];
if (ledStat_eco[i][j]) digitalWrite(pin, HIGH);
else digitalWrite(pin, blinkState ? HIGH : LOW);
}
return;
}
if (!rowSelected) {
if (selectedClass == 0) {
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++) {
int pin = ledMat_first[i][j];
if (ledStat_first[i][j]) digitalWrite(pin, HIGH);
else digitalWrite(pin, blinkState ? HIGH : LOW);
}
} else {
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++) {
int pin = ledMat_eco[i][j];
if (ledStat_eco[i][j]) digitalWrite(pin, HIGH);
else digitalWrite(pin, blinkState ? HIGH : LOW);
}
}
return;
}
if (selectedClass == 0) {
for (int j = 0; j < 2; j++) {
int pin = ledMat_first[selectedRow][j];
if (ledStat_first[selectedRow][j]) digitalWrite(pin, HIGH);
else digitalWrite(pin, blinkState ? HIGH : LOW);
}
} else {
for (int j = 0; j < 3; j++) {
int pin = ledMat_eco[selectedRow][j];
if (ledStat_eco[selectedRow][j]) digitalWrite(pin, HIGH);
else digitalWrite(pin, blinkState ? HIGH : LOW);
}
}
}
// === State Checks ===
bool isFirstClassFull() {
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
if (!ledStat_first[i][j]) return false;
return true;
}
bool isEconomyClassFull() {
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
if (!ledStat_eco[i][j]) return false;
return true;
}
bool isRowFull(int row) {
if (selectedClass == 0) {
for (int j = 0; j < 2; j++)
if (!ledStat_first[row][j]) return false;
} else {
for (int j = 0; j < 3; j++)
if (!ledStat_eco[row][j]) return false;
}
return true;
}
void resetAllSeats() {
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
ledStat_first[i][j] = false;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
ledStat_eco[i][j] = false;
Serial.println("All seats are now reset.");
classSelected = rowSelected = colSelected = confirmed = false;
selectedClass = selectedRow = selectedCol = -1;
classPromptPrinted = rowPromptPrinted = colPromptPrinted = confirmPromptPrinted = false;
}
// === Class Selection ===
void chooseClass() {
bool firstFull = isFirstClassFull();
bool ecoFull = isEconomyClassFull();
if (firstFull && ecoFull) {
resetAllSeats();
return;
}
if (!classPromptPrinted) {
Serial.println("\nSelect seat class:");
if (!firstFull) Serial.println("Enter 1 for First Class");
if (!ecoFull) Serial.println("Enter 2 for Economy Class");
Serial.print("Input: ");
classPromptPrinted = true;
}
while (Serial.available()) {
char inChar = (char)Serial.read();
if (inChar == '\n' || inChar == '\r') {
inputString.trim();
if (inputString == "1" && !firstFull) {
selectedClass = 0;
classSelected = true;
Serial.println("First Class selected.");
} else if (inputString == "2" && !ecoFull) {
selectedClass = 1;
classSelected = true;
Serial.println("Economy Class selected.");
} else {
Serial.println("Invalid input or class full. Try again.");
}
inputString = "";
classPromptPrinted = false;
} else {
inputString += inChar;
}
}
}
// === Row Selection ===
void chooseRow() {
int maxRow = (selectedClass == 0) ? 2 : 4;
if (!rowPromptPrinted) {
Serial.print("Enter row number (1 to ");
Serial.print(maxRow);
Serial.println("): ");
rowPromptPrinted = true;
}
while (Serial.available()) {
char inChar = (char)Serial.read();
if (inChar == '\n' || inChar == '\r') {
inputString.trim();
int rowNum = inputString.toInt();
if (rowNum >= 1 && rowNum <= maxRow) {
if (!isRowFull(rowNum - 1)) {
selectedRow = rowNum - 1;
rowSelected = true;
Serial.print("Row ");
Serial.print(rowNum);
Serial.println(" selected.");
} else {
Serial.println("Row is full. Please select another.");
}
} else {
Serial.println("Invalid row number. Try again.");
}
inputString = "";
rowPromptPrinted = false;
} else {
inputString += inChar;
}
}
}
// === Column Selection ===
void chooseColumn() {
int maxCol = (selectedClass == 0) ? 2 : 3;
if (!colPromptPrinted) {
Serial.print("Enter seat number in row (1 to ");
Serial.print(maxCol);
Serial.println("): ");
colPromptPrinted = true;
}
while (Serial.available()) {
char inChar = (char)Serial.read();
if (inChar == '\n' || inChar == '\r') {
inputString.trim();
int colNum = inputString.toInt();
if (colNum >= 1 && colNum <= maxCol) {
bool occupied = false;
if (selectedClass == 0) occupied = ledStat_first[selectedRow][colNum - 1];
else occupied = ledStat_eco[selectedRow][colNum - 1];
if (!occupied) {
selectedCol = colNum - 1;
colSelected = true;
Serial.print("Seat ");
Serial.print(colNum);
Serial.println(" selected.");
} else {
Serial.println("Seat is already occupied. Select another.");
}
} else {
Serial.println("Invalid seat number. Try again.");
}
inputString = "";
colPromptPrinted = false;
} else {
inputString += inChar;
}
}
}
// === Seat Confirmation ===
void confirmSeat() {
if (!confirmPromptPrinted) {
Serial.print("Confirm seat - Class: ");
if (selectedClass == 0) Serial.print("First");
else Serial.print("Economy");
Serial.print(", Row: ");
Serial.print(selectedRow + 1);
Serial.print(", Seat: ");
Serial.print(selectedCol + 1);
Serial.println(" ? (Y/N): ");
confirmPromptPrinted = true;
}
while (Serial.available()) {
char inChar = (char)Serial.read();
if (inChar == '\n' || inChar == '\r') {
inputString.trim();
if (inputString.equalsIgnoreCase("Y")) {
if (selectedClass == 0)
ledStat_first[selectedRow][selectedCol] = true;
else
ledStat_eco[selectedRow][selectedCol] = true;
Serial.println("Seat confirmed. Thank you!");
classSelected = rowSelected = colSelected = confirmed = false;
selectedClass = selectedRow = selectedCol = -1;
confirmPromptPrinted = false;
} else {
Serial.println("Seat cancelled. Restarting row selection.");
rowSelected = colSelected = confirmed = false;
confirmPromptPrinted = false;
}
inputString = "";
} else {
inputString += inChar;
}
}
}