/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Four Direction Traffic Light Controller
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN 0 */
/*
=============================================================
PIN CONFIGURATION
=============================================================
NORTH
RED -> PA0
YELLOW -> PA1
GREEN -> PA4
SOUTH
RED -> PB1
YELLOW -> PA11
GREEN -> PA12
EAST
RED -> PB7
YELLOW -> PB6
GREEN -> PA10
WEST
RED -> PB4
YELLOW -> PB10
GREEN -> PB3
NORTH & SOUTH = NEGATIVE LOGIC
LOW = ON
HIGH = OFF
EAST & WEST = POSITIVE LOGIC
HIGH = ON
LOW = OFF
=============================================================
*/
/* =========================================================
NORTH GREEN STATE
North = GREEN
South = RED
East = RED
West = RED
========================================================= */
void NORTH_GREEN(void)
{
/* NORTH - Negative Logic */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // RED OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // GREEN ON
/* SOUTH - Negative Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // RED ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); // GREEN OFF
/* EAST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); // RED ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); // GREEN OFF
/* WEST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); // RED ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // GREEN OFF
}
/* =========================================================
NORTH + SOUTH YELLOW
North = YELLOW
South = YELLOW
East = RED
West = RED
========================================================= */
void NORTH_SOUTH_YELLOW(void)
{
/* NORTH - Negative Logic */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // RED OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // YELLOW ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // GREEN OFF
/* SOUTH - Negative Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // RED OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET); // YELLOW ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); // GREEN OFF
/* EAST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); // RED ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); // GREEN OFF
/* WEST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); // RED ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // GREEN OFF
}
/* =========================================================
SOUTH GREEN
North = RED
South = GREEN
East = RED
West = RED
========================================================= */
void SOUTH_GREEN(void)
{
/* NORTH - Negative Logic */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // RED ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // GREEN OFF
/* SOUTH - Negative Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // RED OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); // GREEN ON
/* EAST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); // RED ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); // GREEN OFF
/* WEST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); // RED ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // GREEN OFF
}
/* =========================================================
SOUTH + EAST YELLOW
North = RED
South = YELLOW
East = YELLOW
West = RED
========================================================= */
void SOUTH_EAST_YELLOW(void)
{
/* NORTH - Negative Logic */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // RED ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // GREEN OFF
/* SOUTH - Negative Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // RED OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET); // YELLOW ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); // GREEN OFF
/* EAST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); // RED OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET); // YELLOW ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); // GREEN OFF
/* WEST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); // RED ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // GREEN OFF
}
/* =========================================================
EAST GREEN
North = RED
South = RED
East = GREEN
West = RED
========================================================= */
void EAST_GREEN(void)
{
/* NORTH - Negative Logic */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // RED ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // GREEN OFF
/* SOUTH - Negative Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // RED ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); // GREEN OFF
/* EAST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); // RED OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET); // GREEN ON
/* WEST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET); // RED ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // GREEN OFF
}
/* =========================================================
EAST + WEST YELLOW
North = RED
South = RED
East = YELLOW
West = YELLOW
========================================================= */
void EAST_WEST_YELLOW(void)
{
/* NORTH - Negative Logic */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // RED ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // GREEN OFF
/* SOUTH - Negative Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // RED ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); // GREEN OFF
/* EAST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); // RED OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET); // YELLOW ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); // GREEN OFF
/* WEST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET); // RED OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); // YELLOW ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // GREEN OFF
}
/* =========================================================
WEST GREEN
North = RED
South = RED
East = RED
West = GREEN
========================================================= */
void WEST_GREEN(void)
{
/* NORTH - Negative Logic */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // RED ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // GREEN OFF
/* SOUTH - Negative Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // RED ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); // GREEN OFF
/* EAST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); // RED ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); // GREEN OFF
/* WEST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET); // RED OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET); // GREEN ON
}
/* =========================================================
WEST + NORTH YELLOW
North = YELLOW
South = RED
East = RED
West = YELLOW
========================================================= */
void WEST_NORTH_YELLOW(void)
{
/* NORTH - Negative Logic */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // RED OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // YELLOW ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // GREEN OFF
/* SOUTH - Negative Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // RED ON
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_SET); // GREEN OFF
/* EAST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); // RED ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); // YELLOW OFF
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_RESET); // GREEN OFF
/* WEST - Positive Logic */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET); // RED OFF
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); // YELLOW ON
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // GREEN OFF
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
/* =====================================================
TRAFFIC LIGHT LOOP
===================================================== */
while (1)
{
/* -----------------------------------------------
NORTH GREEN - 30 SECONDS
----------------------------------------------- */
NORTH_GREEN();
HAL_Delay(30000);
/* -----------------------------------------------
NORTH + SOUTH YELLOW - 3 SECONDS
----------------------------------------------- */
NORTH_SOUTH_YELLOW();
HAL_Delay(3000);
/* -----------------------------------------------
SOUTH GREEN - 25 SECONDS
----------------------------------------------- */
SOUTH_GREEN();
HAL_Delay(25000);
/* -----------------------------------------------
SOUTH + EAST YELLOW - 3 SECONDS
----------------------------------------------- */
SOUTH_EAST_YELLOW();
HAL_Delay(3000);
/* -----------------------------------------------
EAST GREEN - 15 SECONDS
----------------------------------------------- */
EAST_GREEN();
HAL_Delay(15000);
/* -----------------------------------------------
EAST + WEST YELLOW - 3 SECONDS
----------------------------------------------- */
EAST_WEST_YELLOW();
HAL_Delay(3000);
/* -----------------------------------------------
WEST GREEN - 20 SECONDS
----------------------------------------------- */
WEST_GREEN();
HAL_Delay(20000);
/* -----------------------------------------------
WEST + NORTH YELLOW - 3 SECONDS
----------------------------------------------- */
WEST_NORTH_YELLOW();
HAL_Delay(3000);
/* Repeat */
}
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
__HAL_FLASH_SET_LATENCY(FLASH_LATENCY_1);
/* HSE */
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/* Clock configuration */
RCC_ClkInitStruct.ClockType =
RCC_CLOCKTYPE_HCLK
| RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct,
FLASH_LATENCY_1) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Enable GPIO clocks */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOF_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* =====================================================
INITIAL OUTPUT STATES
NORTH/SOUTH -> Negative Logic
OFF = HIGH
===================================================== */
HAL_GPIO_WritePin(
GPIOA,
GPIO_PIN_0 |
GPIO_PIN_1 |
GPIO_PIN_4 |
GPIO_PIN_11 |
GPIO_PIN_12,
GPIO_PIN_SET
);
HAL_GPIO_WritePin(
GPIOB,
GPIO_PIN_1,
GPIO_PIN_SET
);
/* =====================================================
EAST/WEST -> Positive Logic
OFF = LOW
===================================================== */
HAL_GPIO_WritePin(
GPIOA,
GPIO_PIN_10,
GPIO_PIN_RESET
);
HAL_GPIO_WritePin(
GPIOB,
GPIO_PIN_3 |
GPIO_PIN_4 |
GPIO_PIN_6 |
GPIO_PIN_7 |
GPIO_PIN_10,
GPIO_PIN_RESET
);
/* =====================================================
GPIOA
===================================================== */
GPIO_InitStruct.Pin =
GPIO_PIN_0
| GPIO_PIN_1
| GPIO_PIN_4
| GPIO_PIN_10
| GPIO_PIN_11
| GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* =====================================================
GPIOB
===================================================== */
GPIO_InitStruct.Pin =
GPIO_PIN_1
| GPIO_PIN_3
| GPIO_PIN_4
| GPIO_PIN_6
| GPIO_PIN_7
| GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
/**
* @brief Error Handler
* @retval None
*/
void Error_Handler(void)
{
__disable_irq();
while (1)
{
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif /* USE_FULL_ASSERT */Loading
st-nucleo-c031c6
st-nucleo-c031c6
North
South
East
West