#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define LED_PIN 13
#define DOT_DURATION 250
#define LCD_ADDR 0x27
LiquidCrystal_I2C lcd(LCD_ADDR, 16, 2);
void blinkDot() {
digitalWrite(LED_PIN, HIGH);
delay(DOT_DURATION);
digitalWrite(LED_PIN, LOW);
delay(DOT_DURATION);
}
void blinkDash() {
digitalWrite(LED_PIN, HIGH);
delay(DOT_DURATION * 3);
digitalWrite(LED_PIN, LOW);
delay(DOT_DURATION);
}
void decodeMorse(const char* morseCode) {
for (int i = 0; morseCode[i] != '\0'; i++) {
if (morseCode[i] == '.') {
blinkDot();
} else if (morseCode[i] == '-') {
blinkDash();
} else if (morseCode[i] == ' ') {
delay(DOT_DURATION * 2);
}
}
}
void decodeAndDisplayMorse(char key, String& decodedText) {
switch (key) {
case 'a':
decodedText += ".-";
decodeMorse(".-");
break;
case 'b':
decodedText += "-...";
decodeMorse("-...");
break;
case 'c':
decodedText += "-.-.";
decodeMorse("-.-.");
break;
case 'd':
decodedText += "-..";
decodeMorse("-..");
break;
case 'e':
decodedText += ".";
decodeMorse(".");
break;
case 'f':
decodedText += "..-.";
decodeMorse("..-.");
break;
case 'g':
decodedText += "--.";
decodeMorse("--.");
break;
case 'h':
decodedText += "....";
decodeMorse("....");
break;
case 'i':
decodedText += "..";
decodeMorse("..");
break;
case 'j':
decodedText += ".---";
decodeMorse(".---");
break;
case 'k':
decodedText += "-.-";
decodeMorse("-.-");
break;
case 'l':
decodedText += ".-..";
decodeMorse(".-..");
break;
case 'm':
decodedText += "--";
decodeMorse("--");
break;
case 'n':
decodedText += "-.";
decodeMorse("-.");
break;
case 'o':
decodedText += "---";
decodeMorse("---");
break;
case 'p':
decodedText += ".--.";
decodeMorse(".--.");
break;
case 'q':
decodedText += "--.-";
decodeMorse("--.-");
break;
case 'r':
decodedText += ".-.";
decodeMorse(".-.");
break;
case 's':
decodedText += "...";
decodeMorse("...");
break;
case 't':
decodedText += "-";
decodeMorse("-");
break;
case 'u':
decodedText += "..-";
decodeMorse("..-");
break;
case 'v':
decodedText += "...-";
decodeMorse("...-");
break;
case 'w':
decodedText += ".--";
decodeMorse(".--");
break;
case 'x':
decodedText += "-..-";
decodeMorse("-..-");
break;
case 'y':
decodedText += "-.--";
decodeMorse("-.--");
break;
case 'z':
decodedText += "--..";
decodeMorse("--..");
break;
case ' ':
decodedText += " ";
decodeMorse(" ");
break;
default:
break;
}
}
char decodeMorseToChar(const char* morseCode) {
if (strcmp(morseCode, ".-") == 0) {
return 'a';
} else if (strcmp(morseCode, "-...") == 0) {
return 'b';
} else if (strcmp(morseCode, "-.-.") == 0) {
return 'c';
} else if (strcmp(morseCode, "-..") == 0) {
return 'd';
} else if (strcmp(morseCode, ".") == 0) {
return 'e';
} else if (strcmp(morseCode, "..-.") == 0) {
return 'f';
} else if (strcmp(morseCode, "--.") == 0) {
return 'g';
} else if (strcmp(morseCode, "....") == 0) {
return 'h';
} else if (strcmp(morseCode, "..") == 0) {
return 'i';
} else if (strcmp(morseCode, ".---") == 0) {
return 'j';
} else if (strcmp(morseCode, "-.-") == 0) {
return 'k';
} else if (strcmp(morseCode, ".-..") == 0) {
return 'l';
} else if (strcmp(morseCode, "--") == 0) {
return 'm';
} else if (strcmp(morseCode, "-.") == 0) {
return 'n';
} else if (strcmp(morseCode, "---") == 0) {
return 'o';
} else if (strcmp(morseCode, ".--.") == 0) {
return 'p';
} else if (strcmp(morseCode, "--.-") == 0) {
return 'q';
} else if (strcmp(morseCode, ".-.") == 0) {
return 'r';
} else if (strcmp(morseCode, "...") == 0) {
return 's';
} else if (strcmp(morseCode, "-") == 0) {
return 't';
} else if (strcmp(morseCode, "..-") == 0) {
return 'u';
} else if (strcmp(morseCode, "...-") == 0) {
return 'v';
} else if (strcmp(morseCode, ".--") == 0) {
return 'w';
} else if (strcmp(morseCode, "-..-") == 0) {
return 'x';
} else if (strcmp(morseCode, "-.--") == 0) {
return 'y';
} else if (strcmp(morseCode, "--..") == 0) {
return 'z';
} else {
// Nieznany kod Morse'a
return '\0';
}
}
void checkForKeyPress() {
if(Serial.available() > 0) {
lcd.clear();
lcd.setCursor(0, 0);
}
while (Serial.available() > 0) {
String decodedText = "";
String preparedDecodedText = "";
char keyPressed = Serial.read();
decodeAndDisplayMorse(tolower(keyPressed), decodedText);
const char* decodedTextChar = decodedText.c_str();
char decodedChar = decodeMorseToChar(decodedTextChar);
lcd.print(decodedChar);
Serial.print(decodedChar);
}
}
void setup() {
pinMode(LED_PIN, OUTPUT);
lcd.begin(16, 2);
Serial.begin(9600);
}
void loop() {
checkForKeyPress();
}
// void decodeMorseToText(const char* morseCode, String& decodedText) {
// char buffer[5];
// int bufferIndex = 0;
// for (int i = 0; morseCode[i] != '\0'; i++) {
// if (morseCode[i] == '.' || morseCode[i] == '-') {
// buffer[bufferIndex++] = morseCode[i];
// } else if (morseCode[i] == ' ') {
// buffer[bufferIndex] = '\0';
// char decodedChar = decodeMorseToChar(buffer);
// if (decodedChar != '\0') {
// decodedText += decodedChar;
// }
// bufferIndex = 0;
// }
// }
// if (bufferIndex > 0) {
// buffer[bufferIndex] = '\0';
// char decodedChar = decodeMorseToChar(buffer);
// if (decodedChar != '\0') {
// decodedText += decodedChar;
// }
// }
// }