-
-
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; | |
} |
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.
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!
Does anyone have the schematics for it?