Morse Deco – mensaje morse

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;
}