Problème avec le Barregraphe

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je suis ce tutoriel: https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/743_gestion-des-entrees-sorties/3423_un-simple-bouton/

J'essaie de faire le barregraphe mais mon circuit ne se comporte pas comme je le voudrais.

Voici une vidéo de mon circuit ainsi que son comportement: https://youtu.be/X7JxwN02-jY

Voici mon programme:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
const int led_1 = 8;
const int led_2 = 11;
const int led_3 = 12;
const int led_4 = 13;
const int bouton_1 = 6;
const int bouton_2 = 3;
int num_led_high = 0;

void setup(){
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
  pinMode(led_3, OUTPUT);
  pinMode(led_4, OUTPUT);
  pinMode(bouton_1, INPUT_PULLUP);
  pinMode(bouton_2, INPUT_PULLUP);
}

void loop(){
  if(digitalRead(bouton_1)==LOW){ 
    num_led_high++;

    if(num_led_high > 4){
      num_led_high = 4;
    }

    if(num_led_high == 1){
      digitalWrite(led_1,HIGH);
    }
    else if(num_led_high == 2){
      digitalWrite(led_2,HIGH);
    }
    else if(num_led_high == 3){
      digitalWrite(led_3,HIGH);
    }
    else if(num_led_high == 4){
      digitalWrite(led_4,HIGH);
    }
  }
  else{
    digitalWrite(led_1,LOW);
  }

  if(digitalRead(bouton_2) == LOW){  
    num_led_high--;

    if(num_led_high < 0){
      num_led_high = 0;
    }

    if(num_led_high == 0){
      digitalWrite(led_1,LOW);
    }
    else if(num_led_high == 1){
      digitalWrite(led_2,LOW);
    }
    else if(num_led_high == 2){
      digitalWrite(led_3,LOW);
    }
    else if(num_led_high == 4){
      digitalWrite(led_4,LOW);
    }
  }
}

En espérant que vous puissiez m'aider,

Cordialement,

sushi

+0 -0

Salut,

J'ai l'impression que ton problème ne vient pas (directement) de ton code : il me semble que ta carte redémarre à chaque appui sur un bouton (la led ON s'éteint puis se rallume). Du coup, si c'est bien ça, la led en pin 13 clignote un peu le temps que la carte relance ton programme (la broche 13 est celle reliée à la led incorporée sur la carte, donc c'est normal que son état puisse varier au démarrage). Ensuite, lorsque ton programme se lance, toutes les sorties sont à 0 donc les 4 leds s'allument ! ;)

Vérifie tes branchements, c'est peut-être un court-circuit car tu n'as pas mis la résistance de 10k pour les boutons j'ai rien dit, tu as mis les pull-ups internes.

EDIT : et ligne 59 je pense que c'est un 3 à la place du 4

+0 -0

Je n'ai pas regardé la vidéo donc je prend le risque de répondre sans tout les éléments

Tu changes tes compteurs sur un état plutôt que sur un changement d'état. Si bien que même si tu penses appuyer vite sur ton bouton tu vas passer plusieurs fois dans chaque conditions le temps de l'appui, donc ton compteur va s'incrémenter super vite et tes leds ne vont pas afficher ce que tu penses être juste.

Tu as bien travaillé cependant. Si tu ne vois pas ce que je veux dire essaie d'aller voir la correction du TP :)

+0 -0

J'ai regardé la correction et j'ai fini par comprendre le problème.

Voici mon programme modifié:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
const int led_1 = 8;
const int led_2 = 11;
const int led_3 = 12;
const int led_4 = 9;
const int bouton_1 = 6;
const int bouton_2 = 3;
int num_led_high = 0;
//NB: Ne pas oublier que le temps d'appuyer sur un bouton
//    Le programme peut boucler plusieurs fois
//    D'où la nécessité de sauvegarder l'état du bouton pour la prochaine boucle
int save_etat_bouton_1 = HIGH;
int save_etat_bouton_2 = HIGH;

void setup(){
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
  pinMode(led_3, OUTPUT);
  pinMode(led_4, OUTPUT);
  pinMode(bouton_1, INPUT_PULLUP);
  pinMode(bouton_2, INPUT_PULLUP);
}

void loop(){
  int etat_bouton_1 = digitalRead(bouton_1);
  int etat_bouton_2 = digitalRead(bouton_2);

  if((etat_bouton_1 == LOW) && (etat_bouton_1 != save_etat_bouton_1)){ 
    num_led_high++;

    if(num_led_high > 4){
      num_led_high = 4;
    }

    if(num_led_high == 1){
      digitalWrite(led_1,HIGH);
    }
    else if(num_led_high == 2){
      digitalWrite(led_2,HIGH);
    }
    else if(num_led_high == 3){
      digitalWrite(led_3,HIGH);
    }
    else if(num_led_high == 4){
      digitalWrite(led_4,HIGH);
    }
  }

  if((etat_bouton_2 == LOW) && (etat_bouton_2 != save_etat_bouton_2)){
    num_led_high--;

    if(num_led_high < 0){
      num_led_high = 0;
    }

    if(num_led_high == 0){
      digitalWrite(led_1,LOW);
    }
    else if(num_led_high == 1){
      digitalWrite(led_2,LOW);
    }
    else if(num_led_high == 2){
      digitalWrite(led_3,LOW);
    }
    else if(num_led_high == 3){
      digitalWrite(led_4,LOW);
    }
  }

  save_etat_bouton_1 = etat_bouton_1;
  save_etat_bouton_2 = etat_bouton_2;
}

J'ai aussi changé le port 13 et je n'ai plus ce problème de LED verte qui s'allume toute seule (merci PG06).

Mais mon circuit se comporte toujours de la même manière, comme l'a remarqué PG06, dès que j'appuie sur l'un des boutons, les LEDs de la carte arduino s'éteignent, ça doit faire court-circuit, mais je ne sais pas où!

Merci pour votre aide!

Essaye de mettre juste un bouton et une led, ou même simplement juste un bouton. Est-ce que ça redémarre toujours ? (parce que visiblement le problème apparait au moment de l'appui…)

EDIT : tu peux aussi essayer de mettre des résistances de pull-up en plus de celles internes pour tester.

+0 -0

C'est bon mon programme marche.

En fait, les boutons n'ont pas besoin d'être alimentés. Quand j'appuie sur le bouton, le circuit se ferme et forcément le 5V est relié à la masse et donc il a court-circuit.

De plus, comme le circuit est simple, je n'ai pas besoin de mettre les filtres.

Voilà la photo de mon circuit qui marche:

barregraphe

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte