#include "stm32c0xx_hal.h"
GPIO_TypeDef* ledPorts[] = {GPIOB, GPIOB, GPIOB, GPIOB, GPIOA};
uint16_t ledPins[] = {
GPIO_PIN_3,
GPIO_PIN_10,
GPIO_PIN_4,
GPIO_PIN_5,
GPIO_PIN_15
};
int totalLEDs = 5;
int winLedPinIndex = 2; // PA15
int baseDelayTime = 100;
int delayTime = 100;
int fastDelayTime = 20;
int level = 1;
int maxLevel = 5;
volatile uint8_t holdLEDState = 0;
volatile int lastLEDIndex = -1;
enum GameState {
IDLE,
RUNNING,
WIN,
LOSE
};
GameState currentState = IDLE;
/* ---------------- Helper Functions ---------------- */
void setRGBColor(GPIO_PinState red, GPIO_PinState blue) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, red);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, blue);
}
void holdLEDs() {
holdLEDState = 1;
}
/* ---------------- Arduino Style ---------------- */
void setup() {
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// LED pins
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
for (int i = 0; i < totalLEDs; i++) {
GPIO_InitStruct.Pin = ledPins[i];
HAL_GPIO_Init(ledPorts[i], &GPIO_InitStruct);
}
// RGB pins
GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_5;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// Button pakai Arduino attachInterrupt
pinMode(D2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(D2), holdLEDs, FALLING);
setRGBColor(GPIO_PIN_SET, GPIO_PIN_SET);
}
void loop() {
switch (currentState) {
case IDLE:
holdLEDState = 0;
lastLEDIndex = -1;
setRGBColor(GPIO_PIN_SET, GPIO_PIN_SET);
currentState = RUNNING;
break;
case RUNNING:
for (int i = 0; i < totalLEDs; i++) {
if (holdLEDState) {
lastLEDIndex = i;
currentState = (i == winLedPinIndex) ? WIN : LOSE;
break;
}
HAL_GPIO_WritePin(ledPorts[i], ledPins[i], GPIO_PIN_SET);
HAL_Delay(delayTime);
HAL_GPIO_WritePin(ledPorts[i], ledPins[i], GPIO_PIN_RESET);
}
break;
case WIN:
HAL_GPIO_WritePin(
ledPorts[lastLEDIndex],
ledPins[lastLEDIndex],
GPIO_PIN_SET
);
setRGBColor(GPIO_PIN_SET, GPIO_PIN_RESET); // merah
HAL_Delay(1000);
if (level < maxLevel) {
level++;
if (delayTime > fastDelayTime)
delayTime -= 20;
}
currentState = IDLE;
break;
case LOSE:
HAL_GPIO_WritePin(
ledPorts[lastLEDIndex],
ledPins[lastLEDIndex],
GPIO_PIN_SET
);
setRGBColor(GPIO_PIN_RESET, GPIO_PIN_SET); // biru
HAL_Delay(1000);
currentState = IDLE;
break;
}
}Loading
st-nucleo-c031c6
st-nucleo-c031c6