lunes, 6 de marzo de 2017



Los leds indican si se trata de raya, punto, espacio o final de frase, dependiendo de cual encienda.
El texto se escribe en el monitor serie y este es enviado a la placa Arduino. Con un buzzer es posible escuchar también la traducción a clave morse.

Partes
4 resistencias 220 ohms
4 leds
6 jumpers
1 buzzer

Fritzing


Código

//lista de caracteres
char caracteres[] = {'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','0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', ',', '?', '"', '!'};

// caracteres convertidos a morse
String codigo[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "--.--", "---", ".--.", "--.-", ".-.", "...", "-", "..--", "...-", ".--", "-..-", "-.--", "--..", "-----", ".----", "..--", "...--", "....-", ".....", "-....", "--...", "---..", "---..", "----.", ".-.-.-", "--..--", "..--..", ".-..-.", "-.-.--"};

//variable que contiene la frase error por si la palabra enviada esta mal
//variable que contendrá la cadena de caracteres traducida a morse
//variable que contendrá la palabra digitada por el usuario
String error = "../../..", traduccion = "", palabra = "";
//representa el espacio vacío entre palabras
char vacio = '/';

//pin del buzzer
#define buzzer 3
//pin del led que se enciende cunado se emite el sonido de raya
#define ledRaya 7
//pin del led que se enciende cunado se emite el sonido de punto
#define ledPunto 8
//pin del led que se enciende cunado hay un espacio entre palabras
#define ledEspacio 9
//pin del led que se enciende cunado se termina el mensaje
#define ledFin 10

//representa el tiempo de duración del punto
int tiempoPunto = 70;
//representa el tiempo de duración de la raya
int tiempoRaya = tiempoPunto * 3;
//representa el tiempo que hay entre letra y letra
//representa el tiempo que hay entre palabra y palabra
int silencioLetra = tiempoPunto * 3, silencioPalabra = tiempoPunto * 5;
//para validar que ya se haya enviado el mensaje a través del puerto serial
boolean enviado = false;

void setup(){
  //se configuran los pines
    pinMode(buzzer, OUTPUT);
    pinMode(ledRaya, OUTPUT);
    pinMode(ledPunto, OUTPUT);
    pinMode(ledEspacio, OUTPUT);
    pinMode(ledFin, OUTPUT);
    Serial.begin(9600);
}

void loop(){
    traducirPalabra();
    if(!enviado){
      Serial.print(traduccion);
      enviado = true;
    }
 
    emitirMorse();
    finMensaje();
}
//método que se encarga de dar a saber que ya se termino de transmitir el mensaje
//esperando medio segundo para continuar
void finMensaje(){
  digitalWrite(ledFin, HIGH);
  delay(500);
  digitalWrite(ledFin, LOW);

}

//método que se encarga de encender un led (raya o punto) y emitir un sonido
//a través del buzzer dejando un respectivo tiempo de diferencia
void tono(int tiempoEmision, int pin, int frecuencia){
  //se toca el tono
    tone(buzzer, frecuencia);
    //se enciende el led
    digitalWrite(pin, HIGH);
    delay(tiempoEmision);
    //se apaga el led
    digitalWrite(pin, LOW);
    //se detiene el tono
    noTone(buzzer);
 
}

//función que se usa para emitir un punto
void punto(){
  //se deja un espacio entre la anterior letra y esta
    delay(silencioLetra);
    tono(tiempoPunto, ledPunto, 1500);
}

//función que se usa para emitir un raya
void linea(){
    //se deja un espacio entre la anterior letra y esta
    delay(silencioLetra);
    tono(tiempoRaya, ledRaya, 500);
}

//función que se usa para emitir el espacio entre palabras
void espacio(){
    digitalWrite(ledEspacio, HIGH);
    delay(silencioPalabra);
    digitalWrite(ledEspacio, LOW);
}

//metodo que se encarga de convertir la palabra digitada a código morse
void traducirPalabra(){
    palabra = "";
    if(Serial.available()){
      //se lee el contenido de Serial
        palabra = Serial.readString();
        //se borra la anterior palabra traducida
        traduccion = "";
        enviado = false;
        //se usa para validar el hecho de encontrar un carácter
        boolean encontre = false;
        //si se digita la palabra error
        if(palabra == "error")
            traduccion = error;
        else{
          //se lee la palabra digitada y se convierte a morse
            for(int i = 0; i < palabra.length(); i++){
                for(int j = 0; j < sizeof(caracteres) && !encontre; j++){
                    if(palabra.charAt(i) == caracteres[j]){
                      encontre = true;
                      traduccion += codigo[j] + " ";
                    }
                    else if(palabra.charAt(i) == ' '){
                      encontre = true;
                      traduccion += vacio;
                    }
                     
                }
                encontre = false;
            }
        }
    }
}
//método que se encarga de emitir la palabra traducida
void emitirMorse(){
    for(int i = 0; i < traduccion.length(); i++){
      //se lee caracter por caracter de la palabra traducida a morse
      if(traduccion.charAt(i) == '.')
        punto();
      else if(traduccion.charAt(i) == '-')
        linea();
      else if(traduccion.charAt(i) == vacio)
        espacio();
    }
}

Proyecto tomado de: BLOG DE LAFAUXESCOBAR

1 comentario:

Popular Posts

Xochimeh. Con la tecnología de Blogger.