Code Morse avec une led

Bonjour tout le monde :slight_smile:

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 :stuck_out_tongue:

Je suppose que ça 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 a plus qu’à remplacer le message “Hello World !” par votre message, éventuellement changer le n° de pin et le temps que dure un point.

/*
  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 by WMLogistic
*/

const int led = 12;      // On attribue le pin sur lequel on a 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

// the setup function runs once when you press reset or power the 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 a 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);
}

// the loop function runs over and over 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 FOR qui démarre à 0 jusqu'au nombre de lettre dans le message à séquencer en incrémentant de 1 à chaque tour
  for(int i = 0; i < 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 :slight_smile:

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 [color=blue]"... Jean-Marc ..."[/color] ?

==> 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.