Web Banner

Project - Morse Code

This is one of my first projects for the Arduino, I wanted to go through the process of creating my own class and thought this might be a fun idea.

Morse code, invented in the 1830s by Samuel Morse and Alfred Vail, revolutionized long-distance communication. It utilizes sequences of dots and dashes to represent letters, numbers, and punctuation. Each character is assigned a unique combination of short and long signals, allowing for transmission via telegraphy and later, radio. Morse code's simplicity and versatility made it indispensable in maritime, military, and aviation communication for decades.

Morse code was highly effective for several reasons:

Simple Encoding: Its encoding system, based on combinations of dots and dashes, is straightforward to understand and implement.

Versatility: Morse code can be transmitted through various mediums, including telegraph wires, radio waves, and light signals, making it adaptable to different communication technologies and environments.

Resilience: Its simplicity and redundancy make Morse code resilient to interference and noise, ensuring reliable communication even under adverse conditions.

International Standard: Morse code became an international standard, facilitating communication across language barriers and enabling interoperability between different telecommunication systems worldwide.

Efficiency: Morse code allows for relatively fast transmission speeds once mastered, enabling rapid communication over long distances without the need for complex equipment or infrastructure.

Overall, Morse code's effectiveness stems from its simplicity, versatility, resilience, and widespread adoption as a global communication standard.

Arduino .INO File

In order to use the class, it's very simple. Create a reference to the MorseCode class, then call begin.

begin(LED Pin, Speaker Pin)

- If you don't want to use the LED or Speaker, just set the value -1

setSpeed(time in ms) (Optional)

- Adjusts the time for a single morse code 'dit'. All of the other timings are relative to this time.

setTone(frequency Hz) (Optional)

- Set's the tone produced by the speaker.

send(char array)

- Starts the transmition of the char array as morse code.

Note: This class is blocking. The code will not proceed until the message has been sent.

Arduino .INO File

#include "MorseCode.h" MorseCode morse = MorseCode(); const int LED_PIN = 5; const int SPEAKER_PIN = 10; void setup() { pinMode(LED_PIN,OUTPUT); pinMode(SPEAKER_PIN,OUTPUT); morse.begin(LED_PIN, SPEAKER_PIN); // Set pin to -1 if you don't want the LED or SPEAKER morse.setSpeed(60); // Set the speed of the 'dit'. All of the other Morse Code timing is calculated from this morse.setTone(440); // If you are using the speaker/buzzer, this will adjust the tone produced char message[] = {"SOS"}; morse.send(message); // Send the message } void loop() { }

Arduino .H File

#ifndef _MORSE_CODE_H #define _MORSE_CODE_H #include class MorseCode { public: MorseCode(void); bool begin (int led, int speaker); void send(char message[]); void setSpeed (int speed); void setTone (int tone); private: void processNumbers (char number); void processPunctuation (char punctuation); void processLetters (char letter); void sendMorseChar(boolean morseValue[], int size); void dit(void); void da(void); void calculateTiming(void); const int NOTE_A4 = 440; const int NOTE_B4 = 494; const int NOTE_C5 = 523; const int NOTE_D5 = 587; const int NOTE_E5 = 659; const int NOTE_F5 = 698; const int NOTE_G5 = 784; //Morse code definitions const boolean _morse_A[2] = {0,1}; const boolean _morse_B[4] = {1,0,0,0}; const boolean _morse_C[4] = {1,0,1,0}; const boolean _morse_D[3] = {1,0,0}; const boolean _morse_E[1] = {0}; const boolean _morse_F[4] = {0,0,1,0}; const boolean _morse_G[3] = {1,1,0}; const boolean _morse_H[4] = {0,0,0,0}; const boolean _morse_I[2] = {0,0}; const boolean _morse_J[4] = {0,1,1,1}; const boolean _morse_K[3] = {1,0,1}; const boolean _morse_L[4] = {0,1,0,0}; const boolean _morse_M[2] = {1,1}; const boolean _morse_N[2] = {1,0}; const boolean _morse_O[3] = {1,1,1}; const boolean _morse_P[4] = {0,1,1,0}; const boolean _morse_Q[4] = {1,1,0,1}; const boolean _morse_R[3] = {0,1,0}; const boolean _morse_S[3] = {0,0,0}; const boolean _morse_T[1] = {1}; const boolean _morse_U[3] = {0,0,1}; const boolean _morse_V[4] = {0,0,0,1}; const boolean _morse_W[3] = {0,1,1}; const boolean _morse_X[4] = {1,0,0,1}; const boolean _morse_Y[4] = {1,0,1,1}; const boolean _morse_Z[4] = {1,1,0,0}; const boolean _morse_1[5] = {0,1,1,1,1}; const boolean _morse_2[5] = {0,0,1,1,1}; const boolean _morse_3[5] = {0,0,0,1,1}; const boolean _morse_4[5] = {0,0,0,0,1}; const boolean _morse_5[5] = {0,0,0,0,0}; const boolean _morse_6[5] = {1,0,0,0,0}; const boolean _morse_7[5] = {1,1,0,0,0}; const boolean _morse_8[5] = {1,1,1,0,0}; const boolean _morse_9[5] = {1,1,1,1,0}; const boolean _morse_0[5] = {1,1,1,1,1}; const boolean _morse_DOT[6] = {0,1,0,1,0,1}; const boolean _morse_COMMA[6] = {1,1,0,0,1,1}; const boolean _morse_QUESTION[6] = {0,0,1,1,0,0}; int _speakerPin = 0; int _ledPin = 0; int _unitTime = 60; int _tone = NOTE_E5; int _dit = 0; int _da = 0; int _letterBreak = 0; int _wordBreak = 0; }; #endif

arduino .CPP File

#include "morsecode.h" MorseCode::MorseCode(){ //Initialize timing calculateTiming(); } void MorseCode::setSpeed(int speed){ _unitTime = speed; calculateTiming(); } void MorseCode::setTone(int tone){ _tone = tone } bool MorseCode::begin(int led, int speaker){ _ledPin = led; _speakerPin = speaker; return true; } void MorseCode::processNumbers (char number) { switch (number) { case '0': sendMorseChar(_morse_0, sizeof(_morse_0)); break case '1': sendMorseChar(_morse_1, sizeof(_morse_1)); break case '2': sendMorseChar(_morse_2, sizeof(_morse_2)); break case '3': sendMorseChar(_morse_3, sizeof(_morse_3)); break case '4': sendMorseChar(_morse_4, sizeof(_morse_4)); break case '5': sendMorseChar(_morse_5, sizeof(_morse_5)); break case '6': sendMorseChar(_morse_6, sizeof(_morse_6)); break case '7': sendMorseChar(_morse_7, sizeof(_morse_7)); break case '8': sendMorseChar(_morse_8, sizeof(_morse_8)); break case '9': sendMorseChar(_morse_9, sizeof(_morse_9)); break } } void MorseCode::processPunctuation (char punctuation) { switch (punctuation) { case '.': sendMorseChar(_morse_DOT, sizeof(_morse_DOT)); break case ',': sendMorseChar(_morse_COMMA, sizeof(_morse_COMMA)); break case '?': sendMorseChar(_morse_QUESTION, sizeof(_morse_QUESTION)); break } } void MorseCode::processLetters (char letter) { switch (letter) { case 'A': sendMorseChar(_morse_A, sizeof(_morse_A)); break case 'B': sendMorseChar(_morse_B, sizeof(_morse_B)); break case 'C': sendMorseChar(_morse_C, sizeof(_morse_C)); break case 'D': sendMorseChar(_morse_D, sizeof(_morse_D)); break case 'E': sendMorseChar(_morse_E, sizeof(_morse_E)); break case 'F': sendMorseChar(_morse_F, sizeof(_morse_F)); break case 'G': sendMorseChar(_morse_G, sizeof(_morse_G)); break case 'H': sendMorseChar(_morse_H, sizeof(_morse_H)); break case 'I': sendMorseChar(_morse_I, sizeof(_morse_I)); break case 'J': sendMorseChar(_morse_J, sizeof(_morse_J)); break case 'K': sendMorseChar(_morse_K, sizeof(_morse_K)); break case 'L': sendMorseChar(_morse_L, sizeof(_morse_L)); break case 'M': sendMorseChar(_morse_M, sizeof(_morse_M)); break case 'N': sendMorseChar(_morse_N, sizeof(_morse_N)); break case 'O': sendMorseChar(_morse_O, sizeof(_morse_O)); break case 'P': sendMorseChar(_morse_P, sizeof(_morse_P)); break case 'Q': sendMorseChar(_morse_Q, sizeof(_morse_Q)); break case 'R': sendMorseChar(_morse_R, sizeof(_morse_R)); break case 'S': sendMorseChar(_morse_S, sizeof(_morse_S)); break case 'T': sendMorseChar(_morse_T, sizeof(_morse_T)); break case 'U': sendMorseChar(_morse_U, sizeof(_morse_U)); break case 'V': sendMorseChar(_morse_V, sizeof(_morse_V)); break case 'W': sendMorseChar(_morse_W, sizeof(_morse_W)); break case 'X': sendMorseChar(_morse_X, sizeof(_morse_X)); break case 'Y': sendMorseChar(_morse_Y, sizeof(_morse_Y)); break case 'Z': sendMorseChar(_morse_Z, sizeof(_morse_Z)); break } } void MorseCode::send(char message[]) { int length = strlen(message); Serial.println("Secret message"); for (byte i = 0; i < length; i++) { if (message[i] == ' ') { Serial.println(); delay (_wordBreak); } else { if (message[i] >= 'a' && message[i] <= 'z') { processLetters(message[i] - 32); } else if (message[i] >= 'A' && message[i] <= 'Z') { processLetters(message[i]); } else if (message[i] >= 48 && message[i] <= 57) { processNumbers(message[i]); } else if (message[i] == ',' ||message[i] == '.'||message[i] == '?') { processPunctuation(message[i]); } else { Serial.println("ERROR: Unknown Letter...."); } Serial.print(" , "); } } Serial.println(); } void MorseCode::sendMorseChar(boolean morseValue[], int size) { for (int x = 0; xif (morseValue[x] == 0) { Serial.print("."); dit(); } else { Serial.print("."); da(); } } } void MorseCode::dit () { if (_ledPin != -1){ digitalWrite(_ledPin, HIGH); } if (_speakerPin != -1){ tone(_speakerPin, _tone, _dit); } delay (_dit); if (_ledPin != -1){ digitalWrite(_ledPin, LOW); } delay (_letterBreak); } void MorseCode::da() { if (_ledPin != -1){ digitalWrite(_ledPin, HIGH); } if (_speakerPin != -1){ tone(_speakerPin, _tone, _da); } delay (_da); if (_ledPin != -1){ digitalWrite(_ledPin, LOW); } delay (_letterBreak); } void MorseCode::calculateTiming (){ _dit = _unitTime; _da = 3 * _unitTime; _letterBreak = 3 * _unitTime; _wordBreak = 7 * _unitTime; }

Download

Source Code

A zip file containing the complete Arduino morse code project

I2C Part 1