Recuperer un code DTMF - Balise indication du Vent

Bonjour à tous,

C'est la première fois que je poste sur ce forum pour demander de l'aide.

Je n'ai que peu de pratique encore sur Arduino mais je me débrouille et m'instruis en lisant les Topics.

Je pratique le parapente et dans le monde du Vol libre, il existe des balises indiquant la force et la direction du vent qui émettent un message sur la fréquence Vol Libre : 143.9875 Mhz.

Au début du message voix, il y a un code DTMF qui indique toutes les valeurs (Identification, vitesse et direction du vent). Je cherche à récupérer ces valeurs pour les mettre en ligne et ainsi pouvoir bénéficier de ces mesures lorsque la radio VHF ne passe pas. (Les balises dernières génération le font déjà, mais je recycle une vielle balise non équipée de carte SIGFOX.

J'ai récupéré un code (Robo India) destiné à piloter un appareil à l'aide des touches d'un téléphone qui fonctionne très bien mais, il y a un problème que je n'arrive pas à résoudre malgré tous mes essais.

En effet, ce code ne permet pas d'afficher un numéro lors qu'il est appuyé deux fois sur la même touche.
Exemple : si j'appuie sur la touche 1, c'est bien le chiffre 1 qui s'affiche. Mais si je veux à nouveau 1, ça ne fonctionne pas (C'est normal puisque oldCon = 1).

J'ai essayé plusieurs trucs comme donner une valeur non utilisée à OldCon en fin de boucle mais ça ne fonctionne pas.

Quelqu'un pourrait il me donner une piste ?

Merci par avance.

// Robo India Tutorial on using DTMF.
// www.roboindia.com

  
const int Q1 = 2;  // Defining Digital Input Pins from DTMF Module
const int Q2 = 3;
const int Q3 = 4;
const int Q4 = 5;

int SoQ1 = 0;     // Defining variable to store the status(HIGH/LOW) of above inputs.
int SoQ2 = 0;
int SoQ3 = 0;
int SoQ4 = 0;
int oldCon = 0;  //  Variable to know what was the last button pressed.  

void setup(){ 
  pinMode(Q1, INPUT);  // Defining pins as input.
  pinMode(Q2, INPUT);
  pinMode(Q3, INPUT);
  pinMode(Q4, INPUT);
  Serial.begin(9600);   // Setup Serial Communication.               
  Serial.print("ROBO INDIA\r\n");  
  Serial.print("roboindia.com\r\n");
}

void loop(){
  SoQ1 = digitalRead(Q1);  // Reading status of Input Pins. It can be LOW or HIGH
  SoQ2 = digitalRead(Q2);
  SoQ3 = digitalRead(Q3);
  SoQ4 = digitalRead(Q4);
    
   if(SoQ4==LOW && SoQ3==LOW && SoQ2==LOW && SoQ1==HIGH )   // Condition for Button 1. It is equal to Binary - 0001 
  {
    if (oldCon!=1){                              // Here we are testing that what was the last pressed button, 
       Serial.println("1");                     // We want actions to be done when current is not as the lastone.
       // Your Action goes here. <------------- You can add your set of action here.  
    }
    oldCon=1;
  }  
  else if(SoQ4==LOW && SoQ3==LOW && SoQ2==HIGH && SoQ1==LOW )  // Condition for Button 2. It is equal to Binary - 0010 
    {
      if (oldCon!=2){
         Serial.println("2");
         // Your Action goes here.  
       }
      oldCon=2;  
    }
  else if(SoQ4==LOW && SoQ3==LOW && SoQ2==HIGH && SoQ1==HIGH )  // Condition for Button 3. It is equal to Binary - 0011 
    {
      if (oldCon!=3){
         Serial.println("3");
         // Your Action goes here.  
       }
      oldCon=3;  
    }
  else if(SoQ4==LOW && SoQ3==HIGH && SoQ2==LOW && SoQ1==LOW )  // Condition for Button 4. It is equal to Binary - 0100 
    {
      if (oldCon!=4){
         Serial.println("4");
         // Your Action goes here.  
       }
      oldCon=4;  
    }
  else if(SoQ4==LOW && SoQ3==HIGH && SoQ2==LOW && SoQ1==HIGH )  // Condition for Button 5. It is equal to Binary - 0101 
        {
      if (oldCon!=5){
         Serial.println("5");
         // Your Action goes here.  
       }
      oldCon=5;  
    }
 
  else if(SoQ4==LOW && SoQ3==HIGH && SoQ2==HIGH && SoQ1==LOW )   // Condition for Button 6. It is equal to Binary - 0110 
    {
      if (oldCon!=6){
         Serial.println("6");
         // Your Action goes here.  
       }
      oldCon=6;  
    }
  else if(SoQ4==LOW && SoQ3==HIGH && SoQ2==HIGH && SoQ1==HIGH )  // Condition for Button 7. It is equal to Binary - 0111 
    {
      if (oldCon!=7){
         Serial.println("7");
         // Your Action goes here.  
       }
      oldCon=7;  
    } 
  else if(SoQ4==HIGH && SoQ3==LOW && SoQ2==LOW && SoQ1==LOW )   // Condition for Button 8. It is equal to Binary - 1000 
    {
      if (oldCon!=8){
         Serial.println("8");
         // Your Action goes here.  
       }
      oldCon=8;  
    }    
  else if(SoQ4==HIGH && SoQ3==LOW && SoQ2==LOW && SoQ1==HIGH )  // Condition for Button 9. It is equal to Binary - 1001 
    {
      if (oldCon!=9){
         Serial.println("9");
         // Your Action goes here.  
       }
      oldCon=9;  
    }
  else if(SoQ4==HIGH && SoQ3==LOW && SoQ2==HIGH && SoQ1==LOW )  // Condition for Button 0 (10). It is equal to Binary - 1010 
    {
      if (oldCon!=10){
         Serial.println("0");
         // Your Action goes here.  
       }
      oldCon=10;  
    } 
  else if(SoQ4==HIGH && SoQ3==LOW && SoQ2==HIGH && SoQ1==HIGH )  // Condition for Button * (11). It is equal to Binary - 1011 
    {
      if (oldCon!=11){
         Serial.println("*");
         // Your Action goes here.  
       }
      oldCon=11;  
    }
  else if(SoQ4==HIGH && SoQ3==HIGH && SoQ2==LOW && SoQ1==LOW )  // Condition for Button # (12). It is equal to Binary - 1100 
    {
      if (oldCon!=12){
         Serial.println("#");
         // Your Action goes here.  
       }
      oldCon=12;  
    }
  else if(SoQ4==HIGH && SoQ3==HIGH && SoQ2==LOW && SoQ1==HIGH )  // Condition for Button A (13). It is equal to Binary - 1101 
    {
      if (oldCon!=13){
         Serial.println("A");
         // Your Action goes here.  
       }
      oldCon=13;  
    }
  else if(SoQ4==HIGH && SoQ3==HIGH && SoQ2==HIGH && SoQ1==LOW )   // Condition for Button B (14). It is equal to Binary - 1110
    {
      if (oldCon!=14){
         Serial.println("B");
         // Your Action goes here.  
       }
      oldCon=14;  
    }
  else if(SoQ4==HIGH && SoQ3==HIGH && SoQ2==HIGH && SoQ1==HIGH )   // Condition for Button C (15). It is equal to Binary - 1111 
    {
      if (oldCon!=15){
         Serial.println("C");
         // Your Action goes here.  
       }
      oldCon=15;  
    } 
  else if(SoQ4==LOW && SoQ3==LOW && SoQ2==LOW && SoQ1==LOW )   // Condition for Button D (0). It is equal to Binary - 0000 
    {
      if (oldCon!=0){
         Serial.println("D");
         // Your Action goes here.  
       }
      oldCon=0;  
    }
    
delay(50);   // Debounce Delay.

}

j'imagine que le code que vous avez récupéré mémorise la touche appuyé pour qu'une fois la loop() terminée vous ne refassiez pas la même commande si la touche est toujours appuyée

--> il faut détecter la fin d'appui sur une touche pour pouvoir ensuite la considérer comme nouvelle si vous appuyez 2 fois de suite sur la même

Salut,
Il faut que tu détecte l'appui sur un bouton comme ceci :

if(SoQ1 == HIGH )   // Condition for Button 1. It is equal to Binary - 0001 
  {
    if (lastBut1!=1){                              // Here we are testing that what was the last pressed button, 
       Serial.println("1");                     // We want actions to be done when current is not as the lastone.
       // Your Action goes here. <------------- You can add your set of action here.  
    }
    lastBut1=1;
  }
else{
    lastBut1= 0;
}

Se code te permet de n'effectuer l'action qu'une seul fois.
si tu ne mets pas ça tona ction va s'effectuer des centaine de fois.
Ciao
Hot

Bonjour et merci pour vos réponses.

Pour HotHexus, j'ai modifié le code comme tu l'as suggéré mais ça ne fonctionne pas.

Par exemple si je compose le 1, il s'affiche dans le moniteur série. Si j'appuie à nouveau sur 1, rien ne se passe. Il faut que je compose un autre chiffre pour pouvoir à nouveau obtenir 1 au prochain appui.

Au fait je n'ai pas précisé mais j'utilise un module MT8870 DTMF décodeur.

En fait, il me semble qu'il ne faudrait pas que la dernière touche appuyée soit mémorisée. Que quand on la compose, le chiffre s'affiche.

Si vous avez d'autres idées...

Le réponse en #1

--> il faut détecter la fin d'appui sur une touche pour pouvoir ensuite la considérer comme nouvelle si vous appuyez 2 fois de suite sur la même

Ok merci J-M-L

Je cherche... et j'ai trouvé un bout de code qui devrait me convenir...

Toutefois, je ne comprend pas bien la signification des expressions :

keyVal |= digitalRead(q_4) << 3;
keyVal |= digitalRead(q_3) << 2;
keyVal |= digitalRead(q_2) << 1;
keyVal |= digitalRead(q_1);

Pouvez vous m'éclairer ?

Je débute vraiment et ne comprend pas encore tout...

Merci.

int getKey () {
  
int keyVal = 0;

  while (digitalRead(switchPin) == HIGH);    // wait for key to be released


  delay(10);            // debounce if needed
  
  keyVal |= digitalRead(q_4) << 3;      // depends on HIGH always being defined as 1
  keyVal |= digitalRead(q_3) << 2;
  keyVal |= digitalRead(q_2) << 1;
  keyVal |= digitalRead(q_1);
  
  return keyVal;
}

L’opérateur << décale les bits “vers la gauche” d’un certains nombre de position (le nombre passé en paramètre)

Si vous avez dans un octet b en binaire la valeur 10000001 et que vous demandez b << 1 (donc b décalé de 1 position à gauche) vous avez la valeur 00000010. Le 1 de poids fort est perdu et le 1 de poids faible a été décalé (ainsi que tous les autres bits bien sûr) et on fait rentrer un 0 en poids faible

L’opérateur | est le OU binaire. Si xet y sont deux octets alors x | y est le OU bit à bit des 2 octets. un OU binaire est vrai si au moins un des 2 bits est vrai. (0|0 vaut 0 mais 1|0 et 0|1 et 1|1 valent 1)

Donc en imaginant que keyVal vaut 0 au départkeyVal |= digitalRead(q_4) << 3; va lire un 0 ou un 1 avec le digitalRead (LOW ou HIGH ont ces valeurs), va décaler de 3 positions vers la droite cette valeur et faire un OU avec la valeur de keyVal. ça revient à dire que l’on se retrouve avec un 1 sur le bit 4 si le digitalRead avait retourné HIGH: en effet un HIGH vaut 1, donc en binaire 00000001 décalé de 3 positions ça nous donne 00001000 et en faisant un OU avec keyVal qui vaut 00000000 on a bien 00001000. Le bit 4 de keyVal va donc représenter l’état de la pin q_4

On répète l’opération

  keyVal |= digitalRead(q_3) << 2;
  keyVal |= digitalRead(q_2) << 1;
  keyVal |= digitalRead(q_1);

mais en décalant de 2 bits, 1 bit et 0 bits les états des pins et donc au final on a dans keyVal sur les 4 bits de poids faibles les 4 états des pins q_4 q_3 q_2 q_1 ==> ça permet de ranger sur un seul octet les états et donc de vous retourner cela en une seule valeur.

Si vous faites ensuite un ET binaire - en programmation on le représente par & - (qui vaut 1 que si les 2 bits sont à 1) avec un masque où les bons bits sont à 1 ça vous permet de prendre des décisions. Par exemple pour tester si q_3 est HIGH on écrirait

if (keyVal & B00000100) { // q_3  est HIGH, on se fiche de l’état des autres bits
   ...
}

en effet si q_3 était HIGH alors keyVal valait xxxxx1xx et en faisant le ET binaire avec 00000100 quelles que soient les valeurs des x on obtient 00000100 (on a isolé le 3ème bit). Comme en C toute valeur non nulle est VRAIE le if testera donc bien si q_3 était HIGH

Si vous voulez tester plusieurs pins d’un coup sont toutes HIGH alors il faut comparer le résultat du masque avec le masque

if ((keyVal & B00001001) == B00001001 ) { // q_4 ET q_1 sont HIGH, on se fiche de l’état des autres bits
   ...
}

Mais si on ne souhaitait savoir que au moins une parmi les pins étaient HIGH alors c’est comme le premier cas:

if (keyVal & B00001001) { // q_4 ET/OU q_1 sont HIGH, on se fiche de l’état des autres bits
   ...
}

fitness04:
Bonjour et merci pour vos réponses.

Pour HotHexus, j'ai modifié le code comme tu l'as suggéré mais ça ne fonctionne pas.

Par exemple si je compose le 1, il s'affiche dans le moniteur série. Si j'appuie à nouveau sur 1, rien ne se passe. Il faut que je compose un autre chiffre pour pouvoir à nouveau obtenir 1 au prochain appui.

Au fait je n'ai pas précisé mais j'utilise un module MT8870 DTMF décodeur.

En fait, il me semble qu'il ne faudrait pas que la dernière touche appuyée soit mémorisée. Que quand on la compose, le chiffre s'affiche.

Si vous avez d'autres idées...

bonjour
se servir du signal Est fourni par le MT8870 (Early Steering (Output) ) ?

Bonjour à tous,

Pour J-M-L, j'ai compris ton explication même si il faudra que je la relise plusieurs fois pour essayer de bien l'assimiler.

Merci d'avoir pris le temps de m'expliquer (c'est un peu comme un cours de Math de ma jeunesse !).

Donc, mon code fonctionne et je récupère donc les codes DTMF transmis par la balise météo.

Exemple : C9660C représentant un message codé.

L'explication du message est détaillé sur le site du Lycée d'Altitude de Briançon qui avait réalisé en 2006 un TD pour présenter au Concours général des Lycées.

Site : Balises FFVL - Lycée d'Altitude de Briançon

Malheureusement, ce projet n'est plus en cours et je n'ai pas les données de codage des messages DTMF pour pouvoir les décoder. Je cherche actuellement...

Je pense trouver mon bonheur avec les Balises ADISON qui sont les deuxième génération de Balises FFVL. L'explication du message de 10 codes DTMF au lieu de 6 est fournie. (je joins la documentation en PDF).

Voilà où j'en suis actuellement.

A bientôt.

Fitness04

doc_constructeur_adison.pdf (266 KB)

Merci à Artouste et J-M-L.

J'ai modifié mon code en utilisant Switch et case et des masques binaires.

Je poste ci dessous le code qui fonctionne comme je le voulais.

Je décode un numéro de téléphone et le signal DTMF des balises de mesure du vent FFVL.

Je vais continuer sur mon projet tout en apprenant...

Merci pour votre aide. Je reviendrai sans doute vers vous ou plus généralement vers le forum.

/*Source_Internet : https://forum.arduino.cc/index.php?topic=107558.0
//Décodeur DTMF_issus du topic ci dessus, intervention de graynomad
*/

int q_1 = 4;
int q_2 = 5;
int q_3 = 6;
int q_4 = 7;
int switchPin = 10;

void setup() {
  pinMode(q_1, INPUT);
  pinMode(q_2, INPUT);
  pinMode(q_3, INPUT);
  pinMode(q_4, INPUT);
  pinMode(switchPin, INPUT);
  Serial.begin(9600);
  Serial.print("DTMF_decoder_JMD\r\n");
}

int getKey () {
  int keyVal = 0;

  while (digitalRead(switchPin) == HIGH);    // wait for key to be released
//  Serial.println("Hight");   
  while (digitalRead(switchPin) == LOW);// wait for next key press
//    Serial.println("Low");
  delay(10);            // debounce if needed
  
  keyVal |= digitalRead(q_4) << 3;      // depends on HIGH always being defined as 1
  keyVal |= digitalRead(q_3) << 2;
  keyVal |= digitalRead(q_2) << 1;
  keyVal |= digitalRead(q_1);
  
  return keyVal;
}

void loop() {
  int keyVal = 0;
  // wait a bit...
  delay(30);
  
  keyVal = getKey();

//Serial.print ("KeyVal= ");Serial.println (keyVal);//Débugage
  
  switch (keyVal) {

    case B0001://touche 1
    {
// Your action goes there
        Serial.println("1");// turn on 1
            break;
        }

     case B0010://touche 2
    {
// Your action goes there
        Serial.println("2");// turn on 2
            break;
        }

     case B0011://Touche 3
    {
// Your action goes there
        Serial.println("3");// turn on 3
            break;
        }

     case B0100://touche 4
    {
// Your action goes there
        Serial.println("4");// turn on 4
            break;
        }

     case B0101://touche 5
    {
// Your action goes there
        Serial.println("5");// turn on 5
            break;
        }

     case B00110://touche 6
    {
// Your action goes there
        Serial.println("6");// turn on 6
            break;
        }

     case B0111://touche 7
    {
// Your action goes there
        Serial.println("7");// turn on 7
            break;
        }
        
     case B1000://touche 8
    {
// Your action goes there
        Serial.println("8");// turn on 8
            break;
        }
        
     case B1001://touche 9
    {
// Your action goes there
        Serial.println("9");// turn on 9
            break;
        }

     case B1010://touche 0
    {
// Your action goes there
        Serial.println("0");// turn on 0
            break;
        }

     case B1011://touche *
    {
// Your action goes there
        Serial.println("*");// turn on *
            break;
        }

     case B1100://touche #
    {
// Your action goes there
        Serial.println("#");// turn on #
            break;
        }

     case B1101://touche A
    {
// Your action goes there
        Serial.println("A");// turn on A
            break;
        }
              
     case B1110://touche B
    {
// Your action goes there
        Serial.println("B");// turn on B
            break;
        }

     case B1111://touche C
    {
// Your action goes there
        Serial.println("C");// turn on C
            break;
        }
        
     case B0000://touche D
    {
// Your action goes there
        Serial.println("D");// turn on D
            break;
        }             
  } 
}

cool - faites un petit ctrl-T dans l'IDE vous verrez que le code proprement indenté est plus facile à lire :slight_smile:

profitez en aussi pour économiser de la mémoire et déclarez

const byte q_1 = 4;
const byte q_2 = 5;
const byte q_3 = 6;
const byte q_4 = 7;
const byte switchPin = 10;

concrètement elles sont connectées à quoi ces pins ?

Vous faites un   delay(10); // debounce if needed dans la fonction. Vous debouncez quoi ?

Ok J-M-L,

Je vais voir ce que tu conseilles.

Pour le delay, c'est un anti rebond lorsque l'on appuie sur une touche.

Je ne sais pas si c'est vraiment necessaire. Je vais le supprimer.

Il y a aussi beaucoup de commentaires qui me servent pour debbugger.

J'avance pas á pas...

Merci

fitness04:
Pour le delay, c'est un anti rebond lorsque l'on appuie sur une touche.
Je ne sais pas si c'est vraiment necessaire. Je vais le supprimer.

faut pas mettre du code si on ne sait pas à quoi il sert. la touche est sur switchPin mais elle n'est plus relue après dans la fonction getKey() et vous revenez au corps principal du programme (la loop()) dans laquelle vous avez un delay(30), donc le rebond sur switchPin aura été éliminé par ce delay() dans le code principal.

(de manière générale vaut mieux éviter la fonction delay() et en plus quand vous faites un

  while (digitalRead(switchPin) == HIGH);    // wait for key to be released
  while (digitalRead(switchPin) == LOW);// wait for next key press

vous ne gérez pas le debounce...

fitness04:
Identification, vitesse et direction du vent). Je cherche à récupérer ces valeurs pour les mettre en ligne

Il y a déjà des mesures en ligne ici par exemple
http://www.balisemeteo.com/depart.php?dept=38

Bonjour,

Pour Christian_R,

Ces balises qui envoient des données sur Internet sont les balises ADISON. Les premières générations (Hermès) ne font qu'émèttre en VHF. C'est pour leur donner une seconde vie que je souhaite écrire ce programme. Beaucoup de clubs, dont le mien, en ont et en font rien. Certaines sont encore en service après plus de 15 ans de fonctionnement. Elles sont solides et les capteurs de trés bonne qualité.
Enfin, je ne sais pas si j"en viendrait â bout, mais c'est formateur...

Fitness04

Intéressant ce sujet, je vais suivre ça!

Il en reste beaucoup des balises Hermès ?

La portée VHF est assez locale, ça vaudrait peut être le coup de modifier directement les balises pour les convertir en émeteurs SIGIFOX sinon il faudra multiplier les détecteurs DTMF pour couvrir le réseau national.

Bonjour J-M-L,

Je n'ai pas répondu à ta question "Concrétement, elles sont reliées à quoi ces pins?"

Elles sont reliées aux bornes Q1 à Q4 du module MT8870, décodeur de tonalités DTMF.

Q10 est relié à StQ qui passe à 1 dès qu'une tonalité DTMF est reçue

C'est ce module : Toutes les informations sur la maison, le travail et les loisirs - Minilien

Donc, je reçois un message de 10 tonalités qui correspondent à un message codé suivant les modalités ci dessous :

2.2 Exemple d’un message DTMF

  • Balise n°25
  • Direction du vent SE
  • Vitesse moyenne du vent 56 Km/h
  • Vitesse maximum du vent 72 Km/h
  • Température –20°C
  • 25 -> 0x19 -> 91
  • SE -> 135° -> 3
  • 56 -> 0x38 -> 83
  • 75 -> 0x4B -> B4
  • -20°C -> 0xEC -> CE
    checksum : 0 –
    (0x09+0x01+0x03+0x08+0x03+0x0B+0x04+0x0C+0x0E)
    0 – 0x41 -> 0x0F
    Message:
    Non transcodé: 91383B4CEF
    Message transcodé: 91383*4#BC

Maintenant que j'arrive à récupérer les codes DTMF, il me faut créer le message reçu, sous forme de string je pense. Ensuite, je décode ce message...

C'est pas gagné!

A bientôt.

Fitness04

Votre doc décrit le format

Le message DTMF est transmis en préambule du message vocal transmis sur la radio VHF. Le message est composé de 10 notes DTMF d’une durée de 102ms séparées par un silence de 102ms

et on a une correspondance claire entre caractère DTMF et code HEXA associé

```
DTMF HEXA
1 0x01
2 0x02
3 0x03
4 0x04
5 0x05
6 0x06
7 0x07
8 0x08
9 0x09
0 0x0A

  •  0x0B
    

0x0C

A 0x0D
B 0x0E
C 0x0F
D 0x00
```

En regardant sur le site du Lycée d'Altitude de Briançon que vous mentionnez qu'il y a un enregistrement de démo qui pourrait servir à tester


l'image de fréquence cependant ne semble pas correspondre aux 10 notes DTMF de votre document

Dans l'absolu vu qu'on a un composant matériel MT8870 qui fait le gros du boulot - Ce n'est pas super compliqué mais il faut rendre le truc un peu robuste - une machine a état peut servir à cela pour gérer les timings... J'ai commandé un de ces modules en asie - bon je le reçois dans un mois et je jetterai un oeil

Pouvez vous préciser si l'enregistrement dispo ci dessus correspond à la première doc ? où est-ce un paramètre particulier de la balise qui lui dit de ne pas tout émettre? quid des 6 bips de préambule numérique par exemple ?

Bonjour

Je cherche à récupérer ces valeurs pour les mettre en ligne et ainsi pouvoir bénéficier de ces mesures lorsque la radio VHF ne passe pas. (Les balises dernières génération le font déjà, mais je recycle une vielle balise non équipée de carte SIGFOX.

La vielle balise est sans doute équipée d'un circuit intégré encodeur DTMF.

Si oui et si un repiquage des entrées de cet encodeur est possible il y aurait peut être un moyen direct simple de récupérer les infos en amont de l'encodage DTMF, les traiter et les envoyer sur la toile...

Si l'encodeur est un HT9200 Holtek avec son entreé série synchrone et son entrée parallèle sur 4 bits la récupération de la donnée numérique serait aisée.- On peut espérer que l'encodeur DTMF de la balise ne soit pas du type gestion matricielle de clavier + encodeur)

Bonjour J-M-L,

En fait, les éléments de doc récupérés sur le site du Lycée de Briançon, mélangent un peu les données.

Le message de la balise du Prorel avec un message de 6 notes DTMF est bien celui de la première génération de balises Hermes et celui que je veux décoder et mettre en ligne.

La Doc fournie de la Balise ADISON est celle de la deuxième génération de balises qui émettent un message VHF et transmettent les données par réseau SIGOX au site internet de la FFVL :

http://www.balisemeteo.com/balise.php?idBalise=60

Je n'en suis pas sûr mais je pense que la société ADISON a repris le brevet de la balise Hermes et l'a modernisé.

De fait, je présume que le message doit être codé à peu prés de la même façon quoique !

  • La première et dernière tonalités correspondent au numéro de la balise. Avec une seule tonalité, peut on passer un numéro de balise à 2 chiffres ?

  • les 4 tonalités du milieu correspondent à la direction du vent, la vitesse moyenne et la vitesse maximum. Si le codage est comme indiqué sur les Balises ADISON, il manque une tonalité pour pouvoir coder l'ensemble du message.

J'ai interrogé un Prof du lycée de Briançon, il va interroger ses collègues ayant travaillé sur ce projet en 2006 pour voir si ils ont des éléments précisant le codage.

Je ne sais pas ce que c'est une machine à état ?

Pour avancer sur mon projet, maintenant que je récupère les caractères émis un à un, il me faut les transformer en un message de 6 caractères sous forme de String non ?

Merci pour votre aide.

Fitness04