/*
Wokwi | questions
help me with this homework.
thái - Monday, February 2, 2026 10:47 AM
Perform the steps to program the system using a state-based approach,
and meet the following requirements:
Control an LED to blink in 5 different states:
OFF: LED is turned off.
SLOW_BLINK: LED blinks slowly (1 second per toggle).
MEDIUM_BLINK: LED blinks at medium speed (0.5 seconds per toggle).
FAST_BLINK: LED blinks fast (0.25 seconds per toggle).
VERYFAST_BLINK: LED blinks very fast (0.1 seconds per toggle).
The state changes once for each button press.
UP button: increases the state (from 1 → 5 and then loops back).
DOWN button: decreases the state (from 5 → 1 and then loops back).
*/
const int NUM_BTNS = 2;
const int BTN_PINS[] = {12, 11};
const int LED_PIN = 10;
bool ledState = false;
int btnState[NUM_BTNS];
int oldBtnState[NUM_BTNS];
int mode = 0;
unsigned long prevTime = 0;
void blinkLed(int mode) {
unsigned long interval = 0;
switch (mode) {
case 1:
interval = 1000;
break;
case 2:
interval = 500;
break;
case 3:
interval = 250;
break;
case 4:
interval = 125;
break;
default:
Serial.println("WTF");
}
if (millis() - prevTime >= interval) {
prevTime = millis();
ledState = !ledState;
}
digitalWrite(LED_PIN, ledState);
}
int checkButtons() {
int btnPressed = 0;
for (int i = 0; i < NUM_BTNS; i++) {
btnState[i] = digitalRead(BTN_PINS[i]); // check each button
if (btnState[i] != oldBtnState[i]) { // if it changed
oldBtnState[i] = btnState[i]; // remember state for next time
if (btnState[i] == 0) { // was just pressed
btnPressed = i + 1;
if (btnPressed == 1) {
Serial.println("UP");
}
if (btnPressed == 2) {
Serial.println("DOWN");
}
}
delay(20); // debounce
}
}
return btnPressed;
}
void setup() {
Serial.begin(115200);
pinMode(BTN_PINS[0], INPUT_PULLUP);
pinMode(BTN_PINS[1], INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
Serial.println("Mode: 0");
}
void loop() {
int btnNumber = checkButtons();
if (btnNumber != 0) {
if (btnNumber == 1) {
mode++;
if (mode > 4) mode = 0;
} else {
mode--;
if (mode < 0) mode = 4;
}
Serial.print("Mode: ");
Serial.println(mode);
}
if (mode != 0) {
blinkLed(mode);
} else {
digitalWrite(LED_PIN, LOW);
}
}