Last active
January 29, 2016 09:50
-
-
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.
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
| 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