PROJECT: Morse Code with Sound
Step 1 - Build the Project

If you understand the earlier project that used Morse code and LEDs, you’ll see that this project is similar, but you are replacing the LED blinking lights with a speaker to make sounds instead of blinks.

Step 2 - Upload the Code

/* * Morse Code - LED blinks text messages as Morse code dots and dashes */ // create constant array of the messages you want Morse'd out // Change the "SOS" to any message you like... const char message[ ] = "SOS"; // In ASCII code, 'space' is 32, '0'-'9' is 48-57, and 'A'-'Z' is 65-90 const String morse[] = { ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----", ".-", "-...", "-.-.", "-..", ".","..-.","--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."}; const byte speaker = A5; // speaker const int dotLen = 200; //delay in milliseconds const int dashLen = 3*dotLen; // 3X longer than the dot const int wordLen = 7*dotLen; // space between words. void setup() { pinMode(speaker, OUTPUT); } // blink out one morse code character. void signalMorse(String c) { int i = 0; while (c[i]) { // for each dot or dash in the letter... tone(speaker, 450); // speaker plays a tone of 450 hertz if (c[i] == '.') { delay(dotLen); // if dot, short delay } else if (c[i] == '-') { delay(dashLen); // if dash, longer delay } noTone(speaker); // speaker off delay(dotLen); // off blink. i++; //bring in the next dot or dash from the morse letter!]' }; // We already delayed one dot length in the loop. A Word break = dashLen.. delay(dashLen-dotLen); } void loop() { int i = 0; //counter variable to move through the array char C; //holds each letter as it gets converted to blinks while (message[i]) { // fails when reaches the end of the string ("0") C = toupper(message[i]); if (C == ' ') { delay(wordLen); // space between words } else if (C>47 && C<58) { // 0-9. ASCII 48-57 signalMorse(morse[C-48]); } else if (C>64 && C<91) { // A-Z, ASCII 65-90, 10-34 in morse[] signalMorse(morse[C-55]); } else { delay(wordLen); } i++; // move to the next character in your message } delay(2 * wordLen); } // Try to add a low tone after the message is complete. Where should it go? // (c) 2017 Let's Start Coding. License: www.letsstartcoding.com/bsdlicense
 

Step 3 - Read the Walkthrough

To create Morse code with sound, you first need to convert ASCII code to Morse code, then Morse code to tone commands.

First, we create a list of values called an array. The message array holds the characters you’d like to convert to Morse code. The rest of the code can access these letters with a command like: “Go get the 10th thing in the array” and the code will fetch the 10th item in the array.

Second, we create another array. This array- named morse- holds the dot/dash code for each number and letter of the alphabet.

Next you’ll create your variables for your speaker pin and how long dots, dashes, and spaces should take.

The next chunk of code is a function. It is a group of code that always runs together. These are a little bit like a variable, in that you create it, name it, and give it a value (a series of tasks to do). This function is designed to take in dots and dashes and convert them to tone commands. It checks the Morse character and uses your dotLen and dashLen variables to determine how long to blast the tone from the speaker.

In this code, the loop() section is taking in the text characters from the message array, making them uppercase, and converting the ASCII number to the Morse number. Then, it passes the morse array number to signalMorse and says “Here, take this number and do your job with it." The i++ at the bottom of the loop then moves the loop on to the next character in the array.

The signalMorse number receives the morse array number, which contains dashes and dots. Its job is to unpack the morse array into dashes and dots and then turn on the tone for the duration of those dashes and dots. By the time it is done beeping out the character, signalMorse is ready to receive another morse array number from the loop!