#include <stdio.h>
#include "pico/stdlib.h"
#define BUTTON_A_PIN 5
#define LED_RED_PIN 13
#define DEBOUNCE_TIME_MS 200
#define TIMES_TO_PRESS 5
volatile uint8_t button_count = 0;
volatile bool blinking = false;
volatile uint8_t blink_iterations = 0;
volatile uint8_t blinking_frequency = 10;
volatile absolute_time_t last_press_time = 0;
struct repeating_timer blink_timer;
bool led_blink_callback(struct repeating_timer *t)
{
blink_iterations++;
gpio_xor_mask(1u << LED_RED_PIN);
if (blink_iterations >= 100)
{
gpio_put(LED_RED_PIN, 0);
blinking = false;
blink_iterations = 0;
return false;
}
return true;
}
void button_callback(uint gpio, uint32_t events)
{
absolute_time_t current_time = get_absolute_time();
if (!blinking && absolute_time_diff_us(last_press_time, current_time) > DEBOUNCE_TIME_MS * 1000)
{
last_press_time = current_time;
button_count++;
printf("Button A pressed %d times.\n", button_count);
}
}
void setup_gpios()
{
stdio_init_all();
sleep_ms(1000);
gpio_init(BUTTON_A_PIN);
gpio_set_dir(BUTTON_A_PIN, GPIO_IN);
gpio_pull_up(BUTTON_A_PIN);
gpio_init(LED_RED_PIN);
gpio_set_dir(LED_RED_PIN, GPIO_OUT);
gpio_put(LED_RED_PIN, 0);
gpio_set_irq_enabled_with_callback(BUTTON_A_PIN, GPIO_IRQ_EDGE_FALL, true, &button_callback);
}
int main()
{
setup_gpios();
while (true)
{
if (button_count >= TIMES_TO_PRESS && !blinking)
{
blinking = true;
button_count = 0;
blink_iterations = 0;
printf("Blinking red led on 10Hz for 10 secs...\n");
add_repeating_timer_ms(1000 / blinking_frequency, led_blink_callback, NULL, &blink_timer);
}
sleep_ms(10);
}
return 0;
}