-
-
Save show0k/4429ee317fdfc124514b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A tester