Go Down

Topic: Boutons poussoirs qui marchent bizzarement (Read 297 times) previous topic - next topic

leg2027

Bonjour,
Je veux faire que quand un bouton est appuyé les minutes augmentent de +1 et pareil avec les heures.
Mais le problème c'est que pour faire augmenter les heures et les minutes quand on appuie normalement sur le bouton du réglage des minutes ça ne fait rien, mais si on réappuie sur le bouton du réglage des heures, les heures et les minutes augmentent de plus un (ça ne marche pas du tout en vice-versa).
Mon explication n'est pas très claire, je suis désolé, mais c'est assez difficile.

J'ai trouvé l'astuce pour que quand le bouton est appuyé ça ne fait augmenter que d'un "minutesM" ou "heuresM" dans le topic: https://forum.arduino.cc/index.php?topic=137811.0

Voici mon code:
Code: [Select]

int boutonMinute=5;
int boutonHeure=3;
int heuresM;
int minutesM;

void setup() {
 int heuresM=0;
 int minutesM=0;

 pinMode(boutonHeure, INPUT_PULLUP);
 pinMode(boutonMinute, INPUT_PULLUP);
 
 Serial.begin(9600);
}

void loop() {
   if (digitalRead(boutonMinute)==LOW) {
  if (minutesM<32767) minutesM++;
  while((digitalRead(boutonMinute)==LOW));
 }

if (digitalRead(boutonHeure) ==LOW){
if (heuresM<32767) heuresM++;
while((digitalRead(boutonHeure)==LOW));
}

}


Je ne comprends pas pourquoi ça fait ça

kamill

Bonjour,

Comment tu sais que les minutes n'augmentent pas ?

lesept

#2
Nov 22, 2019, 10:54 pm Last Edit: Nov 22, 2019, 11:03 pm by lesept
Tu peux avoir un phénomène de rebond sur tes boutons, qui fait que tu crois appuyer une seule fois mais le microcontrôleur détecte plusieurs appuis. Pour éviter ça, le plus simple est d'ajouter un delay après la lecture du bouton.

Voici comment j'écrirais ton code :
Code: [Select]

const int boutonMinute = 5;
const int boutonHeure = 3;
unsigned int heuresM = 0;
unsigned int minutesM = 0;

void setup() {
  pinMode(boutonHeure, INPUT_PULLUP);
  pinMode(boutonMinute, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  bool appuiMinute = digitalRead(boutonMinute);
  bool appuiHeure = digitalRead(boutonHeure);
  delay (15);

  if (appuiMinute == LOW) {
    if (minutesM < 65535) minutesM++;
    Serial.print ("Minutes = ");
    Serial.println(minutesM);
  }

  if (appuiHeure == LOW) {
    if (heuresM < 65535) heuresM++;
    Serial.print ("Heures = ");
    Serial.println(heuresM);
  }
}
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

savoriano

Je pense à un problème de câblage, surtout au niveau du bouton de réglage heure, ou le bouton heure est un normalement fermé.
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

kamill

Moi, je pense surtout que le programme posté n'est pas le programme qui pose problème puisqu'il n'y a aucun affichage permettant de se rendre compte qu'il y a ou non un problème.

leg2027

Les boutons et le montage marchent normalement je crois, quand je met juste un bouton pour faire augmenter les minutes il marche parfaitement.
Pour la fonction delay je ne peux pas l'utiliser car c'est pour une minuterie, ça ferait un temps de rertard je pense.

savoriano

#6
Nov 23, 2019, 02:55 pm Last Edit: Nov 23, 2019, 02:59 pm by savoriano
Quote
Les boutons et le montage marchent normalement je crois, quand je met juste un bouton pour faire augmenter les minutes il marche parfaitement.
Ca peux confirmer un problème du bouton heures qu'il est normalement fermé et qu'il bloque ton code dans
Code: [Select]
while((digitalRead(boutonHeure)==LOW));
Quant tu appuis sur le bouton "heure" il sort de cette bouche et il marche normalement.
Quand tu le relâche il se re-bloque.


Kamil à demandé (justement) le code complet. Pourquoi tu ne le poste pas?
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

leg2027

#7
Nov 23, 2019, 03:47 pm Last Edit: Nov 23, 2019, 03:48 pm by leg2027
Oui j'ai aussi testé le bouton des heures tout seul il marche à la perfection.
Je crois pas qu'il y a besoin du code entier(mais je le met quand même) car avec celui que j'ai mis dans mon topic je l'ai testé et les effets sont les mêmes. Le code entier n'est pas fini et tout ne signifie pas quelque chose.



Code: [Select]

#define DHT11PIN 2

#include <dht11.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10,11,12);
dht11 DHT11;
int aaa=0;
int bb;
int heuresM;
int minutesM;
int minutes;
int heures;
int boutonAppel=5;
int boutonMinuteur=3;
unsigned long Depart;
unsigned long depart;

void setup() {
 
 Serial.begin(9600);
 minutes=57 ;
 heures=22;
 bb=0;

 lcd.begin(16, 2);

 lcd.setCursor(3, 0);
 lcd.print(":");

uint8_t chk = DHT11.read(DHT11PIN);
  lcd.setCursor(7, 0);
  lcd.print(DHT11.temperature, DEC);

  lcd.setCursor(9, 0);
  lcd.print("C");

  lcd.setCursor(11, 0);
  lcd.print(DHT11.humidity, DEC);
  lcd.print("%");


 
 Depart=millis();

}

void loop() {


  if((millis()-Depart)>=60000) {
    
    minutes=minutes+1;
      uint8_t chk = DHT11.read(DHT11PIN);
  lcd.setCursor(7, 0);
  lcd.print(DHT11.temperature, DEC);

  lcd.setCursor(9, 0);
  lcd.print("C");

  lcd.setCursor(11, 0);
  lcd.print(DHT11.humidity, DEC);
  lcd.print("%");
    
   Depart=millis();
  }
  


  

  if (minutes <=9) {
    lcd.setCursor(4, 0);
    lcd.print("0");
    lcd.setCursor(5, 0);
    lcd.print(minutes);

  
  }
   else  {
    lcd.setCursor(4,0);
    lcd.print(minutes);
   }
  
  if (heures <=9) {
    lcd.setCursor(1, 0);
    lcd.print("0");
    lcd.setCursor(2, 0);
    lcd.print(heures);
  }

  else {
    lcd.setCursor(1,0);
    lcd.print(heures);
  }




  if (minutes ==60) {
    minutes=0;
    heures=heures+1;
  }

  if (heures==24){
    heures=0;
    
}


if (minutesM ==60) {
    minutesM=0;
    heuresM=heuresM+1;
    minutesM=0;
  }

  if (heuresM==24){
    heuresM=0;
    minutesM=0;
  }
 
 
 if (minutesM <=9) {
    lcd.setCursor(3, 1);
    lcd.print("0");
    lcd.setCursor(4, 1);
    lcd.print(minutesM);

  
  }
   else  {
    lcd.setCursor(3,1);
    lcd.print(minutesM);
   }
  
  if (heuresM <=9) {
    lcd.setCursor(0, 1);
    lcd.print("0");
    lcd.setCursor(1, 1);
    lcd.print(heuresM);
  }

  else {
    lcd.setCursor(0,1);
    lcd.print(heuresM);
  }

 
 if (digitalRead(3)==LOW) {
  if (minutesM<1000) minutesM++;
  while((digitalRead(3)==LOW));
 }
 
 

Serial.println(digitalRead(boutonAppel));

if (digitalRead(boutonAppel) ==LOW){
if (heuresM<32767) heuresM++;
while((digitalRead(boutonAppel)==LOW));
}
}

lesept

Si, ça sert. Comme ça je peux te dire que le delay (15) n'aura aucun impact.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

savoriano

#9
Nov 23, 2019, 04:50 pm Last Edit: Nov 23, 2019, 06:57 pm by savoriano
Code: [Select]
Serial.println(digitalRead(boutonAppel));
Que est ce que tu vois dans le monitor?

Quote
Oui j'ai aussi testé le bouton des heures tout seul il marche à la perfection.
Ne ne détruit pas ma théorie.

modifie la dernière partie comme çà
Code: [Select]

  if (digitalRead(3)==LOW) {
    if (minutesM<1000) minutesM++;
    Serial.println("Bouton minutes LOW");
    while((digitalRead(3)==LOW));
    Serial.println("Bouton minutes HIGH");
    Serial.print("Minutes: ");
    Serial.println(minutesM);
  }
  if (digitalRead(boutonAppel) ==LOW){
    if (heuresM<32767) heuresM++;
    Serial.println("Bouton heures LOW");
    while((digitalRead(boutonAppel)==LOW));
    Serial.println("Bouton heures HIGH");
    Serial.print("Heures: ");
    Serial.println(heuresM);
  }


Si ma théorie est fausse tu dois avoir les heures et minutes affiché dans le monitor.
Si ce n'ai pas le cas poste le contenu du monitor

P.S.
Je viens de voir que dans ton code il n'y a pas
 pinMode(boutonAppel, INPUT_PULLUP);
 pinMode(3, INPUT_PULLUP);
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

kamill

Je crois pas qu'il y a besoin du code entier(mais je le met quand même) car avec celui que j'ai mis dans mon topic je l'ai testé et les effets sont les mêmes.
Bien sur que ça sert de poster le code entier.
Dans ton code initial les boutons sont en INPUT_PULLUP et dans ton code entier ils ne le sont pas -> donc ça fait n'importe quoi.

Comment tu as testé le code dans ton message initial et trouvé qu'il ne fonctionne pas sans aucun affichage?

leg2027

Rien ne marche mieux malheureusement :smiley-cry: .
Je ne crois pas qu'il y a besoin de INPUT_PULLUP  car je les mises dans mon circuit.
J'avais mis le moniteur série en marche, mais je ne pensais qu'il n'y avait pas besoin de le mettre dans mon topic



Voila ce qui se passe dans le moniteur série quand j'appuie sur les boutons:

bouton des heures appuyé: rien ne se passe
bouton des heures appuyé: rien ne se passe
bouton des minutes appuyé: dans le moniteur série:    Bouton minutes HIGH
                                                                                Bouton heures LOW
bouton des minutes appuyé: rien ne se passe
bouton des minutes appuyé: rien ne se passe
bouton des heures appuyé: Bouton heures HIGH
                                        Heures: 19
                                        Minutes: 1
                                        Bouton minutes LOW
bouton des heures appuyé: rien ne se passe
bouton des minutes appuyé: Bouton minutes HIGH
                                          Bouton heures LOW
bouton des minutes appuyé: rien ne se passe
bouton des heures appuyé:   Bouton heures HIGH
                                          Heures: 20
                                          Minutes: 2
                                          Bouton minutes LOW




Moniteur série des boutons ci dessus:
Code: [Select]
Bouton minutes LOW
Bouton minutes HIGH
Bouton heures LOW
Bouton heures HIGH
Heures: 19
Minutes: 1
Bouton minutes LOW
Bouton minutes HIGH
Bouton heures LOW
Bouton heures HIGH
Heures: 20
Minutes: 2
Bouton minutes LOW



Avec ce code:
Code: [Select]
int boutonAppel=5;
int minutesM=00;
int heuresM=18;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

}

void loop() {
 
  if (digitalRead(3)==LOW) {
    if (minutesM<1000) minutesM++;
    Serial.println("Bouton minutes LOW");
    while((digitalRead(3)==LOW));
    Serial.println("Bouton minutes HIGH");
  }
  if (digitalRead(boutonAppel) ==LOW){
    if (heuresM<32767) heuresM++;
    Serial.println("Bouton heures LOW");
    while((digitalRead(boutonAppel)==LOW));
    Serial.println("Bouton heures HIGH");
  }
 
  Serial.print("Heures: ");
  Serial.println(heuresM);
  Serial.print("Minutes: ");
  Serial.println(minutesM);
}

lesept

Précise les connexions des boutons STP
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

68tjs

Un schéma ne serait pas superflu : un bon dessin vaut mieux qu'un long discours.

savoriano

T'as des boutons avec contact normalement fermé car dans le monitor commence avec minutes LOW  tu appuis sur le bouton et passe a HIGH.
Après il se bloque sur le while des heures etc. etc.
Pardonnez moi pour mon français, ce n'ai pas ma langue maternelle.

Go Up