//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, 1000};
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, 200};
static led_task_parameters_t red_led_gpio_NS = {LED_RED_2, 1000};
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, 200};
SemaphoreHandle_t xNSSemaphore,xEWSemaphore;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Traffic Light >>...");
if ( xNSSemaphore == NULL )
{
xNSSemaphore = xSemaphoreCreateBinary();
if ( ( xNSSemaphore ) != NULL )
{xSemaphoreGive( ( xNSSemaphore ) ); // Give the Semaphore.
Serial.println("xNSSemaphore ...");
}
}
if ( xEWSemaphore == NULL )
{
xEWSemaphore = xSemaphoreCreateBinary();
if ( ( xEWSemaphore ) != NULL ) {
// xSemaphoreGive( xEWSemaphore ); // Take the Semaphore.
xSemaphoreTake( xEWSemaphore,( TickType_t ) 100 ); // Take the Semaphore.
Serial.println("xEWSemaphore ...");
}
}
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() {
// put your main code here, to run repeatedly:
// delay(10); // 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
Serial.println("trafficLight_EW_task ...");
while (1) {
while( xSemaphoreTake( xEWSemaphore, ( TickType_t ) 100 ) != pdTRUE ) ;
{
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);
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
Serial.println("trafficLight_NS_task ...");
while (1) {
while(xSemaphoreTake(xNSSemaphore, (TickType_t) 100) != pdTRUE);
{
Serial.println("NS: GREEN ON");
gpio_set_level(red_led_gpio_NS.led_gpio, 0);
gpio_set_level(green_led_gpio_NS.led_gpio, 1); // GREEN ON
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");
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); // ORANGE ON
vTaskDelay(orange_led_gpio_NS.blink_time / portTICK_PERIOD_MS);
Serial.println("NS: RED ON\n");
gpio_set_level(red_led_gpio_NS.led_gpio, 1); // RED ON
gpio_set_level(green_led_gpio_NS.led_gpio, 0);
gpio_set_level(orange_led_gpio_NS.led_gpio, 0);
xSemaphoreGive(xEWSemaphore);
}
}
vTaskDelete( NULL );
}