#include <TimerOne.h>

#define BUTTON 2
#define LED 8

class Button
{
public:
  Button(int pinB)
  {
    _lastButton = HIGH;
    _curButton = HIGH;
    _pinButton = pinB;
    pinMode(pinB, INPUT_PULLUP);
  }

  ~Button() = default;

  void process()
  {
    _curButton = debounce();
    if (_lastButton == HIGH && _curButton == LOW)
    {
      Timer1.start();
    }
    _lastButton = _curButton;
  }

private:
  int _lastButton;
  int _curButton;
  int _pinButton;

  int debounce ()
  {
    int current = digitalRead(_pinButton);
    if(_lastButton != current)
    {
      delay(5);
      current = digitalRead(_pinButton);
    }
    return current;
  }
};

volatile Button button(BUTTON);
volatile static int symbolNum = 0;

void proxyButton()
{
  noInterrupts();
  if(symbolNum == 0)
  {
    button.process();
  }
  interrupts();
}

void SOS()
{
  ++symbolNum;
  switch(symbolNum)
  {
    //пауза между буквами = 3 точки
    //пауза между элементами одной буквы = 1 точка
    case 1:
    digitalWrite(LED, HIGH);
    break;
    case 2:
    digitalWrite(LED, LOW);
    break;
    case 3:
    digitalWrite(LED, HIGH);
    break;
    case 4:
    digitalWrite(LED, LOW);
    break;
    case 5:
    digitalWrite(LED, HIGH);
    break;
    case 6:
    Timer1.setPeriod(600000);
    digitalWrite(LED, LOW);    
    break;
    case 7:
    Timer1.setPeriod(600000);
    digitalWrite(LED, HIGH);
    break;
    case 8:
    Timer1.setPeriod(200000);
    digitalWrite(LED, LOW);
    break;
    case 9:
    Timer1.setPeriod(600000);
    digitalWrite(LED, HIGH);
    break;
    case 10:
    Timer1.setPeriod(200000);
    digitalWrite(LED, LOW);
    break;
    case 11:
    Timer1.setPeriod(600000);
    digitalWrite(LED, HIGH);
    break;
    case 12:
    digitalWrite(LED, LOW);
    break;
    case 13:
    Timer1.setPeriod(200000);
    digitalWrite(LED, HIGH);
    break;
    case 14:
    digitalWrite(LED, LOW);
    break;
    case 15:
    digitalWrite(LED, HIGH);
    break;
    case 16:
    digitalWrite(LED, LOW);
    break;
    case 17:
    digitalWrite(LED, HIGH);
    break;
    case 18:
    digitalWrite(LED, LOW);
    symbolNum = 0;   
    Timer1.stop();
    break;
  }  
}

void setup() 
{
  pinMode(LED, OUTPUT);
  attachInterrupt(0, proxyButton, CHANGE);
  Timer1.initialize(200000);
  Timer1.stop();
  Timer1.attachInterrupt(SOS);
}

void loop() 
{  
    
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
r1:1
r1:2
led1:A
led1:C