Introduction: LED Morse Code Encoder

Morse code is a old method of communication wherein text information is transmitted as a series of on-off tones, lights, or clicks which represent specific characters.

In this project, we will create a program and device, that takes text as an input serially, then relays this message to the Arduino, where the LED will light up to the morse code equivalent of the text message.

Step 1: Tools and Materials

  • Arduino 101 or Arduino Uno
  • Red LED
  • 100Ω resistor
  • Jumper Wires

Step 2: Circuitry

The circuitry is very simple, since all that is needed is to control one LED.

  • Connect the negative pin of the LED (flat edge) to ground.
  • Connect the positive pin of the LED (rounded side) to a 100Ω resistor.
  • Connect the 100Ω resistor in series to pin 9 on the Arduino.

Step 3: Code

The code is rather complex, but certainly is rewarding to see it work!

<p>// declare the pin wehere the LED is plugged in<br>int ledPin = 9;
// assign a pointer for the letters represented in morse code
char* letters[] = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.." };
// assign a pointer for the numbers represented in morsecode
char* numbers[] = {"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."};
// declare how long the delay is in between sequences of dots
int dotDelay = 200;</p><p>void setup() {
  // setup the ledPin to be an output
  pinMode(ledPin, OUTPUT);
  // alows us to use serial to communicate with the Arduino
  Serial.begin(9600);
}</p><p>void loop() {
  char ch;
  
  if (Serial.available()) {// is there anything to be read from USB?
    ch = Serial.read(); // read a single letter through the serial monitor console
      // if the character is between a to z i.e. it's a small letter
      if (ch >= 'a' && ch <= 'z'){
        flashSequence(letters[ch - 'a']);
      // is it a capital letter?
      } else if (ch >= 'A' && ch <= 'Z') {
        flashSequence(letters[ch - 'A']);
      // is it a number?
      } else if (ch >= '0' && ch <= '9') {
        flashSequence(numbers[ch - '0']); 
      // if it's none of the above, make it a space which is 4 times the delay of a dot sequence
      } else if (ch == ' ') {
        delay(dotDelay * 4); }// gap between words
  }
}
  
// determines the sequences to flashed by parsing the seqeunce of letters read by the serial monitor
void flashSequence(char* sequence) {
  int i = 0;
  // while there are still characters keep going through each one
  while (sequence[i] != NULL)  {
    flashDotOrDash(sequence[i]);
    i++; } // increment by one until end of characters
  delay(dotDelay * 3); // gap between letters
} </p><p>// checks if it is a dot or a dash
void flashDotOrDash(char dotOrDash) {
  digitalWrite(ledPin, HIGH);
  if (dotOrDash == '.')  {
    delay(dotDelay); 
  } else { // must be a -
    delay(dotDelay * 3);   // if it's a dot then we need a longer delay gap relative to a dot.
  }
  
  digitalWrite(ledPin, LOW);
  delay(dotDelay); // gap between flashes
  
}</p>

Step 4: Demo

To test the program, text without special characters is inputed to the serial monitor console, in this case, the classic programmers "Hello World", and this is lit up in morse code on the LED, after enter is triggered

Step 5: Riddle Me This

I have decided to encode a message via Morse Code. Comment down below if you figure out what the secret message is!