-
-
Save madc/4474559 to your computer and use it in GitHub Desktop.
| Copyright (c) 2015 Matthias Esterl | |
| Permission is hereby granted, free of charge, to any person obtaining a copy | |
| of this software and associated documentation files (the "Software"), to deal | |
| in the Software without restriction, including without limitation the rights | |
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| copies of the Software, and to permit persons to whom the Software is | |
| furnished to do so, subject to the following conditions: | |
| The above copyright notice and this permission notice shall be included in | |
| all copies or substantial portions of the Software. | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
| THE SOFTWARE. |
| //Define the LED Pin | |
| #define PIN_OUT 9 | |
| //Define unit length in ms | |
| #define UNIT_LENGTH 250 | |
| //Build a struct with the morse code mapping | |
| static const struct {const char letter, *code;} MorseMap[] = | |
| { | |
| { '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', "--.." }, | |
| { ' ', " " }, //Gap between word, seven units | |
| { '1', ".----" }, | |
| { '2', "..---" }, | |
| { '3', "...--" }, | |
| { '4', "....-" }, | |
| { '5', "....." }, | |
| { '6', "-...." }, | |
| { '7', "--..." }, | |
| { '8', "---.." }, | |
| { '9', "----." }, | |
| { '0', "-----" }, | |
| { '.', "·–·–·–" }, | |
| { ',', "--..--" }, | |
| { '?', "..--.." }, | |
| { '!', "-.-.--" }, | |
| { ':', "---..." }, | |
| { ';', "-.-.-." }, | |
| { '(', "-.--." }, | |
| { ')', "-.--.-" }, | |
| { '"', ".-..-." }, | |
| { '@', ".--.-." }, | |
| { '&', ".-..." }, | |
| }; | |
| void setup() | |
| { | |
| pinMode( PIN_OUT, OUTPUT ); | |
| digitalWrite( PIN_OUT, LOW ); | |
| } | |
| void loop() | |
| { | |
| String morseWord = encode( "SOS " ); | |
| for(int i=0; i<=morseWord.length(); i++) | |
| { | |
| switch( morseWord[i] ) | |
| { | |
| case '.': //dit | |
| digitalWrite( PIN_OUT, HIGH ); | |
| delay( UNIT_LENGTH ); | |
| digitalWrite( PIN_OUT, LOW ); | |
| delay( UNIT_LENGTH ); | |
| break; | |
| case '-': //dah | |
| digitalWrite( PIN_OUT, HIGH ); | |
| delay( UNIT_LENGTH*3 ); | |
| digitalWrite( PIN_OUT, LOW ); | |
| delay( UNIT_LENGTH ); | |
| break; | |
| case ' ': //gap | |
| delay( UNIT_LENGTH ); | |
| } | |
| } | |
| } | |
| String encode(const char *string) | |
| { | |
| size_t i, j; | |
| String morseWord = ""; | |
| for( i = 0; string[i]; ++i ) | |
| { | |
| for( j = 0; j < sizeof MorseMap / sizeof *MorseMap; ++j ) | |
| { | |
| if( toupper(string[i]) == MorseMap[j].letter ) | |
| { | |
| morseWord += MorseMap[j].code; | |
| break; | |
| } | |
| } | |
| morseWord += " "; //Add tailing space to seperate the chars | |
| } | |
| return morseWord; | |
| } | |
| String decode(String morse) | |
| { | |
| String msg = ""; | |
| int lastPos = 0; | |
| int pos = morse.indexOf(' '); | |
| while( lastPos <= morse.lastIndexOf(' ') ) | |
| { | |
| for( int i = 0; i < sizeof MorseMap / sizeof *MorseMap; ++i ) | |
| { | |
| if( morse.substring(lastPos, pos) == MorseMap[i].code ) | |
| { | |
| msg += MorseMap[i].letter; | |
| } | |
| } | |
| lastPos = pos+1; | |
| pos = morse.indexOf(' ', lastPos); | |
| // Handle white-spaces between words (7 spaces) | |
| while( morse[lastPos] == ' ' && morse[pos+1] == ' ' ) | |
| { | |
| pos ++; | |
| } | |
| } | |
| return msg; | |
| } |
I fixed the mentioned bugs, including (in my tests) the out-of-memory bug I think @tonytozoo was having.
https://gist.github.com/Erhannis/17de678c9b6ac4d75ffa585156f513b8
I also added another space between chars, for spec compliance. (Should be three dots worth of space between chars, rather than two.)
will this code auto detect the users speed - im doing a project with kids and we have som trouble with the fact that kids morse with different speed -
Super Newbie question:
I'm trying to get the morse code to work with an LED strip instead of the tiny LED on the Arduino. I want all of the LEDs on the strip to blink the morsecode simultaneously. But so far I can't get it to work.
I've added:
**#include <FastLED.h>
#define NUM_LEDS 300
#define DATA_PIN 12
CRGB leds[NUM_LEDS];**
and replaced pinMode(2, OUTPUT); with FastLED.addLeds<WS2811, DATA_PIN>(leds,NUM_LEDS);
But this does nothing. Any suggestions would be greatly appreciated!
Most everything here appears to be compliant with the spec described on Wikipedia. However, I believe to get "The letters of a word are separated by a space equal to three dots (one dash)", it should be
morseWord += " "; //Add tailing space to seperate the chars, with two spaces.