// LED connected to digital pin <>
const int LED_PIN = 13;
const int morse_base_time_delay = 250; // Time is in ns
// Function to output a dot
void dot() {
Serial.println("dot");
digitalWrite(LED_PIN, HIGH);
// Duration of a dot is 1 time unit
delay(morse_base_time_delay);
digitalWrite(LED_PIN, LOW);
}
// Function to output a dash
void dash() {
Serial.println("dash");
// Duration of a dash is 3 time units
digitalWrite(LED_PIN, HIGH);
delay(morse_base_time_delay * 3);
digitalWrite(LED_PIN, LOW);
}
// Function to represent the end of a letter
void endOfLetter() {
// Time between letters is 3 time units
delay(morse_base_time_delay * 3);
Serial.print("End of letter delay: 3\r\n");
}
void letterDelay() {
// Time between parts of the same letter
delay(morse_base_time_delay);
Serial.print("Partial letter delay: 1\r\n");
}
void charToMorse(char c) {
switch (tolower(c)) {
case 'a': {
dot();
letterDelay();
dash();
endOfLetter();
} break;
case 'b': {
dash();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dot();
endOfLetter();
} break;
case 'c': {
dash();
letterDelay();
dot();
letterDelay();
dash();
letterDelay();
dot();
endOfLetter();
} break;
case 'd': {
dash();
letterDelay();
dot();
letterDelay();
dot();
endOfLetter();
} break;
case 'e': {
dot();
endOfLetter();
} break;
case 'f': {
dot();
letterDelay();
dot();
letterDelay();
dash();
letterDelay();
dot();
endOfLetter();
} break;
case 'g': {
dash();
letterDelay();
dash();
letterDelay();
dot();
endOfLetter();
} break;
case 'h': {
dot();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dot();
endOfLetter();
} break;
case 'i': {
dot();
letterDelay();
dot();
endOfLetter();
} break;
case 'j': {
dot();
letterDelay();
dash();
letterDelay();
dash();
letterDelay();
dash();
endOfLetter();
} break;
case 'k': {
dash();
letterDelay();
dot();
letterDelay();
dash();
endOfLetter();
} break;
case 'l': {
dot();
letterDelay();
dash();
letterDelay();
dot();
letterDelay();
dot();
endOfLetter();
} break;
case 'm': {
dash();
letterDelay();
dash();
endOfLetter();
} break;
case 'n': {
dash();
letterDelay();
dot();
endOfLetter();
} break;
case 'o': {
dash();
letterDelay();
dash();
letterDelay();
dash();
endOfLetter();
} break;
case 'p': {
dot();
letterDelay();
dash();
letterDelay();
dash();
letterDelay();
dot();
endOfLetter();
} break;
case 'q': {
dash();
letterDelay();
dash();
letterDelay();
dot();
letterDelay();
dash();
endOfLetter();
} break;
case 'r': {
dot();
letterDelay();
dash();
letterDelay();
dot();
endOfLetter();
} break;
case 's': {
dot();
letterDelay();
dot();
letterDelay();
dot();
endOfLetter();
} break;
case 't': {
dash();
endOfLetter();
} break;
case 'u': {
dot();
letterDelay();
dot();
letterDelay();
dash();
endOfLetter();
} break;
case 'v': {
dot();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dash();
endOfLetter();
} break;
case 'w': {
dot();
letterDelay();
dash();
letterDelay();
dash();
endOfLetter();
} break;
case 'x': {
dash();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dash();
endOfLetter();
} break;
case 'y': {
dash();
letterDelay();
dot();
letterDelay();
dash();
letterDelay();
dash();
endOfLetter();
} break;
case 'z': {
dash();
letterDelay();
dash();
letterDelay();
dot();
letterDelay();
dot();
endOfLetter();
} break;
case '1': {
dot();
letterDelay();
dash();
letterDelay();
dash();
letterDelay();
dash();
letterDelay();
dash();
endOfLetter();
} break;
case '2': {
dot();
letterDelay();
dot();
letterDelay();
dash();
letterDelay();
dash();
letterDelay();
dash();
endOfLetter();
} break;
case '3': {
dot();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dash();
letterDelay();
dash();
endOfLetter();
} break;
case '4': {
dot();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dash();
endOfLetter();
} break;
case '5': {
dot();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dot();
endOfLetter();
} break;
case '6': {
dash();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dot();
endOfLetter();
} break;
case '7': {
dash();
letterDelay();
dash();
letterDelay();
dot();
letterDelay();
dot();
letterDelay();
dot();
endOfLetter();
} break;
case '8': {
dash();
letterDelay();
dash();
letterDelay();
dash();
letterDelay();
dot();
letterDelay();
dot();
endOfLetter();
} break;
case '9': {
dash();
letterDelay();
dash();
letterDelay();
dash();
letterDelay();
dash();
letterDelay();
dot();
endOfLetter();
} break;
case '0': {
dash();
letterDelay();
dash();
letterDelay();
dash();
letterDelay();
dash();
letterDelay();
dash();
endOfLetter();
} break;
case ' ': {
// Space between words, 7 time units
// Setting to 4 units because each letter automatically appends 3 unit stall
delay(morse_base_time_delay * 4);
Serial.print("Word delay: 4\r\n");
} break;
default: {
// For unrecognized characters, do nothing
} break;
}
}
void setup() {
pinMode(LED_PIN, OUTPUT); // Initialize the digital pin as an output
Serial.begin(9600); // Set up serial communication at 9600 bps
}
void loop() {
Serial.println("Please enter something:");
while (!Serial.available());
String input = Serial.readStringUntil('\n'); // Read the input string
Serial.print("user entered: ");
Serial.print(input);
Serial.println("");
// Convert and display each character
for (unsigned int i = 0; i < input.length(); ++i) {
charToMorse(input[i]);
}
}