vitesse de bip sonore non régulier

bonjour, voila j'ai créé un programme qui me permet d'augmenter mais aussi de diminuer un bip sonore sortant d'un haut parleur, mais quand j'appuie sur le boutton fait pour augmenter la fréquence , au lieu de monter de 30 en 30 et augmente d'un coup meme en diminuant c est pareil. voila j espere que vous pouver m aider merci.
voila le programmes :

const int buttonPin = 2;
int D = 100 ;

void setup() {
Serial.begin(9600);
pinMode(10,OUTPUT);//initialise la broche 10
pinMode(8, INPUT);
pinMode(9,INPUT);
}
void loop(){
Serial.println(D);
Envoie();
int Pin8 = 0;
int Pin9 = 0;
Pin8 = digitalRead(8);
Pin9 = digitalRead(9);
Serial.println(Pin8);
Serial.println(Pin9);

if(D<100)
D = 100;
else
D = D;

if(Pin8 == 1)
D += 30;
else if(Pin9 == 1)
D -= 30;
else
D = D;

}

int Envoie(){

digitalWrite(10, HIGH);
delay(D);
digitalWrite(10, LOW);
delay(D);

}

Bonjour,
Pour une meilleure visibilité, il faut mettre le code endre balises.
Il est normal qu'il y ai quelques problèmes de fonctionnement puisque tu ne traites pas les rebonds de tes boutons de commande.
Fait une recherche sur le forum ou bien sur le net avec debounce.
Tu as également la fonction tone() qui te permet de générer des sons (http://arduino.cc/en/Reference/Tone)
@+

Pense à mètre des côtes code, ci dessus, autour de ton code, ça rend le code plus lisible. ( ça évite les 8) en plein milieu du code aussi xD )

Pour ton soucis, à mon avis, le programme va bien plus vite que toi et le temps que tu appuis sur le bouton le programme à fait 15 tour et si tu veux dimminuer tu tombe vite en buté et si tu monte tu passe vite à beaucoup plus qu'une augmentation de 30 !

Pour être propre, on utilise un flag de relâchement, je m’explique, c'est tout simple :

( cote code ! )

// dans ton setup a déclarer :  
int flag_relachement_1 = 0;
int flag_relachement_2 = 0;

void loop(){
 Serial.println(D); 
  Envoie();
 int Pin8 = 0;// à déclarer dans le setup et pas dans le loop
 int Pin9 = 0;
Pin8 = digitalRead(8);
Pin9 = digitalRead(9);
Serial.println(Pin8);
Serial.println(Pin9);

   if(D<100) 
    D = 100;
   else
    D = D;
 
   if(Pin8 == 1 && flag_relachement_1 ==0){// ajout de la condition pour qu'un seul appui sois pris en compte
    D += 30; 
    // ajout du flag indiquant qu'on a pris en compte l'appui une fois 
     flag_relachement_1 = 1;
   }
  else if(Pin9 == 1 && flag_relachement_2 ==0) {// ajout de la condition pour qu'un seul appui sois pris en compte
    D -= 30; 
    // ajout du flag indiquant qu'on a pris en compte l'appui une fois 
    flag_relachement_2 = 1; 
    }
  else  {
   D = D;
   }

   if (Pin8 == 0)// si on vois que le bouton a été relâché alors on remet le flag à 0 pour le prochaine appuie 
    flag_relachement_1 = 0;

   if (Pin9 == 0)// si on vois que le bouton a été relâché alors on remet le flag à 0 pour le prochaine appuie 
    flag_relachement_2 = 0;
}

avec ces deux petit flag tu va compter uniquement un appui peut importe le temps que tu reste appuyé, je pense pas que le reste sois super bien organisé mais je pense que le plus gros problème était la, je te laisse te charger du reste :slight_smile:

Skizo !

bonjours. j ai fais de se que vous avez fais mais sa change rien a mon probleme

Mets ton code entre les balises dans ton premier message.

nicoleportos:
bonjours. j ai fais de se que vous avez fais mais sa change rien a mon probleme

Ton problème c'est bien ce qu'a expliqué skizoh.
Mais sa manière de le gérer n'est peut être pas complètement bonne. Il manque une manière de temporisation dans le système. Les rebonds peuvent se produire sur plusieurs millisecondes et la boucle loop se déroule quand même assez rapidement.
Dans la mesure ou tu veux faire des sons on ne peut pas mettre un delay() mais tu peux gérer ce temps soit avec l'instruction millis() mais c'est peut être un peu complexe pour un début. L'autre solution serait de décrémenter une variable à chaque passage dans la boucle lorsque flag_relachement_1 est levé.
Grossièrement:

  • lorsque tu mets flag_relachement_1 = 1 tu initialises une variable à une valeur à déterminer (tu mets 100 pour commencer par exemple et tu l'ajustera au besoin)
  • par la suite dans loop si flag_relachement_1 = 1 et que la variable est différente de 0 tu la décrémentes et tu ne t'occupes pas de l'état du bouton
  • une fois la variable arrivée à 0, tu mets flag_relachement_1 =0 et tu recommences à tester l'état du bouton.

Je te laisse un peu chercher.

oui bien vue, ce qui donne 100 tours de loop à 0 pour être sur que ce n'était pas un rebond, j'aurais plutôt pris 20 voir moins mais bon ça devrais marcher même si deux appuies très rapproché ne serons pas pris en compte :s

Et si tu pouvais mieux expliquer le dysfonctionnement que :

"bonjours. j ai fais de se que vous avez fais mais sa change rien a mon probleme"

c'est un peut léger, il nous faut des symptômes nous !

Skizo !

j ai fait comme vous me l avez dit mais quand j appuie sur le bouton poussoir qui permet de augmenter la fréquence mais au lieux que sa augmente de 30 normalement sa monte d ' un et sa se stabilise vers les 370

bonjour je voulais vous demander si vous avez un programme anti rebond pour les 2 boutons poussoir sil vous plait merci

J'ai fais exactement le même projet que toi l'année passée en terminale STi2D SIN, je peux te transferer tout mon dossier par mail si tu veux ..

oui s il vous plait vous pouvez me l'envoyer merci beaucoup