#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int buttonDotPin = 2;
const int buttonDashPin = 3;
const int buttonSpacePin = 4;
const int buttonEnterPin = 5;
char morseBuffer[6];
String displayText = "";
// Define a dictionary for Morse code mappings
const char* morseMap[36] = {
".-", // A
"-...", // B
"-.-.", // C
"-..", // D
".", // E
"..-.", // F
"--.", // G
"....", // H
"..", // I
".---", // J
"-.-", // K
".-..", // L
"--", // M
"-.", // N
"---", // O
".--.", // P
"--.-", // Q
".-.", // R
"...", // S
"-", // T
"..-", // U
"...-", // V
".--", // W
"-..-", // X
"-.--", // Y
"--..", // Z
"-----", // 0
".----", // 1
"..---", // 2
"...--", // 3
"....-", // 4
".....", // 5
"-....", // 6
"--...", // 7
"---..", // 8
"----." // 9
};
bool isTranslationInProgress = false;
void setup() {
lcd.init();
lcd.backlight();
pinMode(buttonDotPin, INPUT_PULLUP);
pinMode(buttonDashPin, INPUT_PULLUP);
pinMode(buttonSpacePin, INPUT_PULLUP);
pinMode(buttonEnterPin, INPUT_PULLUP);
Serial.begin(9600);
resetMorseBuffer();
}
void loop() {
if (digitalRead(buttonDotPin) == LOW) {
appendMorseBuffer('.');
delay(250);
}
if (digitalRead(buttonDashPin) == LOW) {
appendMorseBuffer('-');
delay(250);
}
if (digitalRead(buttonSpacePin) == LOW) {
appendSpace();
}
if (digitalRead(buttonEnterPin) == LOW) {
if (!isTranslationInProgress) {
char morseChar = translateMorse();
if (morseChar != '?') {
displayText += morseChar;
updateLCD();
}
resetMorseBuffer();
isTranslationInProgress = true;
}
} else {
isTranslationInProgress = false;
}
}
void appendMorseBuffer(char dotOrDash) {
int len = strlen(morseBuffer);
if (len < 5) {
morseBuffer[len] = dotOrDash;
morseBuffer[len + 1] = '\0';
}
}
void appendSpace() {
displayText += ' ';
updateLCD();
delay(1000); // Pause for a moment to separate words
}
char translateMorse() {
for (int i = 0; i < 36; i++) {
if (strcmp(morseBuffer, morseMap[i]) == 0) {
if (i < 26) {
return 'A' + i;
} else {
return '0' + (i - 26);
}
}
}
return '?';
}
void resetMorseBuffer() {
morseBuffer[0] = '\0';
}
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
if (displayText.length() > 16) {
lcd.print(displayText.substring(0, 16));
lcd.setCursor(0, 1);
lcd.print(displayText.substring(16));
} else {
lcd.print(displayText);
}
}