Morse Codec – LED

Codificador texto a morse.
Usando un LED para la señal morse. El led mas sencillo de usar es el incorporado en el Arduino.

Tareas por realizar:

  • usar un tono en un parlante o buzzer/zumbador.
  • usar un laser para transmitir la señal a distancias con linea de vista
  • usar un transmisor inalámbrico para transmitir la señal
  • Probar con un Xbee
  • analizar la secuencia de datos con un modelo de Cadena de Markov
/*  CODificador morse
 *   recibe un mensaje
 *   equivale: estructura de datos char y string
 *   funciones: codificar y decodificar
 */

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

void loop(){
  String mensaje = "SOS ";
  String mensajemorse;
  char simbolo;
  int n;
  mensajemorse = codifica(mensaje);
  // Transmite el mensaje
  n = mensajemorse.length();
  for(int i=0; i<=n; i++){
    simbolo = mensajemorse[i];
    morseLedTx(simbolo);
  }
}

void morseLedTx(char simbolo){
    if (simbolo == '.'){
      digitalWrite( PIN_LED, HIGH );
      delay( DURACION );
      digitalWrite( PIN_LED, LOW );
      delay( DURACION );
    }
    if (simbolo == '-'){
      digitalWrite( PIN_LED, HIGH );
      delay( DURACION*3 );
      digitalWrite( PIN_LED, LOW );
      delay( DURACION );
    }
    if (simbolo == ' ') {
      delay( DURACION );
    }
}

// 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 codifica(String mensaje){
  String mensajemorse = "";
  int i, j, n, m;
  bool encontre;
  n = mensaje.length();
  m = (sizeof equivale / sizeof *equivale);
  for( i = 0; i<n; i++ ){
    encontre = 0;
    j=0;
    while(j<m and encontre==0){
      if(toupper(mensaje[i]) == equivale[j].letra){
        mensajemorse += equivale[j].codigo;
        encontre=1;
       }
      j++;
    }
    mensajemorse += " "; //separador de caracteres
  }
  return mensajemorse;  
}