// Pin definitions
#define LED_PIN LED_BUILTIN // Built-in LED on Pico W
#define BUTTON_PIN 2 // Button connected to GPIO2
// Global variables
static bool led_state = false;
static bool pattern_reversed = false;
static unsigned long start_time;
static unsigned long last_blink_time;
static unsigned long last_button_time = 0;
// Function to get current minute (0, 1, or 2)
int get_current_minute() {
unsigned long elapsed_ms = millis() - start_time;
return (elapsed_ms / 60000) % 3; // Cycle through 0, 1, 2
}
// Function to get blinks per minute based on current minute and pattern
int get_blinks_per_minute(int minute) {
if (pattern_reversed) {
switch (minute) {
case 0: return 30;
case 1: return 20;
case 2: return 10;
default: return 10;
}
} else {
switch (minute) {
case 0: return 10;
case 1: return 20;
case 2: return 30;
default: return 10;
}
}
}
// Function to calculate blink interval in milliseconds
unsigned long get_blink_interval(int blinks_per_minute) {
return 60000 / blinks_per_minute; // 60000 ms = 1 minute
}
// Button debouncing function
bool button_pressed() {
static bool button_state = HIGH;
bool current_state = digitalRead(BUTTON_PIN);
unsigned long current_time = millis();
// Debounce delay of 30ms (reduced from 50ms)
if (current_time - last_button_time > 30) {
if (current_state != button_state && current_state == LOW) {
button_state = current_state;
last_button_time = current_time;
Serial.println(">>> BUTTON EDGE DETECTED! <<<"); // Extra debug
return true; // Button was pressed (high to low transition)
}
button_state = current_state;
}
return false;
}
void setup() {
// Initialize serial for debugging
Serial.begin(115200);
// Initialize LED pin
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// Initialize button pin with pull-up
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Record start time
start_time = millis();
last_blink_time = start_time;
Serial.println("LED Blinker Started!");
Serial.println("Pattern: 10->20->30 blinks per minute");
Serial.println("Press button to reverse pattern");
}
void loop() {
unsigned long current_time = millis();
// DEBUG: Print button state every 2 seconds
static unsigned long last_debug_time = 0;
if (current_time - last_debug_time > 2000) {
Serial.print("DEBUG - Button state: ");
Serial.print(digitalRead(BUTTON_PIN) ? "HIGH (not pressed)" : "LOW (pressed)");
Serial.print(", Pattern: ");
Serial.println(pattern_reversed ? "REVERSED" : "NORMAL");
last_debug_time = current_time;
}
// Check for button press
if (button_pressed()) {
pattern_reversed = !pattern_reversed;
Serial.print(">>> BUTTON PRESSED! Pattern ");
Serial.print(pattern_reversed ? "REVERSED" : "NORMAL");
Serial.print("! Now: ");
Serial.println(pattern_reversed ? "30->20->10" : "10->20->30");
}
// Get current minute and calculate blink timing
int current_minute = get_current_minute();
int blinks_per_minute = get_blinks_per_minute(current_minute);
unsigned long blink_interval = get_blink_interval(blinks_per_minute);
// Check if it's time to toggle LED
if (current_time - last_blink_time >= blink_interval) {
led_state = !led_state;
digitalWrite(LED_PIN, led_state);
// Calculate actual time interval since last blink
unsigned long actual_interval = current_time - last_blink_time;
last_blink_time = current_time;
// Debug output with timing information
if (led_state) {
Serial.print("Minute ");
Serial.print(current_minute + 1);
Serial.print(": Blink ON! (");
Serial.print(blinks_per_minute);
Serial.print(" blinks/min) - Expected: ");
Serial.print(blink_interval);
Serial.print("ms, Actual: ");
Serial.print(actual_interval);
Serial.print("ms, Timestamp: ");
Serial.print(current_time);
Serial.println("ms");
} else {
Serial.print("Minute ");
Serial.print(current_minute + 1);
Serial.print(": Blink OFF - Interval: ");
Serial.print(actual_interval);
Serial.print("ms, Timestamp: ");
Serial.print(current_time);
Serial.println("ms");
}
}
// Small delay to prevent excessive CPU usage
delay(1);
}