// Pin definitions
const int LEFT_LOOP_1_PRESS_PIN = 2;
const int LEFT_LOOP_1_PULSE_PIN = A5;
const int LEFT_LOOP_2_PIN = 3;
const int LEFT_LOOP_3_PIN = 4;
const int RIGHT_LOOP_1_PRESS_PIN = 5;
const int RIGHT_LOOP_1_PULSE_PIN = A4;
const int RIGHT_LOOP_2_PIN = 6;
const int RIGHT_LOOP_3_PIN = 7;
const int LEFT_BARRIER_PIN = 8;
const int RIGHT_BARRIER_PIN = 9;
const int LEFT_LIGHT_PIN = 10;
const int RIGHT_LIGHT_PIN = 11;
// State variables
enum State { IDLE, LEFT_ENTRY, LEFT_INSIDE, RIGHT_ENTRY, RIGHT_INSIDE };
State currentState = IDLE;
int counter = 0;
bool prevLeftLoop1Press = false;
bool prevLeftLoop1Pulse = false;
bool prevLeftLoop2 = false;
bool prevLeftLoop3 = false;
bool prevRightLoop1Press = false;
bool prevRightLoop1Pulse = false;
bool prevRightLoop2 = false;
bool prevRightLoop3 = false;
void setup() {
// Initialize the pin modes
pinMode(LEFT_LOOP_1_PRESS_PIN, INPUT);
pinMode(LEFT_LOOP_1_PULSE_PIN, INPUT);
pinMode(LEFT_LOOP_2_PIN, INPUT);
pinMode(LEFT_LOOP_3_PIN, INPUT);
pinMode(RIGHT_LOOP_1_PRESS_PIN, INPUT);
pinMode(RIGHT_LOOP_1_PULSE_PIN, INPUT);
pinMode(RIGHT_LOOP_2_PIN, INPUT);
pinMode(RIGHT_LOOP_3_PIN, INPUT);
pinMode(LEFT_BARRIER_PIN, OUTPUT);
pinMode(RIGHT_BARRIER_PIN, OUTPUT);
pinMode(LEFT_LIGHT_PIN, OUTPUT);
pinMode(RIGHT_LIGHT_PIN, OUTPUT);
// Set initial states
digitalWrite(LEFT_BARRIER_PIN, HIGH); // Barriers closed initially
digitalWrite(RIGHT_BARRIER_PIN, HIGH);
digitalWrite(LEFT_LIGHT_PIN, LOW); // Lights off initially
digitalWrite(RIGHT_LIGHT_PIN, LOW);
Serial.begin(9600);
}
void loop() {
// Handle vehicle logic based on the current state
switch (currentState) {
case IDLE:
checkForVehicleEntry();
break;
case LEFT_ENTRY:
handleLeftSideLogic();
break;
case RIGHT_ENTRY:
handleRightSideLogic();
break;
default:
break;
}
}
void checkForVehicleEntry() {
// Check for vehicle entry on the left side
bool currentLeftLoop1Press = digitalRead(LEFT_LOOP_1_PRESS_PIN);
if (currentLeftLoop1Press && !prevLeftLoop1Press) {
currentState = LEFT_ENTRY;
digitalWrite(LEFT_BARRIER_PIN, LOW); // Open the left barrier
Serial.println("Left Loop 1 Press Relay Triggered! Vehicle entering from the left.");
}
prevLeftLoop1Press = currentLeftLoop1Press;
// Check for vehicle entry on the right side
bool currentRightLoop1Press = digitalRead(RIGHT_LOOP_1_PRESS_PIN);
if (currentRightLoop1Press && !prevRightLoop1Press) {
currentState = RIGHT_ENTRY;
digitalWrite(RIGHT_BARRIER_PIN, LOW); // Open the right barrier
Serial.println("Right Loop 1 Press Relay Triggered! Vehicle entering from the right.");
}
prevRightLoop1Press = currentRightLoop1Press;
}
void handleLeftSideLogic() {
bool currentLeftLoop2 = digitalRead(LEFT_LOOP_2_PIN);
bool currentLeftLoop1Pulse = digitalRead(LEFT_LOOP_1_PULSE_PIN);
bool currentLeftLoop3 = digitalRead(LEFT_LOOP_3_PIN);
bool currentRightLoop2 = digitalRead(RIGHT_LOOP_2_PIN);
bool currentRightLoop1Pulse = digitalRead(RIGHT_LOOP_1_PULSE_PIN);
bool currentRightLoop3 = digitalRead(RIGHT_LOOP_3_PIN);
bool currentRightLoop1Press = digitalRead(RIGHT_LOOP_1_PRESS_PIN);
// Handle loop 2 entry
if (currentLeftLoop2 && !prevLeftLoop2) {
counter++;
Serial.println("Left Loop 2 Relay Triggered! Increment counter.");
Serial.print("Counter: ");
Serial.println(counter);
}
prevLeftLoop2 = currentLeftLoop2;
// Handle loop 1 pulse relay
if (currentLeftLoop1Pulse && !prevLeftLoop1Pulse) {
counter++;
Serial.println("Left Loop 1 Pulse Relay Triggered! Increment counter.");
Serial.print("Counter: ");
Serial.println(counter);
}
prevLeftLoop1Pulse = currentLeftLoop1Pulse;
// Handle loop 3 entry
if (currentLeftLoop3 && !prevLeftLoop3) {
digitalWrite(LEFT_BARRIER_PIN, HIGH); // Close the left barrier
digitalWrite(RIGHT_LIGHT_PIN, HIGH); // Turn on right red light
Serial.println("Left Loop 3 Relay Triggered! Close barrier and turn on righ red light.");
}
prevLeftLoop3 = currentLeftLoop3;
if (currentRightLoop3 && !prevRightLoop3) {
digitalWrite(RIGHT_BARRIER_PIN, LOW); // Open the right barrier
Serial.println("Right Loop 3 Relay Triggered! Open right barrier.");
}
prevRightLoop3 = currentRightLoop3;
if (currentRightLoop2 && !prevRightLoop2) {
counter--;
Serial.println("Right Loop 2 Relay Triggered! Decrement counter.");
Serial.print("Counter: ");
Serial.println(counter);
}
prevRightLoop2 = currentRightLoop2;
if (currentRightLoop1Press && !prevLeftLoop1Press) {
counter--;
digitalWrite(RIGHT_BARRIER_PIN, HIGH); // Close the right barrier
Serial.println("Right Loop 1 Press Relay Triggered! Decrement counter and close barrier.");
Serial.print("Counter: ");
Serial.println(counter);
}
prevLeftLoop1Press = currentRightLoop1Press;
if (currentRightLoop1Pulse && !prevLeftLoop1Pulse) {
digitalWrite(RIGHT_LIGHT_PIN, LOW); // Turn off right red light
currentState = IDLE;
Serial.println("Right Loop 1 Pulse Relay Triggered! Turn off right red light and switch to IDLE state.");
Serial.print("Counter: ");
Serial.println(counter);
}
prevLeftLoop1Pulse = currentRightLoop1Pulse;
}
void handleRightSideLogic() {
bool currentRightLoop2 = digitalRead(RIGHT_LOOP_2_PIN);
bool currentRightLoop1Pulse = digitalRead(RIGHT_LOOP_1_PULSE_PIN);
bool currentRightLoop3 = digitalRead(RIGHT_LOOP_3_PIN);
bool currentLeftLoop2 = digitalRead(LEFT_LOOP_2_PIN);
bool currentLeftLoop1Pulse = digitalRead(LEFT_LOOP_1_PULSE_PIN);
bool currentLeftLoop3 = digitalRead(LEFT_LOOP_3_PIN);
bool currentLeftLoop1Press = digitalRead(LEFT_LOOP_1_PRESS_PIN);
prevRightLoop3 = false;
// Handle loop 2 entry
if (currentRightLoop2 && !prevRightLoop2) {
counter--;
Serial.println("Right Loop 2 Relay Triggered! Decrement counter.");
Serial.print("Counter: ");
Serial.println(counter);
}
prevRightLoop2 = currentRightLoop2;
// Handle loop 1 pulse relay
if (currentRightLoop1Pulse && !prevRightLoop1Pulse) {
counter--;
Serial.println("Right Loop 1 Pulse Relay Triggered! Decrement counter.");
Serial.print("Counter: ");
Serial.println(counter);
}
prevRightLoop1Pulse = currentRightLoop1Pulse;
// Handle loop 3 entry
if (currentRightLoop3 && !prevRightLoop3) {
digitalWrite(RIGHT_BARRIER_PIN, HIGH); // Close the right barrier
digitalWrite(LEFT_LIGHT_PIN, HIGH); // Turn on left red light
Serial.println("Right Loop 3 Relay Triggered! Close barrier and turn on left red light.");
}
prevRightLoop3 = currentRightLoop3;
if (currentLeftLoop3 && !prevLeftLoop3) {
digitalWrite(LEFT_BARRIER_PIN, LOW); // Open the left barrier
Serial.println("Left Loop 3 Relay Triggered! Open left barrier.");
}
prevLeftLoop3 = currentLeftLoop3;
if (currentLeftLoop2 && !prevLeftLoop2) {
counter++;
Serial.println("Left Loop 2 Relay Triggered! Increment counter.");
Serial.print("Counter: ");
Serial.println(counter);
}
prevLeftLoop2 = currentLeftLoop2;
if (currentLeftLoop1Press && !prevLeftLoop1Press) {
counter++;
digitalWrite(LEFT_BARRIER_PIN, HIGH); // Close the left barrier
Serial.println("Left Loop 1 Press Relay Triggered! Increment counter and close barrier.");
Serial.print("Counter: ");
Serial.println(counter);
}
prevLeftLoop1Press = currentLeftLoop1Press;
if (currentLeftLoop1Pulse && !prevLeftLoop1Pulse) {
digitalWrite(LEFT_LIGHT_PIN, LOW); // Turn off left red light
currentState = IDLE;
Serial.println("Left Loop 1 Pulse Relay Triggered! Turn off left red light and switch to IDLE state.");
Serial.print("Counter: ");
Serial.println(counter);
}
prevLeftLoop1Pulse = currentLeftLoop1Pulse;
}