const int HEARTBEAT_PIN = LED_BUILTIN; // GP25 – onboard LED (sign of life)
const int LED_PIN = 15; // GP15 – external LED
const int BUTTON_PIN = 2; // GP2 – push-button (active-LOW)
const int POT_PIN = 26; // GP26 – potentiometer (ADC0)
// --- Heartbeat ---
unsigned long lastHeartbeat = 0;
// --- Blink ---
bool blinkEnabled = false;
unsigned long lastBlinkTime = 0;
unsigned long blinkInterval = 500;
// --- Button ---
bool lastButtonState = HIGH;
unsigned long lastPressTime = 0; // prevents multiple triggers per click
void setup() {
pinMode(HEARTBEAT_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
Serial1.begin(115200);
Serial1.println("=== Task 1 gestartet ===");
Serial1.println("Blink ist jetzt: AUS");
}
void loop() {
unsigned long now = millis();
// --- Heartbeat ---
// Toggles onboard LED every 300 ms – always running, sign of life
if (now - lastHeartbeat >= 300) {
lastHeartbeat = now;
digitalWrite(HEARTBEAT_PIN, !digitalRead(HEARTBEAT_PIN));
}
// --- Button ---
// Edge detection + 300 ms time guard to prevent multiple triggers per press
bool current = digitalRead(BUTTON_PIN);
if (lastButtonState == HIGH && current == LOW && (now - lastPressTime) > 300) {
lastPressTime = now;
blinkEnabled = !blinkEnabled;
if (blinkEnabled) {
Serial1.println("ON");
} else {
Serial1.println("OFF");
digitalWrite(LED_PIN, LOW);
}
}
lastButtonState = current;
// --- Potentiometer -> blink interval ---
// Maps ADC 0-4095 to 50-1000 ms, prints to Serial when value changes
blinkInterval = map(analogRead(POT_PIN), 0, 4095, 50, 1000);
static unsigned long lastPrintedInterval = 0;
if (abs((long)blinkInterval - (long)lastPrintedInterval) > 5) {
lastPrintedInterval = blinkInterval;
Serial1.print("Intervall: ");
Serial1.print(blinkInterval);
Serial1.println(" ms");
}
// --- Non-blocking blink ---
// Toggles external LED only when enabled and interval has elapsed
if (blinkEnabled && (now - lastBlinkTime >= blinkInterval)) {
lastBlinkTime = now;
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}
}