I’ve followed your suggestion to create three tasks for controlling the traffic lights. I’ve encountered a challenge when it comes to implementing the flashing logic for pedestrian signals in the code.
#include <Arduino.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
// Define pin numbers for traffic lights
#define NS_VEHICLE_RED 23
#define NS_VEHICLE_GREEN 22
#define NS_VEHICLE_YELLOW 21
#define NS_PED_RED 19
#define NS_PED_GREEN 18
#define EW_VEHICLE_RED 4
#define EW_VEHICLE_GREEN 2
#define EW_VEHICLE_YELLOW 15
#define EW_PED_RED 17
#define EW_PED_GREEN 16
// Define states for traffic lights
typedef enum {
RED,
GREEN,
YELLOW,
nsPedestrianRED,
nsGREEN,
ewPedestrianRED,
ewGREEN
} LightState;
LightState nsVehicleState = RED;
LightState ewVehicleState = RED;
LightState nsPedestrianState = RED;
LightState ewPedestrianState = RED;
// Task handles
TaskHandle_t nsLightTaskHandle;
TaskHandle_t ewLightTaskHandle;
// Function to control NS lights
void nsLightTask(void *parameter) {
while (1) {
switch (nsVehicleState) {
case RED:
digitalWrite(NS_VEHICLE_RED, HIGH);
digitalWrite(NS_VEHICLE_GREEN, LOW);
digitalWrite(NS_VEHICLE_YELLOW, LOW);
break;
case GREEN:
digitalWrite(NS_VEHICLE_RED, LOW);
digitalWrite(NS_VEHICLE_GREEN, HIGH);
digitalWrite(NS_VEHICLE_YELLOW, LOW);
break;
case YELLOW:
digitalWrite(NS_VEHICLE_RED, LOW);
digitalWrite(NS_VEHICLE_GREEN, LOW);
digitalWrite(NS_VEHICLE_YELLOW, HIGH);
break;
case nsPedestrianRED:
digitalWrite(NS_PED_RED, HIGH);
digitalWrite(NS_PED_GREEN, LOW);
break;
case nsGREEN:
digitalWrite(NS_PED_RED, LOW);
digitalWrite(NS_PED_GREEN, HIGH);
break;
}
//vTaskDelay(pdMS_TO_TICKS(1000)); // Adjust the delay as needed
}
}
// Function to control EW lights
void ewLightTask(void *parameter) {
while (1) {
switch (ewVehicleState) {
case RED:
digitalWrite(EW_VEHICLE_RED, HIGH);
digitalWrite(EW_VEHICLE_GREEN, LOW);
digitalWrite(EW_VEHICLE_YELLOW, LOW);
break;
case GREEN:
digitalWrite(EW_VEHICLE_RED, LOW);
digitalWrite(EW_VEHICLE_GREEN, HIGH);
digitalWrite(EW_VEHICLE_YELLOW, LOW);
break;
case YELLOW:
digitalWrite(EW_VEHICLE_RED, LOW);
digitalWrite(EW_VEHICLE_GREEN, LOW);
digitalWrite(EW_VEHICLE_YELLOW, HIGH);
break;
case ewPedestrianRED:
digitalWrite(EW_PED_RED, HIGH);
digitalWrite(EW_PED_GREEN, LOW);
break;
case ewGREEN:
digitalWrite(EW_PED_RED, LOW);
digitalWrite(EW_PED_GREEN, HIGH);
break;
}
// vTaskDelay(pdMS_TO_TICKS(1000)); // Adjust the delay as needed
}
}
// Function for the master control task
void masterControlTask(void *parameter) {
while (1) {
// Send commands to control NS and EW lights
nsVehicleState = GREEN;
ewVehicleState = RED;
nsPedestrianState = GREEN;
ewPedestrianState = GREEN;
vTaskDelay(pdMS_TO_TICKS(20000)); // 20 seconds for NS green
nsVehicleState = RED;
nsPedestrianState = nsGREEN;
vTaskDelay(pdMS_TO_TICKS(7000)); // 7 seconds
nsVehicleState = RED;
nsPedestrianState = YELLOW;
vTaskDelay(pdMS_TO_TICKS(3000)); // 3 seconds
nsVehicleState = RED;
nsPedestrianState = RED;
ewVehicleState = GREEN;
vTaskDelay(pdMS_TO_TICKS(20000)); // 20 seconds for EW green
ewPedestrianState = ewGREEN;
ewVehicleState = RED;
vTaskDelay(pdMS_TO_TICKS(7000)); // 7 seconds
ewPedestrianState = YELLOW;
vTaskDelay(pdMS_TO_TICKS(3000)); // 3 seconds
ewVehicleState = RED;
}
}
void setup() {
pinMode(NS_VEHICLE_RED, OUTPUT);
pinMode(NS_VEHICLE_GREEN, OUTPUT);
pinMode(NS_VEHICLE_YELLOW, OUTPUT);
digitalWrite(NS_VEHICLE_YELLOW, LOW);
pinMode(NS_PED_RED, OUTPUT);
pinMode(NS_PED_GREEN, OUTPUT);
pinMode(EW_VEHICLE_RED, OUTPUT);
pinMode(EW_VEHICLE_GREEN, OUTPUT);
pinMode(EW_VEHICLE_YELLOW, OUTPUT);
pinMode(EW_PED_RED, OUTPUT);
pinMode(EW_PED_GREEN, OUTPUT);
// Initially set all lights to red
digitalWrite(NS_VEHICLE_RED, HIGH);
digitalWrite(NS_VEHICLE_GREEN, LOW);
digitalWrite(NS_VEHICLE_YELLOW, LOW);
digitalWrite(NS_PED_RED, HIGH);
digitalWrite(NS_PED_GREEN, LOW);
digitalWrite(EW_VEHICLE_RED, HIGH);
digitalWrite(EW_VEHICLE_GREEN, LOW);
digitalWrite(EW_VEHICLE_YELLOW, LOW);
digitalWrite(EW_PED_RED, HIGH);
digitalWrite(EW_PED_GREEN, LOW);
// Add a delay for 10 seconds to keep all lights red initially
delay(10000);
// Create tasks for NS and EW lights
xTaskCreatePinnedToCore(nsLightTask, "NSLightTask", 10000, NULL, 1, &nsLightTaskHandle, 0);
xTaskCreatePinnedToCore(ewLightTask, "EWLightTask", 10000, NULL, 1, &ewLightTaskHandle, 0);
// Create the master control task
xTaskCreatePinnedToCore(masterControlTask, "MasterControlTask", 10000, NULL, 1, NULL, 0);
}
void loop() {
// Nothing to do here
}