Code source version 2 du code Morse

Retour à la page du projet

Afficher/Masquer les commentaires

La constante TEMPO indique la vitesse en ms à laquelle les impulsions du code Morse sont générées sur la LED.

const int TEMPO=300;

Le tableau nbImpulsion comme son nom l'indique contient les nombres d'impulsions nécessaires pour générer le code Morse de chaque lettre.

byte nbImpulsion[]={2,4,4,3,1,4,3,4,2,4,3,4,2,2,3,4,4,3,3,1,3,4,3,4,4,4};

Tableau du codage des lettres, l'utilisation du préfixe Ob permet d'entrer directement les nombres en écriture binaire.

byte codeMorse[]={
  0b01,
  0b1000,
  0b1010,
  0b100,
  0b0,
  0b0010,
  0b110,
  0b0000,
  0b00,
  0b0111,
  0b101,
  0b0100,
  0b11,
  0b10,
  0b111,
  0b0110,
  0b1101,
  0b010,
  0b000,
  0b1,
  0b001,
  0b0001,
  0b011,
  0b1001,
  0b1011,
  0b1100  
};

Fonction pour afficher sur la LED le code morse d'une lettre :

void afficheLettre(char lettre){

byte(lettre) donne le code ASCII de la lettre, pour A c'est 65, pour B c'est 66, etc. En retranchant 65 on obtient la position du codage de la lettre dans le tableau codeMorse

  byte positionLettre=byte(lettre)-65;

codeLettre reçoit le nombre qui représente le codage du code Morse de la lettre

  byte codeLettre=codeMorse[positionLettre];

Conversion en binaire de codeLettre, le résultat figure dans le tableau bits.

Pour en savoir plus : Conversion d'un entier en binaire

  byte bits[]={0,0,0,0};
  byte r;
  byte k=0;

  do{
    r=codeLettre%2;
    bits[k]=r;
    codeLettre=(codeLettre-r)/2;
    k++;
  }while(codeLettre!=0);

On parcourt le tableau bits pour générer la séquence d'allumage de la LED. C'est dans le tableau nbImpulsion qu'il faut récupérer le nombre de tours de boucle à réaliser. A chaque tour la LED est allumée durant :

  for(int i=nbImpulsion[positionLettre]-1;i>=0;i--){
    digitalWrite(2,HIGH);
    if(bits[i]==0){
      delay(TEMPO);
    } else {
      delay(3*TEMPO);
    }

Temps mort entre deux impulsions

    digitalWrite(2,LOW);
    delay(tempo);
  }
}

Fonction setup exécutée une seule fois au démarrage du module Arduino :

void setup(){
  pinMode(2,OUTPUT);

  char message[]="CODE MORSE";
  for(int k=0;k<10;k++){
    if(message[k]==' '){

Temps mort pour représenter un espace

	
      delay(tempo*7);
    } else {

La fonction afficheLettre vue ci-dessus permet d'afficher le code morse d'une lettre.

      afficheLettre(message[k]);

Temps mort entre deux caractères : seulement 2*TEMPO car la fonction afficheLettre provoque toujours à la fin l'extinction de la LED durant TEMPO.

      delay(2*TEMPO);  
    }
  }
} 

Pour éviter que le code Morse ne se réalise en boucle tout le programme figure dans la fonction setup et la fonction loop est vide (cependant elle doit obligatoirement figurer dans le code source du programme sinon une erreur de compilation est provoquée).

void loop(){
}