Boutons poussoirs qui marchent bizzarement

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:

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

Bonjour,

Comment tu sais que les minutes n'augmentent pas ?

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 :

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);
  }
}

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é.

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.

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.

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

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?

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.

#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));
}
}

Si, ça sert. Comme ça je peux te dire que le delay (15) n'aura aucun impact.

Serial.println(digitalRead(boutonAppel));

Que est ce que tu vois dans le monitor?

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 çà

  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);

leg2027:
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?

Rien ne marche mieux malheureusement :sob: .
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:

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:

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);
}

Précise les connexions des boutons STP

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

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.

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.

Que faire alors ?

Il y a normalement le shéma des boutons poussoirs

Annotation 2019-11-24 115313.png

Ok, ce n'ai pas un prb de bouton mais ton schéma ne s'adapte pas à ton code.

utilise ce schéma.

Ou change le LOW par des HIGH et les HIGH par des LOW. Ca devrais marcher. (j’aurais du y penser avant!)

Si tu utilises le schéma de Savoriano, il faut déclarer les boutons en INPUT_PULLUP

pinMode (3,INPUT_PULLUP);

et tester une lecture LOW pour savoir s’il est enfoncé

Si tu utilises le schéma de Savoriano, il faut déclarer les boutons en INPUT_PULLUP

Merci Lesept de compléter.
Je pense que tout le monde pensait (moi, au moins) que il avait utilisé ce schéma car son premier code il y avait INPUT_PULLUP.