#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#define LED_PIN 0
#define SW_PIN 20
volatile bool led_on = false;
volatile int32_t interval_ms = -500;
struct repeating_timer timer;
// タイマー割り込みコールバック関数
bool on_blink_timer(struct repeating_timer *t) {
led_on = !led_on;
gpio_put(LED_PIN, led_on);
return true; // trueを返すとタイマーを継続
}
// スイッチ割り込みコールバック関数
void on_switch(uint gpio, uint32_t events) {
// 点滅間隔を切り替え(マイナス値で指定することで実行時間を考慮した正確な周期になる)
interval_ms = (interval_ms == -500) ? -100 : -500;
// 既存のタイマーをキャンセルして新しい間隔で再スタート
cancel_repeating_timer(&timer);
add_repeating_timer_ms(interval_ms, on_blink_timer, NULL, &timer);
}
int main() {
stdio_init_all();
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_init(SW_PIN);
gpio_set_dir(SW_PIN, GPIO_IN);
// スイッチ割り込みの設定
gpio_set_irq_enabled_with_callback(SW_PIN, GPIO_IRQ_EDGE_FALL, true, &on_switch);
// タイマー割り込みの設定(初回スタート)
add_repeating_timer_ms(interval_ms, on_blink_timer, NULL, &timer);
// メインループはタイマーと割り込みに処理を任せるため空にする
while (true) {
tight_loop_contents(); // 低消費電力待機(必要に応じて sleep_ms(1000) などでも可)
}
}