Ok, I'll try to split the code into multiple sections for clarity, but all this goes into one single sketch. First we define the PINs: defines are pre-processor macros, even better than `const` in terms of performance and space consumption: #define BTN_PIN 2 #define LED_PIN 13 Let's initialize the board as per our requirements: void setup() { pinMode(BTN_PIN, INPUT); pinMode(LED_PIN, OUTPUT); } Now we define the code which emits and SOS signal in morse code using the standard timing: 1. a long pulse lasts 3 times a short one 2. a space lasts 6 times a short pulse That boils down to the following definitions considering a standard unit of 300ms: #define UNIT 300 #define SHORT (UNIT) #define LONG (UNIT*3) #define SPACE (UNIT*6) I'm also going to define another macro to emit a generic light pulse, for simplicity I'll use the `delay(...)` function, but this will prevent detecting button presses while signalling: #define PULSE(TYPE) digitalWrite(LED_PIN, HIGH);delay(TYPE); digitalWrite(LED_PIN, LOW);delay(UNIT) With the above in place we can define a function to send an SOS which should be both very compact and also readable: void sendSOS() { PULSE(SHORT);PULSE(SHORT);PULSE(SHORT); PULSE(LONG);PULSE(LONG);PULSE(LONG); PULSE(SHORT);PULSE(SHORT);PULSE(SHORT); } Now, let's describe what the mode changing should be notified to the user: #define QUICK 100 bool auto = true; void switchMode() { auto = !auto; for (unsigned int i = 0; i < 25; i++) { digitalWrite(LED_PIN, HIGH); delay(QUICK); digitalWrite(LED_PIN, LOW); delay(QUICK); } } Now our main loop will have to check the button and act accordingly, right? #define LONGPRESS 500 unsigned long elapsed; bool clicked = false; unsigned long duration; void loop() { if (auto) { sendSOS(); } elapsed = millis(); while(clicked || millis() - elapsed <= SPACE) { // keep waiting to emit a SPACE or until the button is released if (digitalRead(BTN_PIN)) { // button has been clicked: trace it and start counting time clicked = true; duration = millis(); } else if (clicked) { // button has been released: stop tracing and verify click duration clicked = false; if (millis() - duration <= LONGPRESS) { // switch mode on long press switchMode(); } else if (!auto) { // short press has a meaning only when not in auto mode sendSOS(); } } } The solution above has great space for improvement: - there is no de-bouncing on the button - the board is unresponsive while signalling - keeping the button pressed forever will prevent any signalling to occur in any mode - the code is afflicted by `millis()` rollover if you leave the board running for long periods (around 49 days)