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

1 : #include "MorseCode.h" 2 : 3 : MorseCode morse = MorseCode(); 4 : const int LED_PIN = 5; 5 : const int SPEAKER_PIN = 10; 6 : 7 : void setup() { 8 : 9 : pinMode(LED_PIN,OUTPUT); 10 : pinMode(SPEAKER_PIN,OUTPUT); 11 : 12 : morse.begin(LED_PIN, SPEAKER_PIN); // Set pin to -1 if you don't want the LED or SPEAKER 13 : morse.setSpeed(60); // Set the speed of the 'dit'. All of the other Morse Code timing is calculated from this 14 : morse.setTone(440); // If you are using the speaker/buzzer, this will adjust the tone produced 15 : 16 : char message[] = {"SOS"}; 17 : morse.send(message); // Send the message 18 : } 19 : 20 : void loop() { 21 : } 22 : 23 :

Arduino .H File

1 : #ifndef _MORSE_CODE_H 2 : #define _MORSE_CODE_H 3 : 4 : #include 5 : 6 : class MorseCode { 7 : 8 : public: 9 : 10 : MorseCode(void); 11 : 12 : bool begin (int led, int speaker); 13 : 14 : void send(char message[]); 15 : 16 : void setSpeed (int speed); 17 : 18 : void setTone (int tone); 19 : 20 : private: 21 : void processNumbers (char number); 22 : void processPunctuation (char punctuation); 23 : void processLetters (char letter); 24 : void sendMorseChar(boolean morseValue[], int size); 25 : void dit(void); 26 : void da(void); 27 : void calculateTiming(void); 28 : 29 : const int NOTE_A4 = 440; 30 : const int NOTE_B4 = 494; 31 : const int NOTE_C5 = 523; 32 : const int NOTE_D5 = 587; 33 : const int NOTE_E5 = 659; 34 : const int NOTE_F5 = 698; 35 : const int NOTE_G5 = 784; 36 : 37 : //Morse code definitions 38 : const boolean _morse_A[2] = {0,1}; 39 : const boolean _morse_B[4] = {1,0,0,0}; 40 : const boolean _morse_C[4] = {1,0,1,0}; 41 : const boolean _morse_D[3] = {1,0,0}; 42 : const boolean _morse_E[1] = {0}; 43 : const boolean _morse_F[4] = {0,0,1,0}; 44 : const boolean _morse_G[3] = {1,1,0}; 45 : const boolean _morse_H[4] = {0,0,0,0}; 46 : const boolean _morse_I[2] = {0,0}; 47 : const boolean _morse_J[4] = {0,1,1,1}; 48 : const boolean _morse_K[3] = {1,0,1}; 49 : const boolean _morse_L[4] = {0,1,0,0}; 50 : const boolean _morse_M[2] = {1,1}; 51 : const boolean _morse_N[2] = {1,0}; 52 : const boolean _morse_O[3] = {1,1,1}; 53 : const boolean _morse_P[4] = {0,1,1,0}; 54 : const boolean _morse_Q[4] = {1,1,0,1}; 55 : const boolean _morse_R[3] = {0,1,0}; 56 : const boolean _morse_S[3] = {0,0,0}; 57 : const boolean _morse_T[1] = {1}; 58 : const boolean _morse_U[3] = {0,0,1}; 59 : const boolean _morse_V[4] = {0,0,0,1}; 60 : const boolean _morse_W[3] = {0,1,1}; 61 : const boolean _morse_X[4] = {1,0,0,1}; 62 : const boolean _morse_Y[4] = {1,0,1,1}; 63 : const boolean _morse_Z[4] = {1,1,0,0}; 64 : 65 : const boolean _morse_1[5] = {0,1,1,1,1}; 66 : const boolean _morse_2[5] = {0,0,1,1,1}; 67 : const boolean _morse_3[5] = {0,0,0,1,1}; 68 : const boolean _morse_4[5] = {0,0,0,0,1}; 69 : const boolean _morse_5[5] = {0,0,0,0,0}; 70 : const boolean _morse_6[5] = {1,0,0,0,0}; 71 : const boolean _morse_7[5] = {1,1,0,0,0}; 72 : const boolean _morse_8[5] = {1,1,1,0,0}; 73 : const boolean _morse_9[5] = {1,1,1,1,0}; 74 : const boolean _morse_0[5] = {1,1,1,1,1}; 75 : 76 : const boolean _morse_DOT[6] = {0,1,0,1,0,1}; 77 : const boolean _morse_COMMA[6] = {1,1,0,0,1,1}; 78 : const boolean _morse_QUESTION[6] = {0,0,1,1,0,0}; 79 : 80 : int _speakerPin = 0; 81 : int _ledPin = 0; 82 : int _unitTime = 60; 83 : 84 : int _tone = NOTE_E5; 85 : 86 : int _dit = 0; 87 : int _da = 0; 88 : int _letterBreak = 0; 89 : int _wordBreak = 0; 90 : 91 : }; 92 : 93 : #endif

arduino .CPP File

1 : #include "morsecode.h" 2 : 3 : MorseCode::MorseCode(){ 4 : //Initialize timing 5 : calculateTiming(); 6 : } 7 : 8 : void MorseCode::setSpeed(int speed){ 9 : _unitTime = speed; 10 : calculateTiming(); 11 : } 12 : 13 : void MorseCode::setTone(int tone){ 14 : _tone = tone 15 : } 16 : 17 : bool MorseCode::begin(int led, int speaker){ 18 : _ledPin = led; 19 : _speakerPin = speaker; 20 : 21 : return true; 22 : } 23 : 24 : void MorseCode::processNumbers (char number) 25 : { 26 : switch (number) 27 : { 28 : case '0': 29 : sendMorseChar(_morse_0, sizeof(_morse_0)); 30 : break 31 : 32 : case '1': 33 : sendMorseChar(_morse_1, sizeof(_morse_1)); 34 : break 35 : 36 : case '2': 37 : sendMorseChar(_morse_2, sizeof(_morse_2)); 38 : break 39 : 40 : case '3': 41 : sendMorseChar(_morse_3, sizeof(_morse_3)); 42 : break 43 : 44 : case '4': 45 : sendMorseChar(_morse_4, sizeof(_morse_4)); 46 : break 47 : 48 : case '5': 49 : sendMorseChar(_morse_5, sizeof(_morse_5)); 50 : break 51 : 52 : case '6': 53 : sendMorseChar(_morse_6, sizeof(_morse_6)); 54 : break 55 : 56 : case '7': 57 : sendMorseChar(_morse_7, sizeof(_morse_7)); 58 : break 59 : 60 : case '8': 61 : sendMorseChar(_morse_8, sizeof(_morse_8)); 62 : break 63 : 64 : case '9': 65 : sendMorseChar(_morse_9, sizeof(_morse_9)); 66 : break 67 : } 68 : } 69 : 70 : void MorseCode::processPunctuation (char punctuation) 71 : { 72 : switch (punctuation) 73 : { 74 : case '.': 75 : sendMorseChar(_morse_DOT, sizeof(_morse_DOT)); 76 : break 77 : 78 : case ',': 79 : sendMorseChar(_morse_COMMA, sizeof(_morse_COMMA)); 80 : break 81 : 82 : case '?': 83 : sendMorseChar(_morse_QUESTION, sizeof(_morse_QUESTION)); 84 : break 85 : } 86 : 87 : } 88 : 89 : void MorseCode::processLetters (char letter) 90 : { 91 : switch (letter) 92 : { 93 : case 'A': 94 : sendMorseChar(_morse_A, sizeof(_morse_A)); 95 : break 96 : 97 : case 'B': 98 : sendMorseChar(_morse_B, sizeof(_morse_B)); 99 : break 100 : 101 : case 'C': 102 : sendMorseChar(_morse_C, sizeof(_morse_C)); 103 : break 104 : 105 : case 'D': 106 : sendMorseChar(_morse_D, sizeof(_morse_D)); 107 : break 108 : 109 : case 'E': 110 : sendMorseChar(_morse_E, sizeof(_morse_E)); 111 : break 112 : 113 : case 'F': 114 : sendMorseChar(_morse_F, sizeof(_morse_F)); 115 : break 116 : 117 : case 'G': 118 : sendMorseChar(_morse_G, sizeof(_morse_G)); 119 : break 120 : 121 : case 'H': 122 : sendMorseChar(_morse_H, sizeof(_morse_H)); 123 : break 124 : 125 : case 'I': 126 : sendMorseChar(_morse_I, sizeof(_morse_I)); 127 : break 128 : 129 : case 'J': 130 : sendMorseChar(_morse_J, sizeof(_morse_J)); 131 : break 132 : 133 : case 'K': 134 : sendMorseChar(_morse_K, sizeof(_morse_K)); 135 : break 136 : 137 : case 'L': 138 : sendMorseChar(_morse_L, sizeof(_morse_L)); 139 : break 140 : 141 : case 'M': 142 : sendMorseChar(_morse_M, sizeof(_morse_M)); 143 : break 144 : 145 : case 'N': 146 : sendMorseChar(_morse_N, sizeof(_morse_N)); 147 : break 148 : 149 : case 'O': 150 : sendMorseChar(_morse_O, sizeof(_morse_O)); 151 : break 152 : 153 : case 'P': 154 : sendMorseChar(_morse_P, sizeof(_morse_P)); 155 : break 156 : 157 : case 'Q': 158 : sendMorseChar(_morse_Q, sizeof(_morse_Q)); 159 : break 160 : 161 : case 'R': 162 : sendMorseChar(_morse_R, sizeof(_morse_R)); 163 : break 164 : 165 : case 'S': 166 : sendMorseChar(_morse_S, sizeof(_morse_S)); 167 : break 168 : 169 : case 'T': 170 : sendMorseChar(_morse_T, sizeof(_morse_T)); 171 : break 172 : 173 : case 'U': 174 : sendMorseChar(_morse_U, sizeof(_morse_U)); 175 : break 176 : 177 : case 'V': 178 : sendMorseChar(_morse_V, sizeof(_morse_V)); 179 : break 180 : 181 : case 'W': 182 : sendMorseChar(_morse_W, sizeof(_morse_W)); 183 : break 184 : 185 : case 'X': 186 : sendMorseChar(_morse_X, sizeof(_morse_X)); 187 : break 188 : 189 : case 'Y': 190 : sendMorseChar(_morse_Y, sizeof(_morse_Y)); 191 : break 192 : 193 : case 'Z': 194 : sendMorseChar(_morse_Z, sizeof(_morse_Z)); 195 : break 196 : } 197 : 198 : } 199 : 200 : void MorseCode::send(char message[]) 201 : { 202 : 203 : int length = strlen(message); 204 : Serial.println("Secret message"); 205 : 206 : for (byte i = 0; i < length; i++) 207 : { 208 : 209 : if (message[i] == ' ') 210 : { 211 : Serial.println(); 212 : delay (_wordBreak); 213 : } 214 : else 215 : { 216 : if (message[i] >= 'a' && message[i] <= 'z') 217 : { 218 : processLetters(message[i] - 32); 219 : } 220 : else if (message[i] >= 'A' && message[i] <= 'Z') 221 : { 222 : processLetters(message[i]); 223 : } 224 : else if (message[i] >= 48 && message[i] <= 57) 225 : { 226 : processNumbers(message[i]); 227 : } 228 : else if (message[i] == ',' ||message[i] == '.'||message[i] == '?') 229 : { 230 : processPunctuation(message[i]); 231 : } 232 : else 233 : { 234 : Serial.println("ERROR: Unknown Letter...."); 235 : } 236 : 237 : Serial.print(" , "); 238 : } 239 : } 240 : Serial.println(); 241 : } 242 : 243 : void MorseCode::sendMorseChar(boolean morseValue[], int size) 244 : { 245 : for (int x = 0; x246 : { 247 : if (morseValue[x] == 0) 248 : { 249 : Serial.print("."); 250 : dit(); 251 : } 252 : else 253 : { 254 : Serial.print("."); 255 : da(); 256 : } 257 : } 258 : } 259 : 260 : void MorseCode::dit () 261 : { 262 : 263 : if (_ledPin != -1){ 264 : digitalWrite(_ledPin, HIGH); 265 : } 266 : 267 : if (_speakerPin != -1){ 268 : tone(_speakerPin, _tone, _dit); 269 : } 270 : 271 : delay (_dit); 272 : 273 : if (_ledPin != -1){ 274 : digitalWrite(_ledPin, LOW); 275 : } 276 : 277 : delay (_letterBreak); 278 : } 279 : 280 : void MorseCode::da() 281 : { 282 : if (_ledPin != -1){ 283 : digitalWrite(_ledPin, HIGH); 284 : } 285 : 286 : if (_speakerPin != -1){ 287 : tone(_speakerPin, _tone, _da); 288 : } 289 : 290 : delay (_da); 291 : 292 : if (_ledPin != -1){ 293 : digitalWrite(_ledPin, LOW); 294 : } 295 : 296 : delay (_letterBreak); 297 : } 298 : 299 : void MorseCode::calculateTiming (){ 300 : _dit = _unitTime; 301 : _da = 3 * _unitTime; 302 : _letterBreak = 3 * _unitTime; 303 : _wordBreak = 7 * _unitTime; 304 : } 305 : 306 :

Download

Source Code

A zip file containing the complete Arduino morse code project

I2C Part 1