[Résolu]Faire sonner un buzzer selon l'état d'une LED

Bonjour,

Voila j'aimerais faire sonner mon buzzer quand ma LED est allumé, et ducoup quand la LED est éteinte le buzzer ne fait rien.

Sauf qu'après plusieurs tentative je n'arrive pas a faire un programme qui fait cela.

J'ai fais un truc du genre:

-je met ma LED à clignoter
-si la LED est allumé, le buzzer sonne
-sinon rien

Voila une des tentative que j'ai fait:

int L1 = 2 ;
int tempoActive = 0 ;
unsigned long tempDepart = 0 ;

void setup()
{
  Serial.begin( 9600 ) ;
  pinMode( 2, OUTPUT ) ;
  tempoActive = millis() ;
}

void loop()
{
  unsigned long tempoActive = millis() ;
  tempDepart = 1 ;
   if ( ( tempoActive - tempDepart ) >= 750 )
    {
      digitalWrite( L1, HIGH ) ;
      tempDepart = millis() ;
    }
    tempoActive = millis() ;
       if ( ( tempoActive - tempDepart ) >= 750 )
    {
      digitalWrite( L1, LOW ) ;
      tempDepart = millis() ;
    }

  if ( L1 = HIGH )
  {
       if ( ( tempoActive - tempDepart ) >= 750 )
    {
      tone( 8, 65535 ) ;
      Serial.println( "it's ok" ) ;
      tempDepart = millis() ;
    }
    tempoActive = millis() ;
  }
  else
  {
    if ( ( tempoActive - tempDepart ) >= 750 )
    {
      noTone( 8 ) ;
      Serial.println( "nope" ) ;
      tempDepart = millis() ;
    }
    tempoActive = millis() ;
  }
}

J'ai aussi essayer de faire le programme avec delay, mais je me suis rendu compte que j'ai besoin que la LED reste à clignoter pendant que le programme dit au buzzer de sonner selon l'état de la LED.

Avez vous des idées pour me mettre sur la bonne voie?

Merci d'avance pour vos réponse. :slight_smile:

Bonjour,

Pourquoi :

tone( 8, 65535 ) ;

Serge .D

La fonction tone est utiliser pour dirt au buzzer quoi faire.

https://www.arduino.cc/en/Reference/Tone

tone(pin,fréquence)

Pour la fréquence de 65535Hz, j'ai mis ça pour être sur d'entrendre le son émis.
Mais je peux aussi utiliser la fonction digitalWrite( buzzer, HIGH ) après avoir "int" mon buzzer

Bonjour,

Je n'ais pas compris ce que tu veux faire.

Tu veux que ta led clignote et que pendant ce clignotement quand la led est allumée ton buzzer fonctionne et quand elle est éteinte le buzzer s’arrête.
En résumé tu veux que le buzzer fasse 'bip bip' en synchronisation avec la led qui clignote?

aligote:
Pourquoi :
tone( 8, 65535 ) ;

C'est fait pour les chiens qui entendent les ultrasons :smiley:

kamill:
Bonjour,

Je n'ais pas compris ce que tu veux faire.

Tu veux que ta led clignote et que pendant ce clignotement quand la led est allumée ton buzzer fonctionne et quand elle est éteinte le buzzer s’arrête.
En résumé tu veux que le buzzer fasse 'bip bip' en synchronisation avec la led qui clignote?

Oui Kamill c'est ça.

Je laisse clignoter ma LED, et pendant ce temps mon programme vérifie l'état de la LED.
Si la LED est allumé le buzzer sonne. Si la LED est éteinte le buzzer ne fait rien.
Un peu comme un témoin sonore pour dire quand la LED est allumé.

kamill:
C'est fait pour les chiens qui entendent les ultrasons :smiley:

Abon? XD
Ba pourtant j'ai fais attention d'utiliser une fréquence audible par l'homme.

L'homme entend les fréquences approximativement de 20Hz à 20kHz, au mieux, quand il est jeune.
Avec l'age la fréquence supérieure diminue.

Ouai je sais, mais pourtant j'entend quand même le son émis par le buzzer.
si si je te jure, et nan nan chui pas fou. :slight_smile:

les 2 plus gros problème du code sont là

int L1 = 2 ;
...
if ( L1 [color=red]=[/color] HIGH )

suggestions:

  • réviser comment on test une égalité versus une affectation de valeur à une variable
  • réviser comment on lit la valeur de l'état d'une PIN
  • donnez des nom cohérents à vos variables, définissez les comme constantes si c'est le cas et donc au lieu de faire
int L1 = 2 ;

faites plutôt (en forçant un peu le trait)

const byte numeroDePinDelaLed1 = 2;
...
  pinMode( numeroDePinDelaLed1, OUTPUT ) ;
...

comme ça quand vous serez tenté d'écrire if ( numeroDePinDelaLed1 = HIGH ) l'incohérence vous sautera aux yeux...

il y a aussi un problème de logique quand vous forcez l'affectation de  tempDepart = 1 ; pour tester juste après

tempoActive = millis() ;
if ( ( tempoActive - tempDepart ) >= 750 )

.. .que pensez vous que ce test donne une fois que les 751 premières millisecondes se soient écoulées?

titutato:
Ouai je sais, mais pourtant j'entend quand même le son émis par le buzzer.
si si je te jure, et nan nan chui pas fou. :slight_smile:

Certainement parce que c'est un buzzer 'actif', qui se commande par une sortie digitale tout ou rien.

tone c'est pour piloter les transducteurs quelque fois appelés buzzer passif (voir aussi buzzer tout court).

titutato:
La fonction tone est utiliser pour dirt au buzzer quoi faire.

https://www.arduino.cc/en/Reference/Tone

tone(pin,fréquence)

Pour la fréquence de 65535Hz, j'ai mis ça pour être sur d'entrendre le son émis.
Mais je peux aussi utiliser la fonction digitalWrite( buzzer, HIGH ) après avoir "int" mon buzzer

????? :frowning:

Concernant le buzzer : (quel modèle au fait ?)

  • Essayer le buzzer seul avec dans loop() { delay(500);tone(pin,fréquence);delay(100);}

Serge .D

Merci pour vos réponse.

J-M-L:
les 2 plus gros problème du code sont là

int L1 = 2 ;

...
if ( L1 = HIGH )




suggestions:

- réviser comment on test une égalité versus une affectation de valeur à une variable
- réviser comment on lit la valeur de l'état d'une PIN
- donnez des nom cohérents à vos variables, définissez les comme constantes si c'est le cas et donc au lieu de faire


int L1 = 2 ;



faites plutôt (en forçant un peu le trait)


const byte numeroDePinDelaLed1 = 2;
...
  pinMode( numeroDePinDelaLed1, OUTPUT ) ;
...



comme ça quand vous serez tenté d'écrire `if ( numeroDePinDelaLed1 = HIGH )` l'incohérence vous sautera aux yeux...


il y a aussi un problème de logique quand vous forcez l'affectation de ` tempDepart = 1 ;` pour tester juste après 


tempoActive = millis() ;
if ( ( tempoActive - tempDepart ) >= 750 )


.. .que pensez vous que ce test donne une fois que les 751 premières millisecondes se soient écoulées?

Pour le if=high c'est une erreur d'inattention. ^^'

pour le reste, je dois avoir en effet quelques problème dans mes fonctions millis(), je vais revoir ça.

aligote:
Concernant le buzzer : (quel modèle au fait ?)

J'utilise un meb-12c-5.
voici la datasheet de la bête:
https://www.opendatasheets.com/datasheet/meb-12c-5-citizen-electronics-19087317.html

Merci pour vos réponse.

Donc c'est un buzzer avec oscillateur intégré qui se commande avec digitalWrite() et non avec tone()

titutato:
Pour le if=high c'est une erreur d'inattention. ^^'

ou plutôt une erreur d'attention :slight_smile: ^^

n'oubliez pas non plus le digitalRead(numeroDePinDelaLed1) associé

kamill:
Donc c'est un buzzer avec oscillateur intégré qui se commande avec digitalWrite() et non avec tone()

Ah d'accord, c'est vrai qu'il sonne mieux avec digitalWrite().

J-M-L:
n'oubliez pas non plus le digitalRead(numeroDePinDelaLed1) associé

Pourquoi un digitalRead? je comprend pas. :confused:
J'ai juste besoin de digitalWrite, non?

Sinon voici ce que j'ai fais:

const byte pinled = 2 ;
int buzzer = 8 ;
int tempoActive = 0 ;
unsigned long tempDepart = 0 ;

void setup()
{
  Serial.begin( 9600 ) ;
  pinMode( pinled, OUTPUT ) ;
  pinMode(buzzer, OUTPUT) ;
  tempoActive = millis() ;
}

void loop()
{
  unsigned long tempoActive = millis() ;
  if ( ( tempoActive - tempDepart ) >= 750 )
  {
    digitalWrite( pinled, HIGH ) ;
    tempDepart = millis() ;
  }
  tempoActive = millis() ;
  if ( ( tempoActive - tempDepart ) >= 750 )
  {
    digitalWrite( pinled, LOW ) ;
    tempDepart = millis() ;
  }
  if ( pinled == HIGH )
  {
    if ( ( tempoActive - tempDepart ) >= 750 )
    {
      digitalWrite( buzzer, HIGH ) ;
      Serial.println( "it's ok" ) ;
      tempDepart = millis() ;
    }
    tempoActive = millis() ;
  }
  else
  {
    if ( ( tempoActive - tempDepart ) >= 750 )
    {
      digitalWrite( buzzer, LOW ) ;
      tempDepart = millis() ;
    }
    tempoActive = millis() ;
  }
}

Ma LED clignote bien, mais mon programme ne rentre pas dans les if ou je dis au buzzer de sonner ou non.

J'ai fais ça:

const byte pinled = 2 ;
int buzzer = 8 ;
int tempoActive = 0 ;
unsigned long tempDepart = 0 ;

void setup()
{
  Serial.begin( 9600 ) ;
  pinMode( pinled, OUTPUT ) ;
  pinMode(buzzer, OUTPUT) ;
  tempoActive = millis() ;
}

void loop()
{
  unsigned long tempoActive = millis() ;
  if ( ( tempoActive - tempDepart ) >= 750 )
  {
    digitalWrite( pinled, HIGH ) ;
    tempDepart = millis() ;
  }
  tempoActive = millis() ;
  if ( ( tempoActive - tempDepart ) >= 750 )
  {
    digitalWrite( pinled, LOW ) ;
    tempDepart = millis() ;
  }
  if ( pinled == HIGH )
  {
      digitalWrite( buzzer, HIGH ) ;
      Serial.println( "it's ok" ) ;
  }
  else
  {
      digitalWrite( buzzer, LOW ) ;
      Serial.println( "nope" ) ;
  }
}

Ma LED clignote bien. Sauf que pour le

  if ( pinled == HIGH )
  {
      digitalWrite( buzzer, HIGH ) ;
      Serial.println( "it's ok" ) ;
  }
  else
  {
      digitalWrite( buzzer, LOW ) ;
      Serial.println( "nope" ) ;
  }

le programme reste dans le else même si la LED change d'état.

Des idées?

Comme J-M-L te l'a dit ce n'est pas if (pinled == HIGH) mais if (digitalRead(pinled) == HIGH)

kamill:
Comme J-M-L te l'a dit ce n'est pas if (pinled == HIGH) mais if (digitalRead(pinled) == HIGH)

Ah oui d'accord... ^^'

Du coup j'ai ça:

const byte pinled = 2 ;
int buzzer = 8 ;
int tempoActive = 0 ;
unsigned long tempDepart = 0 ;

void setup()
{
  Serial.begin( 9600 ) ;
  pinMode( pinled, OUTPUT ) ;
  pinMode(buzzer, OUTPUT) ;
  tempoActive = millis() ;
}

void loop()
{
  unsigned long tempoActive = millis() ;
  if ( ( tempoActive - tempDepart ) >= 750 )
  {
    digitalWrite( pinled, HIGH ) ;
    tempDepart = millis() ;
  }
  tempoActive = millis() ;
  if ( ( tempoActive - tempDepart ) >= 750 )
  {
    digitalWrite( pinled, LOW ) ;
    tempDepart = millis() ;
  }

  if ( digitalRead( pinled ) == HIGH )
  {
    digitalWrite( buzzer, HIGH ) ;
    Serial.println( "it's ok" ) ;
  }
  else
  {
    digitalWrite( buzzer, LOW ) ;
    Serial.println( "nope" ) ;
  }
}

Sauf que maintenant ma LED ne clignote plus mais ma dernière fonction if pour faire sonner le buzzer selon l'état de la LED fonctionne.

Bonjour,

Je fais un petit UP parce que je n'arrive toujours pas à résoudre mon problème. Du coup je me permet de continuer à solliciter votre aide.
Après un certain nombre de tentative je n'y arrive toujours pas.

Voici, mon programme (un de mes test) :

const byte pinled = 2 ;
int buzzer = 8 ;
int tempoActive = 0 ;
unsigned long tempDepart = 0 ;

void setup()
{
  Serial.begin( 9600 ) ;
  pinMode( pinled, OUTPUT ) ;
  pinMode(buzzer, OUTPUT) ;
  tempoActive = millis() ;
}

void loop()
{
  unsigned long tempoActive = millis() ;
  tempDepart = millis() ;
  if ( ( tempoActive - tempDepart ) >= 750 )
  {
    tempoActive = millis() ;
    digitalWrite( pinled, HIGH ) ;
    tempDepart = millis() ;
  }
  if ( ( tempoActive - tempDepart ) >= 750 )
  {
    digitalWrite( pinled, LOW ) ;
  }
  if ( digitalRead( pinled ) == HIGH )
  {
    digitalWrite( buzzer, HIGH ) ;
    Serial.println( "it's ok" ) ;
  }
  else
  {
    digitalWrite( buzzer, LOW ) ;
    Serial.println( "nope" ) ;
  }
}

Je n'arrive pas à faire clignoter ma LED, soit elle reste éteinte (ce qui est le cas pour ce programme), soit elle reste allumer. Il me reste plus que ça à régler.

S'il vous plait, pouvez vous m'aider.

Merci.

Dans la loop vous faitesunsigned long tempoActive = millis() ;

==> pourquoi recréez (re-définissez) vous cette variable globale en local ? elle va "cacher" la globale au sein de la loop (lire des infos sur la portée/visibilité des variables - scope en anglais)

De plus il ne faut pas utiliser un int pour millis()

Dans votre code de la loop tempoActive - tempDepart vaudra toujours 0 (ou 1 au pire), lisez les 2 lignes d'initialisations juste au dessus du test