#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()
{
}