Bonjour,
Avant propos : je me suis inspiré d'une librairie dont je ne retrouve pas l'auteur. J'ai supprimé la fonction led
, je l'ai complètement revisitée en la simplifiant au niveau du code, en y ajoutant une classe... J'ai gardé l'algorithme qui permet le calcul de la vitesse de lecture : (60 * 1000L) / (50 * vitesse)
MorseCode.h (9,4 Ko)
Bizarrement un fichier .h sans .cpp suffit à la mettre en œuvre !
Depuis mon dernier fil de discussion :
https://forum.arduino.cc/t/poo-creation-librairie-creation-dune-classe/1021804
J'ai décidé de stopper mes lectures (livres sur le C++) afin de mettre à profit ce que vous m'avez appris et d'essayer de créer une librairie sans plus de connaissances. J'ai donc fait une librairie pour lire le morse à partir du moniteur série et le traduire au niveau sonore avec la fonction tone()
d'arduino et un Buzzer piézoélectrique. j'aurai pu la zipper selon la structure adéquate (keywords, exemple) mais je me contente ici de vous la présenter. Elle souffre peut-être d'imperfections ...
Le fichier ino
a pour unique fonction de créer un tableau de char nommé message
et de le transmettre à la classe Morse avec en paramètres en plus du tableau :
- la pin utilisée ;
- la vitesse de transcription sonore ;
- et la fréquence la plus adaptée au code Morse.
Dans l'ordre : pin, message, vitesse, fréquence.
#include "Morse.h"
const size_t taille = 250;
void setup()
{
Serial.begin(115200);
}
void loop()
{
if ( Serial.available() > 0 )
{
static char message[taille];
static uint8_t i;
char c = Serial.read();
if ( c != '\n' && i < taille - 1 )
message[ i++ ] = c;
else
{
message[ i ] = '\0';
i = 0;
Serial.print( "transcription en morse de : " );
Serial.println( message );
Morse Code(12,message,17, NOTE_C4); // configuration la plus adaptée au Morse
Code.joue();
}
}
}
Le fichier h
est on ne peut plus simple :
#include <arduino.h> // pour fonction tone()
#define NOTE_C4 262 // fréquence la plus adaptée pour le morse
#ifndef Morse_h
#define Morse_h
class Morse {
public:
// Constructeur
Morse(int pin, char *s, int vitesse, int frequence);
void joue(void);
// Destructeur
~Morse();
private:
int _pin;
char *_s;
int _vitesse;
int _frequence;
};
#endif
Quant au fichier cpp
il se contente dans la méthode joue
de la classe Morse
:
- d'analyser
message
lettre par lettre ; - de transcrire les lettres et chiffres en points et en tirets (tableaux codeMorse et codeMorseChiffre) ;
- de transmettre les lettres transformées en points et tirets à la fonction
lettres
Cette dernière fonction transmettra chaque point et tiret aux fonctions void point(int pin, int duree, int frequence)
et void tiret(int pin, int duree, int frequence)
aux fins de transcription sonore avec la fonction tone() d'arduino.
#include "Morse.h"
const char *codeMorse[27] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};
const char *codeMorseChiffre[11] = {"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."};
// joue un point avec la fonction tone() d'arduino
void point(int pin, int duree, int frequence)
{
tone(pin, frequence, duree);
delay(duree);
}
// joue un tiret avec la fonction tone() d'arduino
void tiret(int pin, int duree, int frequence)
{
duree *= 3; // un tiret = trois points
tone(pin, frequence, duree);
delay(duree);
}
// chaque point et tiret constitutif d'une lettre est transmit à la procédure point() ou tiret() pour transcription sonore
void lettres(int pin, int vitesse, int frequence, char *a)
{
while ( *a ) {
switch ( *a ) {
case '.':
point(pin, vitesse, frequence);
delay(vitesse); // entre chaque point constitutif d'une lettre un espacement de temps court
break;
case '-':
tiret(pin, vitesse, frequence);
delay(vitesse); // entre chaque tiret constitutif d'une lettre un espacement de temps court
break;
}
a++;
}
delay(3 * vitesse); // entre chaque lettre un espacement de temps un peu plus long (X3)
}
// Initialisation
Morse::Morse(int pin, char *s, int vitesse, int frequence)
: _pin(pin),
_s(s),
_vitesse((60 * 1000L) / (50 * vitesse)), // _vitesse (vitesse des points) = 1 minute divisée par vitesse * 50
_frequence(frequence)
{}
void Morse::joue() {
/*On extrait chaque lettre ou chiffre du tableau de char transmit à la classe Morse - on transmet l'équivalent en morse
(points et tirets) à la procédure lettres (tableaux de char *codeMorse ou *codeMorseChiffre)
*/
while ( *_s ) {
Serial.print(*_s);
for (byte i = 0; i < 26; i++) {
if ((*_s == 'a' + i) || (*_s == 'A' + i)) { //on teste d'abord les minuscules puis les majuscules
Serial.print("\t"); Serial.println((char*)codeMorse[i]);
lettres(_pin, _vitesse, _frequence, (char*)codeMorse[i]);
}
}
for (byte j = 0; j < 10; j++) {
if (*_s == '0' + j) { //on teste les chiffres
Serial.print("\t"); Serial.println((char*)codeMorseChiffre[j]);
lettres(_pin, _vitesse, _frequence, (char*)codeMorseChiffre[j]);
}
}
if (*_s == 32) { // en cas d'espace un délais plus long est appliqué
delay(8 * _vitesse);
Serial.print("\n");
}
_s++;
}
}
// Destruction
Morse::~Morse() {}
Voilà.
Bonne journée.