O código abaixo foi baseado neste código fonte, com algumas modificações:
//Define the LED Pin #define PIN_OUT 13 //Define unit length in ms #define UNIT_LENGTH 250 String incomingWord = ""; int menu = 0; char message[25]; //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 ); Serial.begin(9600); } void loop(){ if (Serial.available() && menu == 0) { Serial.println("-- Decodificador de string para codigo Morse -- "); Serial.println("Pronto para enviar uma mensagem."); menu = 1; } if (Serial.available() && menu == 1) { incomingWord = Serial.readStringUntil('\n'); Serial.println("Eu recebi: "); Serial.println(incomingWord); incomingWord.toCharArray(message,incomingWord.length()); String morseWord = encode( message ); 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 decode2(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; }
O código acima fica em loop esperando até que uma mensagem seja enviada pela porta serial, quando esta mensagem é recebida o programa decodifica cada letra com seu respectivo significado em morse ( a funcção estática no inicio do programa possui todas as relações letra - sinal) em "ponto" e "traço".
Faça upload deste código para a placa Galileo e abra o terminal serial em Tools...Serial Monitor para enviar as mensagens via porta serial.
Acesso ao terminal serial |
Terminal serial acima da IDE arduino |
Nenhum comentário:
Postar um comentário