// Morse SOS on LED when button is pressed // SAMD21: LED on pin 0, button on pin 1 const int LED_PIN = 0; const int BUTTON_PIN = 1; // Length of one Morse "unit" in milliseconds const unsigned int UNIT = 200; // Adjust faster/slower as you like // For edge-detection and simple debouncing bool lastButtonState = HIGH; // with INPUT_PULLUP, HIGH = not pressed unsigned long lastDebounceTime = 0; const unsigned long DEBOUNCE_DELAY = 30; // ms void setup() { pinMode(LED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); // internal pull-up; button to GND digitalWrite(LED_PIN, LOW); } // --- Morse helpers --- void dot() { digitalWrite(LED_PIN, HIGH); delay(UNIT); // light on for 1 unit digitalWrite(LED_PIN, LOW); delay(UNIT); // gap between elements (1 unit) } void dash() { digitalWrite(LED_PIN, HIGH); delay(3 * UNIT); // light on for 3 units digitalWrite(LED_PIN, LOW); delay(UNIT); // gap between elements (1 unit) } // After finishing a letter, we already had a 1-unit gap // from dot()/dash(), so we only add 2 more units to reach 3 total. void letterGap() { delay(2 * UNIT); } void wordGap() { // After last element: 1 unit already passed // For full 7-unit word gap, add 6 units more. delay(6 * UNIT); } void sendS() { dot(); dot(); dot(); letterGap(); } void sendO() { dash(); dash(); dash(); letterGap(); } void sendSOS() { sendS(); sendO(); sendS(); // optional: word gap after SOS wordGap(); } void loop() { int reading = digitalRead(BUTTON_PIN); // Debounce: check if state changed if (reading != lastButtonState) { lastDebounceTime = millis(); lastButtonState = reading; } // If state has been stable for a bit, treat it as real if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) { // Button is active LOW: pressed when reading == LOW if (reading == LOW) { // Simple: wait until button released, then send SOS once // to avoid repeated triggers while held while (digitalRead(BUTTON_PIN) == LOW) { // do nothing, wait for release } sendSOS(); } } }