Skip to content

Instantly share code, notes, and snippets.

@yeurch
Last active January 29, 2016 09:50
Show Gist options
  • Select an option

  • Save yeurch/02faccd6044cab64e230 to your computer and use it in GitHub Desktop.

Select an option

Save yeurch/02faccd6044cab64e230 to your computer and use it in GitHub Desktop.
Simple program for the Arduino Uno to take user input and flash an LED in Morse code.
typedef struct {
char c;
char[6] pulses;
} letter;
boolean bUseOnBoardLED = true;
int ledPin = bUseOnBoardLED ? 13 : 9;
letter* letters;
int ltr_cnt = 0;
int dotLength = 100; // 100ms is our standard dot duration
// Other durations are calculated as multiples of dotLength
// see https://en.wikipedia.org/wiki/Morse_code#Representation.2C_timing_and_speeds
int dashLength = 3 * dotLength;
int pulseGap = 1 * dotLength;
int letterGap = 3 * dotLength;
int wordGap = 7 * dotLength;
String readString, output;
void setup()
{
Serial.begin(9600);
Serial.println("Enter a word to encode.");
pinMode(ledPin, OUTPUT);
letters = (letter*)calloc(26, sizeof(letter));
registerLetter('a', ".-");
registerLetter('b', "-...");
registerLetter('c', "-.-.");
registerLetter('d', "-..");
registerLetter('e', ".");
registerLetter('f', "..-.");
registerLetter('g', "--.");
registerLetter('h', "....");
registerLetter('i', "..");
registerLetter('j', ".---");
registerLetter('k', "-.-");
registerLetter('l', ".-..");
registerLetter('m', "--");
registerLetter('n', "-.");
registerLetter('o', "---");
registerLetter('p', ".--.");
registerLetter('q', "--.-");
registerLetter('r', ".-.");
registerLetter('s', "...");
registerLetter('t', "-");
registerLetter('u', "..-");
registerLetter('v', "...-");
registerLetter('w', ".--");
registerLetter('x', "-..-");
registerLetter('y', "-.--");
registerLetter('z', "--..");
registerLetter(' ', " ");
registerLetter('1', ".----");
registerLetter('2', "..---");
registerLetter('3', "...--");
registerLetter('4', "....-");
registerLetter('5', ".....");
registerLetter('6', "-....");
registerLetter('7', "--...");
registerLetter('8', "---..");
registerLetter('9', "----.");
registerLetter('0', "-----");
}
void registerLetter(char ltr, char* pattern)
{
letters[ltr_cnt].c = ltr;
letters[ltr_cnt].pulses = pattern;
ltr_cnt++;
}
void loop()
{
while (Serial.available())
{
delay(5); // delay to allow buffer to fill
if (Serial.available() > 0)
{
char c = Serial.read(); // gets a byte from the serial buffer
readString += c;
}
}
if (readString.length() > 0)
{
for(int i = 0; i < readString.length(); i++)
{
char cur = readString[i];
for(int j = 0; j < 26; j++)
{
if (letters[j].c == cur)
{
char* pulses = letters[j].pulses;
while(*pulses != 0)
{
if (*pulses == '.')
{
dot();
}
else if (*pulses == '-')
{
dash();
}
else if (*pulses == ' ')
{
space();
}
pulses++;
}
break;
}
}
output += " ";
delay(letterGap - pulseGap); // we need to subtract pulseGap, as we've already output it
}
readString = "";
Serial.println(output);
output = "";
Serial.println("Enter a word to encode.");
}
}
void dot()
{
output += ".";
pulse(dotLength);
}
void dash()
{
output += "-";
pulse(dashLength);
}
void space()
{
delay(wordGap - letterGap); // we need to subtract letterGap, as we've already output it
}
void pulse(int length)
{
digitalWrite(ledPin, HIGH);
delay(length);
digitalWrite(ledPin, LOW);
delay(pulseGap);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment