//Programming final
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
// Define number of elements GPIO pin arrays
#define NUM_LEDS 3 // number of LEDs in each direction
#define NUM_DIRECTIONS 2 // 2 directions the one intersection
// Traffic light GPIO pins
int traffic_lights[NUM_DIRECTIONS][NUM_LEDS] = {
{35,0,45}, // Direction 1: RED1, YELLOW1, GREEN1
{48,47,21} // Direction 2: RED2, YELLOW2, GREEN2
};
//creating a seperate pair of arrays to call
int same_traffic[] = {35,0,45};
int opposite_traffic[] = {48,47,21};
// Pedestrian GPIO pins
#define PIR_SENSOR GPIO_NUM_4
#define PUSH_BUTTON GPIO_NUM_8
//start button
#define START_BUTTON GPIO_NUM_3
//defining the white leds to their respective pins
int white_leds[NUM_DIRECTIONS] = {36,37}; // WHITE1 (Dir1), WHITE2 (Dir2)
// Function Declarations
void initialize_gpio();
void normal_traffic_sequence();
void pedestrian_signal(int pedestrian_input, int same_traffic[], int opposite_traffic[], int white_led);
// Main function
void app_main() {
//calling the initialize function
initialize_gpio();
vTaskDelay(1000 / portTICK_PERIOD_MS);//delay
//creating an infinite loop to constantly check the state of the three inputs
while (1) {
// Set GPIO direction for input pins
int push_button_state = gpio_get_level(PUSH_BUTTON);
int start_button_state = gpio_get_level(START_BUTTON);
int pir_sensor_state = gpio_get_level(PIR_SENSOR);
//first if loop, containing the normal traffic sequence
if (start_button_state==1){
normal_traffic_sequence();
}
//nested loop for the wo pedestrian inputs
if (start_button_state==0){
if (push_button_state==1){
pedestrian_signal(1, same_traffic[0], opposite_traffic[1], white_leds[0]); // Use first white LED
}
if (pir_sensor_state==1){
pedestrian_signal(1, same_traffic[1], opposite_traffic[0], white_leds[1]); // Use second white LED
}
}
vTaskDelay(500 / portTICK_PERIOD_MS); // Small delay to avoid rapid state changes
}
}
//definition of the initilization
void initialize_gpio(){
for (int i = 0; i < NUM_DIRECTIONS; i++) {
for( int j = 0; j < NUM_LEDS; j++){
gpio_set_direction(traffic_lights[i][j], GPIO_MODE_OUTPUT);
}
}
//for loop for thr white leds (setting them to output)
for (int i = 0; i < NUM_DIRECTIONS; i++) {
gpio_set_direction(white_leds[i], GPIO_MODE_OUTPUT); // WHITE LEDs for both directions
}
gpio_set_direction(PUSH_BUTTON, GPIO_MODE_INPUT);
gpio_set_direction(START_BUTTON, GPIO_MODE_INPUT);
gpio_set_direction(PIR_SENSOR, GPIO_MODE_INPUT);
}
//normal traffic sequence
void normal_traffic_sequence() {
//***Sequence 1***
gpio_set_level(traffic_lights[0][0], 1);//red1
gpio_set_level(traffic_lights[0][1], 0);//yellow1
gpio_set_level(traffic_lights[0][2], 0);//green1
gpio_set_level(traffic_lights[1][0], 0);//red2
gpio_set_level(traffic_lights[1][1], 0);//yellow2
gpio_set_level(traffic_lights[1][2], 1);//green2
vTaskDelay(5000 / portTICK_PERIOD_MS);
//***Sequence 2***
gpio_set_level(traffic_lights[0][0], 1);//red1
gpio_set_level(traffic_lights[0][1], 0);//yellow1
gpio_set_level(traffic_lights[0][2], 0);//green1
gpio_set_level(traffic_lights[1][0], 0);//red2
gpio_set_level(traffic_lights[1][1], 1);//yellow2
gpio_set_level(traffic_lights[1][2], 0);//green2
vTaskDelay(2000 / portTICK_PERIOD_MS);
//***Sequence 3***
gpio_set_level(traffic_lights[0][0], 0);//red1
gpio_set_level(traffic_lights[0][1], 0);//yellow1
gpio_set_level(traffic_lights[0][2], 1);//green1
gpio_set_level(traffic_lights[1][0], 1);//red2
gpio_set_level(traffic_lights[1][1], 0);//yellow2
gpio_set_level(traffic_lights[1][2], 0);//green2
vTaskDelay(5000 / portTICK_PERIOD_MS);
//***Sequence 4***
gpio_set_level(traffic_lights[0][0], 0);//red1
gpio_set_level(traffic_lights[0][1], 1);//yellow1
gpio_set_level(traffic_lights[0][2], 0);//green1
gpio_set_level(traffic_lights[1][0], 1);//red2
gpio_set_level(traffic_lights[1][1], 0);//yellow2
gpio_set_level(traffic_lights[1][2], 0);//green2
vTaskDelay(2000 / portTICK_PERIOD_MS);
//***Sequence 5***
gpio_set_level(traffic_lights[0][0], 1);//red1
gpio_set_level(traffic_lights[0][1], 0);//yellow1
gpio_set_level(traffic_lights[0][2], 0);//green1
gpio_set_level(traffic_lights[1][0], 0);//red2
gpio_set_level(traffic_lights[1][1], 0);//yellow2
gpio_set_level(traffic_lights[1][2], 1);//green2
vTaskDelay(5000 / portTICK_PERIOD_MS);
//added this to set them all to zero
//***Sequence 6***
gpio_set_level(traffic_lights[0][0], 0);//red1
gpio_set_level(traffic_lights[0][1], 0);//yellow1
gpio_set_level(traffic_lights[0][2], 0);//green1
gpio_set_level(traffic_lights[1][0], 0);//red2
gpio_set_level(traffic_lights[1][1], 0);//yellow2
gpio_set_level(traffic_lights[1][2], 0);//green2
}
//defining the pedestrian signal function
void pedestrian_signal( int pedestrian_input, int same_traffic[], int opposite_traffic[], int white_led) {
//when the pedestrian input is 1
if (pedestrian_input==1){
printf("Pedestrians crossing!");
gpio_set_level(traffic_lights[0][2], 0);//green2
gpio_set_level(traffic_lights[0][0], 0);//red1
gpio_set_level(traffic_lights[0][2], 1);//green2 on
gpio_set_level(traffic_lights[1][0], 1);//yellow1 on
//to loop the white leds while counting down from five and printing that value as well
for(int i=5;i>=0;i--){
printf("\n%d\n",i);
gpio_set_level(white_led, 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);//delay
gpio_set_level(white_led, 0);
vTaskDelay(1000 / portTICK_PERIOD_MS);//delay
}
gpio_set_level(traffic_lights[1][0], 0);////turn off yellow1
gpio_set_level(traffic_lights[0][2], 0);////turn off green2
gpio_set_level(traffic_lights[0][0], 1);//turns on red1
vTaskDelay(2000 / portTICK_PERIOD_MS);//delay
gpio_set_level(traffic_lights[0][0], 0);//turn off red1
}
}