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 :
TEMPO
ms, si le bit vaut 0 (correspond au point),
3*TEMPO
ms, si le bit vaut 1 (correspond au tiret).
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(){
}