Exécuter la même tache en changeant une seule variable

Bonjour,

J'ai écrit un bout de code permettant de générer des tonalités DTMF avec un arduino uno, le code est fonctionnel :

#include "dtmfgen.h"

DTMFGenerator dtmf;

void setup()
{
}

void loop()
{
  dtmf.generate('1', 300);
  delay(1000);
  dtmf.generate('5', 300);
  delay(1000);
  dtmf.generate('2', 300);
  delay(1000);
  dtmf.generate('0', 300);
  delay(1000);
  dtmf.generate('7', 300);

  delay(3000);
}

Au lieu de réécrire une ligne à chaque numéro que je souhaite composer, j'aimerai écrire les numéros à la chaine pour que le code l'exécute par la suite, j'ai tenté ceci mais cela ne fonctionne pas :

#include "dtmfgen.h"

DTMFGenerator dtmf;

void setup()
{
}

void playDTMF(uint8_t number, long duration)
{
  dtmf.generate(number, duration);
}

void loop()
{
  int i;
  uint8_t phone_number[] = { 1, 5, 2, 0, 7}; // écrire le numéro à composer

  for (i = 0; i < sizeof(phone_number); i ++)
  {
    playDTMF(phone_number[i], 300);
  }

  delay(3000);
}

Une idée du problème ? Merci,
Cordialement, Christophe

Tu vois la différence?

Un hint supplémentaire

Un caractère est codé par sa valeur ASCII :slight_smile:

J'ai modifié le code :

#include "dtmfgen.h"

DTMFGenerator dtmf;

void setup()
{
}

void playDTMF(uint8_t number, long duration)
{
  dtmf.generate('5', duration);
}

void loop()
{
  int i;
  uint8_t phone_number[] = {5,4,6,8,7,5,5}; // écrire le numéro à composer

  for (i = 0; i < sizeof(phone_number); i ++)
  {
    playDTMF(phone_number[i], 300);
    delay (1000);
  }

  delay(3000);
}

Cela génère uniquement la tonalité du 5 et autant de fois qu'il y a de nombre dans la ligne //écrire le numéro à composer, c'est à dire 7 dans cet exemple

generate() attend des caractères pas des nombres.

void generate(char key, unsigned long duration);

Donc ton tableau doit contenir des caractères.


La fonction playDTMF n'est pas vraiment utile puisqu'elle se contente de recopier les paramètres qu'elle reçoit pour les passer à generate(), autant utiliser directement generate().
#include "dtmfgen.h"

DTMFGenerator dtmf;

void setup()
{
}

void loop()
{
  int i;
  char phone_number[] = { '1', '5', '2', '0', '7'}; // écrire le numéro à composer

  for (i = 0; i < sizeof(phone_number); i ++)
  {
    dtmf.generate(phone_number[i], 300);
  }

  delay(3000);
}

Avec quelques modifications minimes du code tu pourrais aussi utiliser une chaine de caractères au lieu du tableau ce qui simplifierait la saisie des numéros.

Si tu veux faire du DTMF reconnu par un téléphone, il faut penser à faire une pause entre chaque caractère que tu envois.
Je ne sais pas si tu fais bien cette pose?

Il y a bien une pause de 1 s entre chaque note :
delay (1000);

Je viens de tester ce code :

#include "dtmfgen.h"

DTMFGenerator dtmf;

void setup()
{
}

void loop()
{
  int i;
  char phone_number[] = { '1', '5', '2', '0', '7'}; // écrire le numéro à composer

  for (i = 0; i < sizeof(phone_number); i ++)
  {
    dtmf.generate(phone_number[i], 300);
    delay(1000);
  }

  delay(3000);
}

Tout est fonctionnel ! :slight_smile:
Merci à tous,
Christophe

Oui '1' et 1 ce n’est pas la même chose (que ce soit le type ou la valeur sous jacente)

Une seconde me parait du coup un peu long, il faudrait regarder ce que dit la RFC, il me semblait que la moyenne était plus dans les 200 à 300 ms ?
Mais si ça marche parfaitement, pourquoi s'embêter :rofl:

C’est plus court que ça . On trouve généralement une pause d’environ 45 à 75 millisecondes entre deux symboles successifs. Cette pause permet au système récepteur ou au décodeur de distinguer clairement les tons DTMF individuels et d’éviter toute interprétation erronée.

(De mémoire le livre bleu de l’ITU-T Q.23 ou la RFC 4733 doivent donner des spécifications détaillées sur la signalisation DTMF.)

De mémoire la seul indication d'obligation dans les RFC est le temps d'une micro-coupure (20ms je crois mais vraiment pas sûre), tout ce qui est au dessus est considéré comme un "break"

Je viens de regarder ce que l'on utilise par défaut, un digit de 200ms avec un break de 100ms.

Ok… ça faisait longtemps que je n’avais pas lu la spec :wink:

Un google search me dit 40/40 ou 40/20

Oui, je ne sais pas pourquoi mais il y a une différence entre la RFC et ce qu'implémente les fabricants.
C'est compliqué du coup à justifier que tel ou tel fabricant de renons ne respecte pas la RFC :slight_smile:

Bon maintenant avec le numériques les joies de la téléphonie analogique tendent à disparaitre :rofl:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.