olivier kouadio
/
STM32_Blink_LED
Convertisseur de code morse Morse code converter
Revision 0:2173fcfdaac6, committed 2019-06-06
- Comitter:
- olivier14750
- Date:
- Thu Jun 06 21:43:44 2019 +0000
- Commit message:
- Convertisseur de code morse
Changed in this revision
diff -r 000000000000 -r 2173fcfdaac6 F746_GUI.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/F746_GUI.lib Thu Jun 06 21:43:44 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/MikamiUitOpen/code/F746_GUI/#50b8f7654c36
diff -r 000000000000 -r 2173fcfdaac6 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Jun 06 21:43:44 2019 +0000 @@ -0,0 +1,316 @@ +#include "mbed.h" +#include <string> + +#include "LCD_DISCO_F746NG.h" +#include "TS_DISCO_F746NG.h" +#include "F746_GUI.hpp" +#define Seuil 0.9 + +#define SeuilMinTimeP 70 +#define SeuilMaxTimeP 250 + +#define SeuilMaxTimeEL 600 +#define SeuilMAXTimeEM 2000 + +bool etat_precedent; +int TabTemps[100]; + +char morse[100]; +int index_morse = 0; +int check = 1; +int flagBPReco = 0; + +using namespace std; + +//Déclaration de la base de donnée morse + +static char *ListCara[36]= {".-", + "-...", + "-.-.", + "-..", + ".", + "..-.", + "--.", + "....", + "..", + ".---", + "-.-", + ".-..", + "--", + "-.", + "---", + ".--.", + "--.-", + ".-.", + "...", + "-", + "..-", + "...-", + ".--", + "-..-", + "-.--", + "--..", + ".----", + "..---", + "...--", + "....-", + ".....", + "-....", + "--...", + "---..", + "----.", + "-----" + }; + +char ListLettre[36]= {'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', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '0' + }; + + +Timer t; +DigitalOut led(LED1); +AnalogIn AnaIn(PF_10); +DigitalIn BP(USER_BUTTON); +Serial pc(USBTX, USBRX); // tx, rx + +TS_DISCO_F746NG ts; +LCD_DISCO_F746NG lcd; + +//Bouton utilisés pour le control du convertisseur morse +// Pour les couleurs, dans l'ordre on a la couleur du text, la couleure du fond d'écran et la couleur du bouton +Button Commencer(50,100,100,100,"BEGIN",Font12,LCD_COLOR_BLACK,LCD_COLOR_BLUE,LCD_COLOR_WHITE); +Button Arrete(195,100,100,100,"STOP",Font12,LCD_COLOR_BLACK,LCD_COLOR_BLUE,LCD_COLOR_WHITE); +Button Recommencer(340,100,100,100,"RESTART",Font12,LCD_COLOR_BLACK,LCD_COLOR_BLUE,LCD_COLOR_WHITE); + + +int main() +{ + float LDR; + bool etat; + int index_TabTemps = 0; + int index_Temps = 0; + int index_TabCara = 0; + int i, Temps[100][2]; + lcd.SetTextColor(LCD_COLOR_BLACK); + + unsigned char morse_decode[200]; + int index_morse_decode = 0; + char cara[6]; + int index_cara=0; + etat_precedent = false; + + t.start(); + while(Commencer.Touched()!=true);// On clique sur la touche "commencer" pour commencer l'enregistrement + + lcd.DisplayStringAt(0,LINE(1),(uint8_t *)"En cours...",CENTER_MODE); + while(1) { + + LDR= AnaIn.read(); // Lecture de la valeur analogique + pc.printf("LDR = %.2f\n\r",LDR); + if(LDR>Seuil) { //Si la valeur analogique dépasse le seuil, cela veut dire que la lumière est détecter sinon pas de lumière + + etat = true; + + } + + else + + { + etat = false; + + } + + if(etat !=etat_precedent) { // Si l'état actuel est différent de l'état précédent + pc.printf("get time\n\r"); + TabTemps[index_TabTemps]= t.read_ms(); // Lecture du temps + index_TabTemps++; + // On indique ici si le temps stocké précédement était une partie du code morse ou pas + if(etat==true) { + Temps[index_Temps][0] = 1; + index_Temps++; + } else { + Temps[index_Temps][0] = 0; + index_Temps++; + } + + } else { + pc.printf("no\n\r"); + + } + etat_precedent = etat; + + if(Arrete.Touched()==true) { // Si la touche "Arreter est apuyer, on arrete l'enregistrement pour passer au décodage + + + lcd.ClearStringLine(1); + + //ici, on récupère tous les temps qu'on a lus pour optenir les temps correspondant au code morse + for( i = 0; i<index_TabTemps; i++) { + Temps[i][1] = TabTemps[i+1] - TabTemps[i]; + } + + + for( i = 0; i<index_Temps; i++) { + // On vérifie chaque temps correspondant à un bout du code morse pour savoir si c'était un point ou un tirait + if(Temps[i][0] ==1) { + if(Temps[i][1]<SeuilMaxTimeP) { + morse[index_TabCara] = '.'; + + pc.printf("%c",morse[index_TabCara]); + index_TabCara++; + } else { + morse[index_TabCara] = '-'; + + pc.printf("%c",morse[index_TabCara]); + index_TabCara++; + } + } else { + //Si le temps ne correspondait pas à bout du code morse, trois cas de figure se présente à nous : + if(Temps[i][1]<SeuilMaxTimeP) { + //Ici, on ne fait rien. Cela veut dire que le caractère n'est pas encore complet + } else if(Temps[i][1]<SeuilMaxTimeEL) { + morse[index_TabCara] = '*'; + index_TabCara++; + //Ici, cela veut dire que le temps correspond à un espacemeent entre deux lettres. Donc on ajoute une étoile pour marquer la fin du caractère + } else if (Temps[i][1]<SeuilMAXTimeEM) { + + morse[index_TabCara] = ' '; + index_TabCara++; + //Ici, cela signifie que le mot est terminé. On met donc un espace pour pouvoir decoder le prochain mot. + + } + } + } + morse[index_TabCara]+='*'; + index_TabCara++; + pc.printf("%d\n\r",index_TabCara); + + pc.printf("code morse : %s\n\r",morse); + + //Nous procédons ici au decodage lettre par lettre + + for(i=0; i<index_TabCara; i++) { + + + if(morse[i]== ' ') { + //Si le caractère rencontré est un espace, tu decode le code morse dans la variable cara qui correspond à un caractère + for(int j=0; j<36; j++) { + if(strcmp(ListCara[j], cara) == 0) {// On compare le code morse cara a notre basse de donnée. Si il reconnait le caractère, tu l'ajoutes à la chaine de caractère finale + morse_decode[index_morse_decode]= ListLettre[j]; + index_morse_decode++; + check = 0; + + } + } + //Si il ne reconnait pas le caractère, alors tu ajoutes un point d'intérogation à ta chaine de caractère + if(check!=0) { + morse_decode[index_morse_decode]= '?'; + index_morse_decode++; + } + //On remet à zero la variable 'cara' pour decoder le prochain caractère + for (int y=0;y<6;y++){ + cara[y] = ' '; + + } + index_cara=0; + morse_decode[index_morse_decode]= ' '; + index_morse_decode++; + + } else if(morse[i]=='*') { + //Si le caractère rencontré est une étoile, tu decode le code morse dans la variable cara qui correspond à un caractère + for(int j=0; j<36; j++) { + if(strcmp(ListCara[j], cara) == 0) { + morse_decode[index_morse_decode]= ListLettre[j]; + index_morse_decode++; + + check = 0; + + } + } + if(check!=0) { + morse_decode[index_morse_decode]= '?'; + index_morse_decode++; + } + for (int y=0;y<6;y++){ + cara[y] = ' '; + index_cara=0; + } + + } else { + cara[index_cara]= morse[i]; + index_cara++; + cara[index_cara]='\0'; // c'est pour decoder la chaine de caractère + + } + + } + + //On affiche le code decodé sur l'écran LCD + lcd.DisplayStringAt(0,LINE(1),(uint8_t *)morse_decode,CENTER_MODE); + flagBPReco =1; + pc.printf("code converti : %s\n\r",morse_decode); + + + + } + //On attend que la touche "recommencer" soit appuyer pour tout réinitialiser + if(flagBPReco==1){ + while(Recommencer.Touched()!=true); + //morse_decode = ""; + flagBPReco=0; + index_TabCara=0; + index_Temps=0; + index_TabTemps=0; + + lcd.ClearStringLine(1); + lcd.DisplayStringAt(0,LINE(1),(uint8_t *)"En cours...",CENTER_MODE); + for(i = 0;i<index_morse_decode;i++){ + morse_decode[index_morse_decode]=0; + } + index_morse_decode=0; + + + Recommencer.Activate(); + Arrete.Activate(); + + + } + + + + } +}
diff -r 000000000000 -r 2173fcfdaac6 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Jun 06 21:43:44 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400 \ No newline at end of file