const uint16_t BUTTON_PIN = 2;
const uint16_t LED_0_PIN = 8;
const uint16_t LED_1_PIN = 7;
const uint16_t LED_2_PIN = 6;
const uint16_t LED_3_PIN = 5;
const uint8_t DEBOUNCE_DELAY = 50;
const uint16_t COUNTER_RESET_DELAY = 1000;
uint8_t counter = 0;
uint8_t reset_sequence = 0;
uint32_t last_high_state = 0;
void setup() {
pinSetup();
resetSequence();
}
void pinSetup() {
pinMode(BUTTON_PIN, INPUT);
pinMode(LED_0_PIN, OUTPUT);
pinMode(LED_1_PIN, OUTPUT);
pinMode(LED_2_PIN, OUTPUT);
pinMode(LED_3_PIN, OUTPUT);
}
void loop() {
detectButtonStateChange(buttonStateChange);
detectReset();
counterToLEDs();
}
void resetSequence() {
for (uint8_t i = 0; i < 3; i++) {
digitalWrite(LED_0_PIN, HIGH);
digitalWrite(LED_1_PIN, HIGH);
digitalWrite(LED_2_PIN, HIGH);
digitalWrite(LED_3_PIN, HIGH);
delay(200);
digitalWrite(LED_0_PIN, LOW);
digitalWrite(LED_1_PIN, LOW);
digitalWrite(LED_2_PIN, LOW);
digitalWrite(LED_3_PIN, LOW);
delay(200);
}
}
void buttonStateChange(uint8_t button_state) {
if (button_state == LOW) {
if (reset_sequence == 0) {
counter++;
} else {
reset_sequence = 0;
}
last_high_state = 0;
} else {
last_high_state = millis();
}
}
void detectReset() {
if (last_high_state > 0 && millis() - last_high_state > COUNTER_RESET_DELAY) {
counter = 0;
last_high_state = 0;
reset_sequence = 1;
resetSequence();
}
}
void detectButtonStateChange(void(*handler)(uint8_t)) {
static uint8_t button_last_state = LOW;
static uint8_t button_last_valid_state = LOW;
static uint32_t last_debounce_time = 0;
uint8_t current_button_state = digitalRead(BUTTON_PIN);
if (current_button_state != button_last_state) {
last_debounce_time = millis();
}
if ((millis() - last_debounce_time) > DEBOUNCE_DELAY) {
if (current_button_state != button_last_valid_state) {
button_last_valid_state = current_button_state;
handler(current_button_state);
}
}
button_last_state = current_button_state;
}
void counterToLEDs() {
digitalWrite(LED_0_PIN, binaryBit(counter, 16, 0));
digitalWrite(LED_1_PIN, binaryBit(counter, 16, 1));
digitalWrite(LED_2_PIN, binaryBit(counter, 16, 2));
digitalWrite(LED_3_PIN, binaryBit(counter, 16, 3));
}
uint8_t binaryBit(uint8_t number, uint8_t max_number, uint8_t position) {
number = number % max_number;
return (number >> position) & 0x1;
}