//Declaration
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "freertos/semphr.h"
//East-West
#define LED_RED_1 GPIO_NUM_4
#define LED_GREEN_1 GPIO_NUM_15
#define LED_ORANGE_1 GPIO_NUM_2
//North-South
#define LED_RED_2 GPIO_NUM_19
#define LED_GREEN_2 GPIO_NUM_5
#define LED_ORANGE_2 GPIO_NUM_18
struct led_task_parameters_t
{
gpio_num_t led_gpio;
TickType_t blink_time;
};
static led_task_parameters_t red_led_gpio_EW = {LED_RED_1, 2500};
static led_task_parameters_t green_led_gpio_EW = {LED_GREEN_1, 2000};
static led_task_parameters_t orange_led_gpio_EW = {LED_ORANGE_1, 500};
static led_task_parameters_t red_led_gpio_NS = {LED_RED_2, 2500};
static led_task_parameters_t green_led_gpio_NS = {LED_GREEN_2, 2000};
static led_task_parameters_t orange_led_gpio_NS = {LED_ORANGE_2, 500};
// ===================================V2===========================================
// Create mutexes and semaphores before starting tasks
SemaphoreHandle_t xEWSemaphore;
SemaphoreHandle_t xNSSemaphore;
void setup() {
// Initialize serial communication
Serial.begin(115200);
Serial.println("Traffic Light >>...");
// Create semaphores
xEWSemaphore = xSemaphoreCreateBinary();
xNSSemaphore = xSemaphoreCreateBinary();
// Check if semaphore creation succeeded
if ((xEWSemaphore != NULL) && (xNSSemaphore != NULL)) {
// Create tasks
xTaskCreate(&trafficLight_EW_task, "TrafficLight East-West ", 2048, NULL, 5, NULL);
xTaskCreate(&trafficLight_NS_task, "TrafficLight North-South ", 2048, NULL, 5, NULL);
xSemaphoreGive( ( xNSSemaphore ) ); // Give the Semaphore.
xSemaphoreGive( xEWSemaphore ); // Take the Semaphore.
xSemaphoreTake( xEWSemaphore,( TickType_t ) 100 ); // Take the Semaphore.
Serial.println("xEWSemaphore ...");
} else {
Serial.println("Failed to create semaphores!");
}
}
void loop() {
// write your main code here
delay(1000); // this speeds up the simulation
}
void trafficLight_EW_task(void *pvParameter) {
gpio_reset_pin(red_led_gpio_EW.led_gpio);
gpio_reset_pin(orange_led_gpio_EW.led_gpio);
gpio_reset_pin(green_led_gpio_EW.led_gpio);
gpio_set_direction(red_led_gpio_EW.led_gpio, GPIO_MODE_OUTPUT);
gpio_set_direction(green_led_gpio_EW.led_gpio, GPIO_MODE_OUTPUT);
gpio_set_direction(orange_led_gpio_EW.led_gpio, GPIO_MODE_OUTPUT);
gpio_set_level(red_led_gpio_EW.led_gpio, 1);//RED ON
while (1) {
// Take the semaphore
if (xSemaphoreTake(xEWSemaphore, (TickType_t) 100) != pdTRUE) {
gpio_set_level(red_led_gpio_NS.led_gpio, 1);
gpio_set_level(green_led_gpio_NS.led_gpio, 0);
gpio_set_level(orange_led_gpio_NS.led_gpio, 0);
Serial.println("NS: RED ON");
gpio_set_level(red_led_gpio_NS.led_gpio, 0);
gpio_set_level(green_led_gpio_NS.led_gpio, 1);
gpio_set_level(orange_led_gpio_NS.led_gpio, 0);
Serial.println("NS: GREEN ON");
gpio_set_level(red_led_gpio_NS.led_gpio, 0);
gpio_set_level(green_led_gpio_NS.led_gpio, 0);
gpio_set_level(orange_led_gpio_NS.led_gpio, 1);
Serial.println("NS: ORANGE ON");
xSemaphoreGive(xNSSemaphore);
vTaskDelete( NULL );
}
}
}
void trafficLight_NS_task(void *pvParameter) {
gpio_reset_pin(red_led_gpio_NS.led_gpio);
gpio_reset_pin(orange_led_gpio_NS.led_gpio);
gpio_reset_pin(green_led_gpio_NS.led_gpio);
gpio_set_direction(red_led_gpio_NS.led_gpio, GPIO_MODE_OUTPUT);
gpio_set_direction(green_led_gpio_NS.led_gpio, GPIO_MODE_OUTPUT);
gpio_set_direction(orange_led_gpio_NS.led_gpio, GPIO_MODE_OUTPUT);
gpio_set_level(red_led_gpio_NS.led_gpio, 1);//RED ON
while (1) {
// Take the semaphore
if (xSemaphoreTake(xNSSemaphore, (TickType_t) 100) != pdTRUE) {
gpio_set_level(red_led_gpio_NS.led_gpio, 0);
gpio_set_level(green_led_gpio_NS.led_gpio, 1);
gpio_set_level(orange_led_gpio_NS.led_gpio, 0);
Serial.println("NS: GREEN ON");
gpio_set_level(red_led_gpio_NS.led_gpio, 0);
gpio_set_level(green_led_gpio_NS.led_gpio, 0);
gpio_set_level(orange_led_gpio_NS.led_gpio, 1);
Serial.println("NS: ORANGE ON");
gpio_set_level(red_led_gpio_NS.led_gpio, 1);
gpio_set_level(green_led_gpio_NS.led_gpio, 0);
gpio_set_level(orange_led_gpio_NS.led_gpio, 0);
Serial.println("NS: RED ON");
xSemaphoreGive(xEWSemaphore);
}
}
}
// ===================================V2===========================================
// void setup() {
// // put your setup code here, to run once:
// Serial.begin(115200);
// Serial.println("Traffic Light >>...");
// xTaskCreate(
// &trafficLight_EW_task, // task function
// "TrafficLight East-West ", // task name
// 2048, // stack size in words
// NULL, // pointer to parameters
// 5, // priority
// NULL); // out pointer to task handle
// xTaskCreate(
// &trafficLight_NS_task, // task function
// "TrafficLight North-South ", // task name
// 2048, // stack size in words
// NULL, // pointer to parameters
// 5, // priority
// NULL); // out pointer to task handle
// }
// void loop() {
// // write your main code here
// delay(1000); // this speeds up the simulation
// }
// //trafficLight1_task : East-West
// void trafficLight_EW_task(void *pvParameter)
// {
// gpio_reset_pin(red_led_gpio_EW.led_gpio);
// gpio_reset_pin(orange_led_gpio_EW.led_gpio);
// gpio_reset_pin(green_led_gpio_EW.led_gpio);
// gpio_set_direction(red_led_gpio_EW.led_gpio, GPIO_MODE_OUTPUT);
// gpio_set_direction(green_led_gpio_EW.led_gpio, GPIO_MODE_OUTPUT);
// gpio_set_direction(orange_led_gpio_EW.led_gpio, GPIO_MODE_OUTPUT);
// gpio_set_level(red_led_gpio_EW.led_gpio, 1);//RED ON
// Serial.println("trafficLight_EW_task ...");
// while (1) {
// Serial.println("EW: GREEN ON");
// //GREEN ON
// gpio_set_level(red_led_gpio_EW.led_gpio, 0);
// gpio_set_level(green_led_gpio_EW.led_gpio, 1);
// gpio_set_level(orange_led_gpio_EW.led_gpio, 0);
// vTaskDelay(green_led_gpio_EW.blink_time / portTICK_PERIOD_MS);
// Serial.println("EW: ORANGE ON");
// //ORANGE ON
// gpio_set_level(red_led_gpio_EW.led_gpio, 0);
// gpio_set_level(green_led_gpio_EW.led_gpio, 0);
// gpio_set_level(orange_led_gpio_EW.led_gpio, 1);
// vTaskDelay(orange_led_gpio_EW.blink_time / portTICK_PERIOD_MS);
// Serial.println("EW: RED ON");
// //RED ON
// gpio_set_level(red_led_gpio_EW.led_gpio, 1);
// gpio_set_level(green_led_gpio_EW.led_gpio, 0);
// gpio_set_level(orange_led_gpio_EW.led_gpio, 0);
// vTaskDelay(red_led_gpio_EW.blink_time / portTICK_PERIOD_MS);
// }
// vTaskDelete( NULL );
// }
// void trafficLight_NS_task(void *pvParameter)
// {
// gpio_reset_pin(red_led_gpio_NS.led_gpio);
// gpio_reset_pin(orange_led_gpio_NS.led_gpio);
// gpio_reset_pin(green_led_gpio_NS.led_gpio);
// gpio_set_direction(red_led_gpio_NS.led_gpio, GPIO_MODE_OUTPUT);
// gpio_set_direction(green_led_gpio_NS.led_gpio, GPIO_MODE_OUTPUT);
// gpio_set_direction(orange_led_gpio_NS.led_gpio, GPIO_MODE_OUTPUT);
// gpio_set_level(red_led_gpio_NS.led_gpio, 1);//RED ON
// Serial.println("trafficLight_NS_task ...");
// while (1) {
// Serial.println("NS: RED ON");
// // GREEN ON
// gpio_set_level(red_led_gpio_NS.led_gpio, 1);
// gpio_set_level(green_led_gpio_NS.led_gpio, 0);
// gpio_set_level(orange_led_gpio_NS.led_gpio, 0);
// Serial.println("NS: GREEN ON");
// vTaskDelay(red_led_gpio_NS.blink_time / portTICK_PERIOD_MS);
// // ORANGE ON
// gpio_set_level(red_led_gpio_NS.led_gpio, 0);
// gpio_set_level(green_led_gpio_NS.led_gpio, 1);
// gpio_set_level(orange_led_gpio_NS.led_gpio, 0);
// vTaskDelay(green_led_gpio_NS.blink_time / portTICK_PERIOD_MS);
// Serial.println("NS: ORANGE ON");
// // RED ON
// gpio_set_level(red_led_gpio_NS.led_gpio, 0);
// gpio_set_level(green_led_gpio_NS.led_gpio, 0);
// gpio_set_level(orange_led_gpio_NS.led_gpio, 1);
// vTaskDelay(orange_led_gpio_NS.blink_time / portTICK_PERIOD_MS);
// }
// vTaskDelete( NULL );
// }