exercice : envoyer une info a une led grâce a un comptage

Bonjour à tous,

Je suis en train d'effectuer un petit exercice ou je pèche. Je suis en train de vouloir, à l'aide de deux boutons poussoir, faire une sorte de comptage avec l'un des boutons, et exécuter avec le second bouton, une led qui clignotera le nombre de fois que j'ai appuyé sur le premier bouton.
Exemple : J'appuie 5 fois sur le premier bouton, le moniteur série sera connecter pour me donner cette information. Ensuite j'actionne une fois le second bouton qui fera clignoter ma led 5 fois.

Pour coder le comptage, je n'ai pas de problème, j'ai tout simplement créé une variable que j'appelle à +1 quand j'actionne le bouton.

Mon problème, c'est lorsque j'appuie sur le second. J'ai creusé la chose mais je n'ai aucune idée de savoir comment lui faire comprendre de faire clignoter la led le nombre de fois demandé.

Je vous remercie d'avance pour votre aide.

je pense qu'il suffit de faire une boucle qui s'exécute le nombre de fois de la variable que tu as incrémenté avec l'autre bouton.

Voir les liens ci dessous sur le site arduino.

Boucle for

boucle for français

boucle while

Postez votre code.

Est-ce que le premier bouton doit rester actif pendant que la LED clignote?

Si oui c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Si non effectivement une simple itération pour ramener votre variable à 0 en clignotant suffira (regardez l’esemple ‘Blink’ ou ‘blink without delay’ pour le clignotement)

PS: on n’envoie pas une info à une led - une led n’a aucune intelligence, on ne peut pas lui dire « peux tu clignoter 7 fois »… on la soumet à une différence de potentiel suffisante entre son anode et sa cathode quand on veut l’allumer et bien sûr on s’assure d’avoir une résistance de limitation de courant en série avec la diode (obligatoire sinon vous allez griller la diode et peut être la pin de votre arduino !!)

Voici ce que j’ai fais, depuis que j’ai ajouté le bouton 2, ca ne compte plus (cela s’arrete à 3…)et lorsque j’appuie sur mon bouton 2, ma led clignote 2 fois…va savoir pourquoi. Merci de votre aide.

int bouton1 = 3;
int bouton2 = 4;
int LED = 8;
 
int comptage = 0, ETATBP1, Memoire = LOW;
int ETATBP2;
 
 
void setup() {
 
  Serial.begin(9600);
 
  pinMode (bouton1, INPUT_PULLUP);
  pinMode (bouton2, INPUT_PULLUP);
  pinMode (LED, OUTPUT);
 
}
 
void loop() {
 
 
 
  ETATBP1 = digitalRead(bouton1);
 
  if ((ETATBP1 != Memoire) && (ETATBP1 = HIGH))
  {
    comptage++; // depuis que j'ai rédigé la fonction boutonled, ca ne compte plus
 
    Serial.println(comptage);
    delay(500);
  }
  Memoire = ETATBP1;
  boutonled();
}
 
void boutonled() {
 
  int BP2_ACTIVE = 0;
 
  ETATBP2 = digitalRead(bouton2); // quand j'appuie sur le bouton 2, la led clignote deux fois......pourquoi??
 
 
  /*JE NE COMPRENDS PAS COMMENT APPELER MA VARIABLE AVEC UN FOR*/
 
  for (comptage = 0; comptage <= Memoire; comptage ++) {
    if (ETATBP2 == BP2_ACTIVE) {
 
      /************************************************************/
 
      digitalWrite (LED, HIGH);
      delay(500);
      digitalWrite (LED, LOW);
      delay(500);
    }
  }
}

Commencez par vérifier ce genre de petit «détail »

if ((ETATBP1 != Memoire) && (ETATBP1 [color=red][b]=[/b][/color] HIGH))

Avez vous besoin d’une Affectation ou d’un test d’égalité ?

delay(500); c’est beaucoup pour faire du debounce et c’est visible au niveau réactivité du bouton, 15 ou 20 sont généralement suffisants si vous prenez cette approche

Tout d’abord, merci J-M-L pour votre réponse et votre aide.

En revanche, si je change mon delay à 15 ou 20, “mon doigt” n’est pas assez rapide pour être retiré du premier bouton. Donc le résultat est qu’il va m’afficher “25 valeurs” en même temps.

Pour le petit “détail”, j’ai voulais dire que si l’etat de mon bouton 1 (donc la variable) est différent de la mémoire et que l’état de mon bouton est à 1 (en gros j’appuie sur le bouton 1) alors ca compte.

Je ne comprends pas l’affectation et le test d’égalité? Qu’entendez-vous par cela?

Je souhaite un comptage avec un bouton et allumé une led avec le nombre de comptage.

MERCI

En revanche, si je change mon delay à 15 ou 20, "mon doigt" n'est pas assez rapide pour être retiré du premier bouton. Donc le résultat est qu'il va m'afficher "25 valeurs" en même temps.

exactement :slight_smile:
--> donc ce n'est pas la bonne approche d'avoir un délai fixe... il faut tester l'appui et le relâchement du bouton avant de comptabiliser un nouveau click (vous n'avez fait que reporter le problème, si je tiens le doigt sur le bouton plus d'une demi seconde vous comptez)

Je ne comprends pas l'affectation et le test d'égalité? Qu'entendez-vous par cela?

en programmation comment écrivez vous "je veux donner la valeur 17 à la variable x?" (on appelle ça une affectation) et comment écrivez vous "je veux tester si la variable x vaut 17" (on appelle cela un test d'égalité) ?

Donc si ce n’est pas la bonne approche, j’en déduis que tout mon programme est à refaire…

Si je donne la valeur 17 à une variable j’écrirais comme suit : x == 17;

Pour savoir si x vaut 17, j’utiliserai un if : if x = 17.

C’est bon j’ai trouvé la soluce. Mon for n’était pas bon, et je dois mettre mon if avant mon for.

int bouton1 = 3;
int bouton2 = 4;
int LED = 8;
 
int comptage = 0, ETATBP1, Memoire = LOW;
int ETATBP2;
 
 
void setup() {
 
  Serial.begin(9600);
 
  pinMode (bouton1, INPUT_PULLUP);
  pinMode (bouton2, INPUT_PULLUP);
  pinMode (LED, OUTPUT);
 
}
 
void loop() {
 
 
 
  ETATBP1 = digitalRead(bouton1);
 
  if ((ETATBP1 != Memoire) && (ETATBP1 = HIGH))
  {
    comptage++; 
 
    Serial.println(comptage);
    delay(200);


  }
  Memoire = ETATBP1;
        boutonled();
 }
 
void boutonled() {
 
  int BP2_ACTIVE = 0;
  int i;
 
  ETATBP2 = digitalRead(bouton2); 
 
 
  if (ETATBP2 == BP2_ACTIVE) {
    
  for (i= 0; i <= comptage; i++) {
   
 
  
 
      digitalWrite (LED, HIGH);
      delay(500);
      digitalWrite (LED, LOW);
      delay(500);
    }
  }
}

gael44800:
Si je donne la valeur 17 à une variable j'écrirais comme suit : x == 17;
Pour savoir si x vaut 17, j'utiliserai un if : if x = 17.

euh... faut réviser là....

donc....

  if ((ETATBP1 != Memoire) && (ETATBP1 [color=red]=[/color] HIGH)) pas glop

La je ne comprends pas ce que tu veux me dire? Le comptage fonctionne, je ne vois pas le probleme du =.

gael44800:
La je ne comprends pas ce que tu veux me dire? Le comptage fonctionne, je ne vois pas le probleme du =.

ETATBP1 [color=red]= [/color]HIGH ça AFFECTE HIGH à la variable ETATBP1 (la variable vaudra HIGH ensuite)

pour faire un test on utilise ==

si vous pensez que votre code fonctionne, c'est qu'il est tombé en marche par accident :slight_smile:

Je l'ai testé plusieurs fois et je vous assure qu'il marche. Essayez le, maintenant je ne suis pas la pour contredire car je débute dans ce monde, mais ca fait ce que je lui demande.

P-S : je viens d'essayer avec == et cela ne change rien.

gael44800:
P-S : je viens d'essayer avec == et cela ne change rien.

oui c'est ce que je dis - vous avez de la chance :slight_smile:

le code est tellement mal indenté que c'est illisible - la flemme.. appuyez sur ctrl-T dans l'IDE pour aligner tout cela et re-postez...

En tout cas merci JML pour toutes ses leçons et j'ai regardé ton tuto, je vais m'y pencher. En revanche, j'ai une dernière question :

Je souhaite rajouter deux boutons poussoirs dans mon exercice : Le premier serait aussi un comptage et le deuxiéme confirmerai aussi ce comptage sauf qui serait pour controler le temps de clignotement de la led.
Exemple : j'appuie 5 fois sur le premier bouton, et quand j'appuie sur le second bouton, la led clignote toutes les 5secondes.

Des idées?

En vous remerciant