#define LED1 25
#define LED2 33
#define LED3 32
#define BUTTON 22
#define DOT_TIME 250
long init_time = -1;
long end_time = -1;
long resulting_time;
long up_time = -1;
int button_ant;
void IRAM_ATTR toggleLED1() {
if (digitalRead(BUTTON) == HIGH) {
// Rising edge
// Detect if different letter
if (end_time != -1 && (millis() - end_time) > DOT_TIME*3*3) {
Serial.print("/");
}
else if (end_time != -1 && (millis() - end_time) > DOT_TIME*3) {
Serial.print(" ");
}
// Detect if different word
end_time = -1;
init_time = millis();
}
else if (end_time == -1) {
// Rising edge
end_time = millis();
resulting_time = end_time - init_time;
if (resulting_time >= 3*DOT_TIME) {
Serial.print("-");
}
else {
Serial.print(".");
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
attachInterrupt(BUTTON, toggleLED1, CHANGE);
pinMode(BUTTON, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
if (digitalRead(BUTTON) == HIGH) {
if (button_ant == 0) { // Flanc ascendent
up_time = millis();
}
button_ant = 1;
}
else {
if (button_ant == 1) { // Flanc descendent
up_time = -1;
}
button_ant = 0;
}
if (up_time != -1) {
digitalWrite(LED3, HIGH);
if ((millis() - up_time) > 2*DOT_TIME) digitalWrite(LED2, HIGH);
if ((millis() - up_time) > 3*DOT_TIME) digitalWrite(LED1, HIGH);
}
else {
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
}
delay(10); // this speeds up the simulation
}