Tone() noTone() - Stop tone ?

Bonjour,

J'ai un code qui fait un son à partir d'un buzzer :

const int buzzer = 8 ;
int frequence = 1000 ;

void setup() {
  Serial.begin (9600);
  
}
void loop() {
  tone (8, frequence, 250);
  delay (2000);
  noTone (8);
   }

Souci : le son s'arrête mais bah il recommence.
Comment le faire arrêter une fois qu'il a démarré ?

Merci
PS : à ceux qui m'ont répondu sur un autre topic, j'espère que c'est clair :slight_smile:

Rebonsoir guipru :wink:

Si c'est dans loop(), sans autre condition, ça se répète perpétuellement.
Si ça doit être joué qu'une fois, au départ du programme, tes pas de programme doivent se trouvés en fin de setup().

Jettes un œil ici.

Cordialement
jpbbricole

C'est normal, loop() comme son nom l'indique s'exécute en boucle infinie.
Qu'est-ce que tu veux faire exactement?

Merci pour les réponses

ok pour le loop j'ai compris.

Ce que je veux faire est compléter le code suivant :

int fsrPinhaut = 0;
int fsrPinbas = 1;     // the FSR and 10K pulldown are connected to a0
int fsrReadinghaut;
int fsrReadingbas ;  
int PIR1 = 8;
int PIR2 = 4;
int FSRhaut = A0;
int FSRbas = A1;
int FSRReadinghaut;
int FSRReadingbas;
//wbbywyyyy
void setup()
{
  pinMode(PIR1, INPUT);
  pinMode(PIR2, INPUT);
  Keyboard.begin();
  randomSeed(analogRead(0));
  Serial.begin(9600);
  
}
void loop()
{
  fsrReadinghaut = analogRead(fsrPinhaut);  
  fsrReadingbas = analogRead(fsrPinbas);  
  Serial.print(fsrReadingbas); 
//
  if (digitalRead(PIR1) == HIGH)
    {
    Keyboard.press("q"); // ici j'aimerais ajouter un son tone (8, frequence, 1000);
    Keyboard.ReleaseAll();
  }
    if (digitalRead(PIR2) == HIGH)
    {
    Keyboard.print("b");
    Keyboard.end() ;  // ici j'aimerais ajouter un son  tone (8, frequence, 250);
    delay(2000);
    }

Il permet "d'écrire une lettre comme un clavier" lorsqu'un détecteur de mouvement s'active.

Je voudrais ajouter un son qui dure 250 ms (deux sons : un différent pour chaque lettre / détecteur de mouvement).

merci

Dans ce cas il faut jouer le son que tu veux au même moment que tu envoi ta touche.
Tu mémorise dans une variable(ex T1) le temps qu'il est lorsque tu lance le son avec la fonction millis()
et en début de ta fonction loop tu test millis te renvois T1 + 250, pour exécuter ton "notone"
Je ne sais pas si je suis assez claire :slight_smile:

oui merci.
et donc mon son ne sera déclenché qu'à l'appui du keyboard pendant 250 ms ?
ce serait exactement ça !

Le troisième argument de tone() spécifie la durée du son donc il s'arrêtera de lui-même.
Le problème de @guipru c'est que si le PIR reste actif le son recommence.
Il suffit de tester une transition sur le signal qui déclenche au lieu de tester son état et ainsi le son n'est produit qu'une fois. Voir ici par exemple

fdufnews, non le PIR ne sera plus actif (on peut finalement remplacer le code par un if keyboard.press ("k") --> tone() ?).

Et d'ailleurs dans mon code le son se répète malgré l'absence de PIR activé et la précision du temps :
tone (8, frequence, 250);

Est ce que le fait d'avoir brancher le buzzer sur une entrée digitale vs analogique change quelque chose ?

Bonjour,

Tu as deux détecteurs de mouvement dont un est sur la pin 8 :

Il faudra donc changer de pin pour le buzzer ...

Il me semble que la syntaxe est différente :

Keyboard.releaseAll();

tone(pin, frequency, duration)

duration : la durée de la tonalité en millisecondes (facultatif). Types de données autorisés : unsigned long .

Enfin ton Buzzer doit être déclaré en sortie

Bonne journée.

Et bien non, si tu es là c'est bien que le PIR est actif. Il suffit donc de mettre l'appel à note() ici.

Il y a longtemps que j'ai cessé de croire aux miracles. Si le note() est bien dans le if alors c'est que l'entrée est vue HIGH.
Tu es certain que tes PIR ne sortent pas en collecteur ouvert par exemple?
Ou que la temporisation sur la sortie du PIR n'est pas réglée sur plusieurs secondes?

Oui, je n'ai pas regardé le code en détail, je n'ai répondu que à la question de temporisation.
Du coup tone est bloquant ou il y a une interruption de programmer pour l'arrêter?
PS: j'avoue j'ai la flemme d'aller regarder le code de tone :frowning:

Cette fonction est non bloquante, ce qui signifie que même si vous fournissez le paramètre duration, l'exécution de l'esquisse se poursuivra immédiatement même si la tonalité n'a pas fini de jouer.

1 Like

Je reviens, je n'avais pas fini :wink:

si tu écris dans ton setup() :

pinMode(A1,OUTPUT);
tone (A1, 1000, 1000);

ça donnera la même chose que ça :

pinMode(8,OUTPUT);
tone (8, 1000, 1000)

Salut !

J'ai réussi lol
C'était aussi simple que ça :rofl:
J'y ai passé 3h :triumph:



int faireunson;

void setup(){
 Serial.begin(9600);   


 tone (3, 262, 500);
 
}
void loop(){

faireunson ;

}

Si le seul but était de générer un son sur un buzzer alors oui :joy:

Il me semblait qu’en fait tu voulais générer un son au moment où un mouvement est détecté. Dans ce cas @fdufnews t’a bien orienté vers la solution :wink:
Bonne soirée

oui ce n'est pas totalement fini, juste cette étape !

comme le but du topic était de faire stopper ce son et que c'est le cas, peut on mettre résolu ?

Ta variable :

faireunson

C’est pour faire le buzz ?

oui tu as raison c'est débile mon truc....
J'ai fait un son.
Il faut que je trouve un moyen de refaire ce son avec une variable dans la loop.
Je pars vraiment de loin comme vous pouvez le constater !

Explique clairement quel doit être ton programme :

Doit-il gérer des détecteurs de mouvement ... ?

ok
le son n'est pas déclencheur il est la conséquence de quelque chose.

Donc j'en reviens à ce code et ce que je voudrais me semble précis :

  if (digitalRead(PIR1) == HIGH)
    {
    Keyboard.press("q"); 
    delay (250); 
// ici j'aimerais ajouter un son tone (8, frequence, 1000);
    Keyboard.ReleaseAll();
  }
    if (digitalRead(PIR2) == HIGH)
    {
    Keyboard.print("b");
    Keyboard.end() ;
    delay (250); 
 // ici j'aimerais ajouter un son  tone (8, frequence, 250);
    delay(2000);
    }

Je vois pas comment expliquer mieux, mais dis moi...