decodificador de un mensaje en morse, al puerto serial
Puede visualizar el mensaje en la ventana del monitor Serial o algun programa que capture los datos.
/* DECOdificador morse
* recibe un mensajemorse
* equivale: estructura de datos char y string
* funciones: codifica y decodifica
*/
// PIN para el LED, led integrado = 13
#define PIN_LED 13
//Duración de un símbolo en ms
#define DURACION 250
void setup(){
pinMode( PIN_LED, OUTPUT );
digitalWrite( PIN_LED, LOW );
Serial.begin(9600);
}
void loop(){
String mensajemorse = ". ... .--. --- .-.. .. -- .--. ..- .-.. ... .- -. -.. --- .-.. .- ... --- -.-. .. . -.. .- -.. -.. . .-.. -.-. --- -. --- -.-. .. -- .. . -. - --- ";
String mensaje;
mensaje = decodifica(mensajemorse);
Serial.println(mensaje);
Serial.println(mensajemorse);
delay(1500);
}
// Equivalente letra a código Morse. Estructura de datos
static const struct {const char letra, *codigo;} equivale[] =
{
{ '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', "--.." },
{ ' ', " " }, //espacio entre palabras
{ '1', ".----" }, { '2', "..---" }, { '3', "...--" },
{ '4', "....-" }, { '5', "....." }, { '6', "-...." },
{ '7', "--..." }, { '8', "---.." }, { '9', "----." },
{ '0', "-----" },
{ '.', ".–.–.–" }, { ',', "--..--" }, { '?', "..--.." },
{ '!', "-.-.--" }, { ':', "---..." }, { ';', "-.-.-." },
{ '(', "-.--." }, { ')', "-.--.-" }, { '"', ".-..-." },
{ '@', ".--.-." }, { '&', ".-..." },
};
String decodifica(String mensajemorse){
String simbolo, mensaje = "";
bool encontre = 0;
int j ,n, m, desde, proximo,cuenta;
n = mensajemorse.length();
m = sizeof equivale / sizeof *equivale;
desde = 0;
proximo = mensajemorse.indexOf(' ', desde);
while(desde<n){
//Busca equivalente
encontre = 0;
simbolo = mensajemorse.substring(desde, proximo);
j = 0;
while(j < m && encontre==0){
if(simbolo == equivale[j].codigo){
mensaje += equivale[j].letra;
encontre = 1;
}
j++;
}
desde = proximo+1;
// Espacios entre palabras
proximo = mensajemorse.indexOf(' ', desde);
while(mensajemorse[desde] == ' ' && mensajemorse[proximo+1]== ' '){
proximo ++;
}
}
return mensaje;
}