Code Morse avec une led
bonjour tout le monde 
je suis nouvel acquéreur d'un arduino uno et je vous présente mon tout premier projet ... faire du code morse avec une led ... et oui ... je me suis pas contenter de faire lummer une simple led comme premier test :p
je suppose que ça déjà été fait des centaines de fois et qu'il doit même exister une librairie spéciale morse (j'ai pas regardé) mais bon, j'aime bien réinventer la roue donc pourquoi faire simple quand on peut faire compliqué ? ^^
voici mon code ... il n'y plus qu'à remplacer le message "hello world !" par votre message, éventuellement changer le n° de pin et le temps que dure un point.

je suis nouvel acquéreur d'un arduino uno et je vous présente mon tout premier projet ... faire du code morse avec une led ... et oui ... je me suis pas contenter de faire lummer une simple led comme premier test :p
je suppose que ça déjà été fait des centaines de fois et qu'il doit même exister une librairie spéciale morse (j'ai pas regardé) mais bon, j'aime bien réinventer la roue donc pourquoi faire simple quand on peut faire compliqué ? ^^
voici mon code ... il n'y plus qu'à remplacer le message "hello world !" par votre message, éventuellement changer le n° de pin et le temps que dure un point.
code: [select]
/*
code morse
regles du code morse :
1 tiret = 3 points
espacement entre 2 élements d'une même lettre = 1 point
espacement entre 2 lettres = 3 points
espacement entre 2 mots = 7 points
code wmlogistic
*/
const int led = 12; // on attribue le pin sur lequel on branché l'anode de la led !!! important : on oublie pas de mettre une résistance !!!
const int temps = 250; // durée d'un point
string message = "hello world !"; // ne pas mettre d'accent dans le message
const string debut = "-.-.-|"; // code morse qui annonce le début d'un message
const string fin = "...-.-|"; // code morse qui annonce la fin du message
// setup function runs once when press reset or power board
void setup() {
serial.begin(115200);
serial.println("démarrage");
pinmode(led, output); // on définit le pin "led" en sortie
// ne pas modifier le code ci-dessous si vous ne savez pas ce que vous faites.
serial.println("message à transcrire : " + message);
message.touppercase(); // on transcrit tout le message en majuscule
serial.println("message transformé en majuscule : " + message);
int nbrlettresmsg = message.length();
serial.print("nombre de lettre dans le message : ");
serial.println(nbrlettresmsg);
// on remplaceme chaque lettre du message par le code morse qui lui est attribué
// notez que j'ajoute un ";" volontairement à la fin afin de marquer la fin de la lettre dans le sequencage morse plus bas dans le code
// on commence en toute logique par les "." et "-" et ";" qui sont dans votre message afin de ne pas remplacer les . ou - d'une lettre déjà convertie donc on commence par ça
message.replace(".",".-.-.-;");
message.replace("-","-....-;");
// message.replace(";","-.-.-;"); // non je ne remplace pas celui là car ca enlèverait la fin des deux premières conversions
message.replace("a",".-;");
message.replace("b","-...;");
message.replace("c","-.-.;");
message.replace("d","-..;");
message.replace("e",".;");
message.replace("f","..-.;");
message.replace("g","--.;");
message.replace("h","....;");
message.replace("i","..;");
message.replace("j",".---;");
message.replace("k","-.-;");
message.replace("l",".-..;");
message.replace("m","--;");
message.replace("n","-.;");
message.replace("o","---;");
message.replace("p",".--.;");
message.replace("q","--.-;");
message.replace("r",".-.;");
message.replace("s","...;");
message.replace("t","-;");
message.replace("u","..-;");
message.replace("v","...-;");
message.replace("w",".--;");
message.replace("x","-..-;");
message.replace("y","-.--;");
message.replace("z","--..;");
message.replace("1",".----;");
message.replace("2","..---;");
message.replace("3","...--;");
message.replace("4","....-;");
message.replace("5",".....;");
message.replace("6","-....;");
message.replace("7","--...;");
message.replace("8","---..;");
message.replace("9","----.;");
message.replace("0","-----;");
message.replace(" ","|"); // ici le "|" indique la fin d'un mot et qu'il peut y en avoir un autre derrière car il y un espace dans votre message
message.replace(":","---...;");
message.replace(",","--..--;");
message.replace("?","..--..;");
message.replace("'",".----.;");
message.replace("!","-.-.--;");
message.replace("@",".--.-.;");
message = message + "|"; // j'ajoute un "|" qui marquera la fin du mot ou du message et qui servira dans le sequencage morse plus bas dans le code
// on remplace maintenant ";|" par "|" dans le message transformé car la fin de lettre ne sert à rien avant un autre mot
message.replace(";|","|");
serial.println("message transformé en morse : " + message);
}
// loop function runs on , on again forever
void loop() {
sequencagemorse(debut); // on lance le séquencage morse du début de message
sequencagemorse(message); // on séquence notre message à la suite
sequencagemorse(fin); // on indique la fin du message
serial.println(""); // et on revient à la ligne
}
// fonctions
// le séquencage morse
void sequencagemorse(string msg){
// on crée une boucle qui démarre à 0 jusqu'au nombre de lettre dans le message à séquencer en incrémentant de 1 à chaque tour
for(int = 0; < msg.length(); i++) {
// on vérifie à quoi correspond chaque caractère dans la boucle
if (msg.substring(i, i+1) == "-") {
serial.print("-");
tiret();
}
else if (msg.substring(i, i+1) == ".") {
serial.print(".");
point();
}
else if (msg.substring(i, i+1) == ";") {
serial.print(" ");
delay(3*temps); // rapelez-vous, un espacement de la durée de 3 points entre chaque lettre
}
else if (msg.substring(i, i+1) == "|") {
serial.print(" ");
delay(7*temps); // rapelez-vous, un espacement de la durée de 7 points entre chaque mots
}
}
}
// fonctions pour l'activation-désactivation de la led selon si c'est un tiret ou un point avec les temps qui leur sont attribué et que vous pouvez règler tout en haut au début du code qui est la variable "temps"
void tiret(){
digitalwrite(led, high); // high = allumé
delay(3*temps);
digitalwrite(led, low); // low = eteind
delay(temps);
}
void point(){
digitalwrite(led, high); // high = allumé
delay(temps);
digitalwrite(led, low); // low = eteind
delay(temps);
}
bonjour
merci pour le partage et bravo pour l'ambition sur ce premier projet
quelques commentaires qui se veulent constructifs
- sur des petits micros-contrôleurs vaut mieux éviter la classe string qui fragmente la mémoire été créé aubin bout d'un moment des soucis de mémoire dispo et des bugs difficiles à trouver
- vous avez essayé avec comme message "... jean-marc ..." ?
==> je pense que votre code va bugger car vous replacez dans la string d'origine les points par leur représentation morse, qui contient des tirets puis ensuite vous remplacez ces mêmes tirets par leur représentation morse... il faut sans doute - si vous gardez votre approche de bâtir toute la chaîne morse d'un coup (ouille, la mémoire en prends un coup) - bâtir une nouvelle chaîne en ajoutant la fin à chaque fois la représentation morse de la chaîne d'origine. (vous vous en êtes rendu compte pour le point virgule d'ailleurs et ça réglerait le problème aussi du point virgule)
- mais idéalement il vaudrait mieux une fonction qui émet 1 caractère et vous lisez votre chaîne caractère par caractère et l'envoyez ainsi.
merci pour le partage et bravo pour l'ambition sur ce premier projet

quelques commentaires qui se veulent constructifs
- sur des petits micros-contrôleurs vaut mieux éviter la classe string qui fragmente la mémoire été créé aubin bout d'un moment des soucis de mémoire dispo et des bugs difficiles à trouver
- vous avez essayé avec comme message "... jean-marc ..." ?
==> je pense que votre code va bugger car vous replacez dans la string d'origine les points par leur représentation morse, qui contient des tirets puis ensuite vous remplacez ces mêmes tirets par leur représentation morse... il faut sans doute - si vous gardez votre approche de bâtir toute la chaîne morse d'un coup (ouille, la mémoire en prends un coup) - bâtir une nouvelle chaîne en ajoutant la fin à chaque fois la représentation morse de la chaîne d'origine. (vous vous en êtes rendu compte pour le point virgule d'ailleurs et ça réglerait le problème aussi du point virgule)
- mais idéalement il vaudrait mieux une fonction qui émet 1 caractère et vous lisez votre chaîne caractère par caractère et l'envoyez ainsi.
Arduino Forum > International > Français > Réalisations et Projets Finis (Moderators: jfs, Snootlab) > Code Morse avec une led
arduino
Comments
Post a Comment