// Arduino "Hello World" in Morse Code // Author: Ryan Greenberg // Date: September 3, 2009 // Timing is done using this schema // International Morse code is composed of five elements: // short mark, dot or 'dit' (.) - one unit long // longer mark, dash or 'dah' (-) - three units long // intra-character gap (between the dots and dashes within a character) - one unit long // short gap (between letters) - three units long // medium gap (between words) - seven units long[7] // // http://en.wikipedia.org/wiki/Morse_code int ledPin = 13; // LED connected to digital pin 13 int unit = 300; // The base unit delay between each element. Equals one dot. // The message to transmit repeatedly char msg[12] = "HELLO WORLD"; //char msg[4] = "SOS"; // The characters in morse code // A . - B - . . . C - . - . // D - . . E . F . . - . // G - - . H . . . . I . . // J . - - - K - . - L . - . . // M - - N - . O - - - // P . - - . Q - - . - R . - . // S . . . T - U . . - // V . . . - W . - - X - . . - // Y - . - - Z - - . . char* morse[]={".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."}; int sizes[]= {2, 4, 4, 3, 1, 4, 3, 4, 2, 4, 3, 4, 2, 2, 3, 4, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4}; void setup() { // initialize the digital pin as an output: pinMode(ledPin, OUTPUT); } // the loop() method runs over and over again, // as long as the Arduino has power void loop() { int i for (i = 0; i < sizeof(msg) - 1; i++) { // sizeof - 1 for null character // Flash the letter if it is not space if (msg[i] >= 65 && msg[i] <= 90) { flashMorse(msg[i]); letterGap(); } else { wordGap(); } } delay(5000); // Long delay before repeating message } void flashMorse(char c) { // A = 65, which corresponds to morse[0] // Z = 90, which corresponds to morse[25] int j; for (j = 0; j < sizes[c - 65]; j++) { switch (morse[c-65][j]) { case 46: // Dot dot(); break; case 45: // Dash dash(); break; default: // Unknown error(); } // Delay display between dashes and dots dashDotGap(); } } void dot() { digitalWrite(ledPin, HIGH); // set the LED on delay(unit); digitalWrite(ledPin, LOW); // set the LED off } void dash() { digitalWrite(ledPin, HIGH); // set the LED on delay(unit * 3); digitalWrite(ledPin, LOW); // set the LED off } void dashDotGap() { delay(unit); } void letterGap() { delay(unit * 3); } void wordGap() { delay(unit * 7); } void error() { int k; for (k = 0; k < 5; k++) { digitalWrite(ledPin, HIGH); // set the LED on delay(250); digitalWrite(ledPin, LOW); // set the LED off delay(250); } }