/*
S Prashanth PES2UG21EC127
Implementation of a traffic controlling system using FreeRTOS .
It consists of two sets of traffic lights, each controlled by a separate task.
The traffic lights cycle through the red, yellow, and green states according to predefined time intervals.
The synchronization between the sets of traffic lights ensures that when one set's red LED is on,
the other set's green LED is on, and vice versa.
A reset button is also added to reset the operation.
*/
#include <Arduino_FreeRTOS.h>
#include <semphr.h>
// Define pins for traffic lights - Set 1
#define RED_LED_PIN_SET1 9
#define YELLOW_LED_PIN_SET1 10
#define GREEN_LED_PIN_SET1 11
// Define pins for traffic lights - Set 2
#define RED_LED_PIN_SET2 8
#define YELLOW_LED_PIN_SET2 7
#define GREEN_LED_PIN_SET2 6
// Define pin for reset button
#define RESET_BUTTON_PIN 2
// Define time intervals for traffic lights
#define RED_LIGHT_DURATION 5000 // 5 seconds
#define YELLOW_LIGHT_DURATION 2000 // 2 seconds
#define GREEN_LIGHT_DURATION 5000 // 5 seconds
// Task handles
TaskHandle_t trafficLightTaskSet1Handle = NULL;
TaskHandle_t trafficLightTaskSet2Handle = NULL;
// Semaphore for traffic light synchronization
SemaphoreHandle_t trafficLightSemaphore;
void setup() {
// Initialize serial communication if needed
Serial.begin(9600);
// Initialize pins for traffic lights - Set 1
pinMode(RED_LED_PIN_SET1, OUTPUT);
pinMode(YELLOW_LED_PIN_SET1, OUTPUT);
pinMode(GREEN_LED_PIN_SET1, OUTPUT);
// Initialize pins for traffic lights - Set 2
pinMode(RED_LED_PIN_SET2, OUTPUT);
pinMode(YELLOW_LED_PIN_SET2, OUTPUT);
pinMode(GREEN_LED_PIN_SET2, OUTPUT);
// Initialize pin for reset button
pinMode(RESET_BUTTON_PIN, INPUT_PULLUP); // Enable internal pull-up resistor
// Create semaphore
trafficLightSemaphore = xSemaphoreCreateMutex();
// Create tasks for traffic lights - Set 1 and Set 2
xTaskCreate(trafficLightTaskSet1, "TrafficLightTaskSet1", 128, NULL, 2, &trafficLightTaskSet1Handle);
xTaskCreate(trafficLightTaskSet2, "TrafficLightTaskSet2", 128, NULL, 2, &trafficLightTaskSet2Handle);
// Create task for loop functionality
xTaskCreate(loopTask, "LoopTask", 128, NULL, 1, NULL);
}
void loopTask(void *pvParameters) {
while (true) {
// Check for reset button press
if (digitalRead(RESET_BUTTON_PIN) == LOW) {
// Reset the tasks by deleting and recreating them
vTaskDelete(trafficLightTaskSet1Handle);
vTaskDelete(trafficLightTaskSet2Handle);
xTaskCreate(trafficLightTaskSet1, "TrafficLightTaskSet1", 128, NULL, 2, &trafficLightTaskSet1Handle);
xTaskCreate(trafficLightTaskSet2, "TrafficLightTaskSet2", 128, NULL, 2, &trafficLightTaskSet2Handle);
}
vTaskDelay(100 / portTICK_PERIOD_MS); // Adjust delay as needed
}
}
void trafficLightTaskSet1(void *pvParameters) {
while (true) {
// Red light
digitalWrite(RED_LED_PIN_SET1, HIGH);
digitalWrite(YELLOW_LED_PIN_SET1, LOW);
digitalWrite(GREEN_LED_PIN_SET1, LOW);
vTaskDelay(RED_LIGHT_DURATION / portTICK_PERIOD_MS);
// Yellow light
digitalWrite(RED_LED_PIN_SET1, LOW);
digitalWrite(YELLOW_LED_PIN_SET1, HIGH);
digitalWrite(GREEN_LED_PIN_SET1, LOW);
vTaskDelay(YELLOW_LIGHT_DURATION / portTICK_PERIOD_MS);
// Green light
digitalWrite(RED_LED_PIN_SET1, LOW);
digitalWrite(YELLOW_LED_PIN_SET1, LOW);
digitalWrite(GREEN_LED_PIN_SET1, HIGH);
vTaskDelay(GREEN_LIGHT_DURATION / portTICK_PERIOD_MS);
}
}
void trafficLightTaskSet2(void *pvParameters) {
while (true) {
// Red light
digitalWrite(RED_LED_PIN_SET2, LOW);
digitalWrite(YELLOW_LED_PIN_SET2, LOW);
digitalWrite(GREEN_LED_PIN_SET2, HIGH);
vTaskDelay(RED_LIGHT_DURATION / portTICK_PERIOD_MS);
// Yellow light
digitalWrite(RED_LED_PIN_SET2, LOW);
digitalWrite(YELLOW_LED_PIN_SET2, HIGH);
digitalWrite(GREEN_LED_PIN_SET2, LOW);
vTaskDelay(YELLOW_LIGHT_DURATION / portTICK_PERIOD_MS);
// Green light
digitalWrite(RED_LED_PIN_SET2, HIGH);
digitalWrite(YELLOW_LED_PIN_SET2, LOW);
digitalWrite(GREEN_LED_PIN_SET2, LOW);
vTaskDelay(GREEN_LIGHT_DURATION / portTICK_PERIOD_MS);
}
}
void loop() {
// Empty loop because all tasks are managed by FreeRTOS
}