Probleme avec un bouton et une variable

Bonjour
Je débute en arduino et je suis coincé.
Voila mon projet.
un réveil qui lit l'heure et un système d'alarme

je souhaitais pouvoir modifier l'alarme par l'intermédiaire de 3 boutons. J'ai essayé d'organiser mon code en deux "menu" un affichant l'heure (copié de internet) et l'autre affichant une interface pour changer l'alarme. Je pensais avoir compris le fonctionnement du bouton mais il semble se déclencher tout seul. Je suis obligé de brancher les entrées l'arduino directement au 5v pour arreter cette boucle. Également le bouton 1 se déclenche parfois sans raison.
Je pense à un faux contact mais je ne trouve rien

voici mon code:

/************************************************************
 Horloge Arduino
 
 Horloge simple avec un Arduino, un module breakout 
 RTC DS1307 et un afficheur LCD.
 
 Branchements du breakout RTC DS1307:
 Gnd --> GND
 Vcc --> 5 V
 Sda --> analog pin A4
 Scl --> analog pin A5
  
 Branchements de l'afficheur LCD:
 LCD RS pin --> digital pin 12
 LCD Enable pin  --> digital pin 11
 LCD D4 pin  --> digital pin 5
 LCD D5 pin  --> digital pin 4
 LCD D6 pin  --> digital pin 3
 LCD D7 pin  --> digital pin 2
 LCD R/W pin  --> ground
http://electroniqueamateur.blogspot.ca/2013/06/une-horloge-pour-votre-arduino-real.html
 
 ***************************************************/

 // Modifier le systeme en prenant l'état précédent pour faire le menu !voir photo 

#include <LiquidCrystal.h>
#include <Wire.h>
#include <RTClib.h>


RTC_DS1307 RTC;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int vardep=0;
int PinB1= 6 ;
int PIN_BUZZER= 7 ;
int PinB2=8;
int PinB3=9;

//var manipulées

int ah=0;
int am=0;
int bh=11;
int bm=21;

int etat_B1=HIGH ;
int etat_B2=HIGH;
int etat_B3=HIGH;

int etat_menu1=0;
int etat_menu2=0;

int etat_B1_p=HIGH;
int etat_B2_p=HIGH;
int etat_B3_p=HIGH;

bool alarme=false;
bool lunch=true;


void setup() {
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  
   pinMode(PinB1,INPUT);
   pinMode(PinB2,INPUT);
   pinMode(PinB3,INPUT);
   pinMode(PIN_BUZZER,OUTPUT);
  
}

void loop() {
  DateTime now = RTC.now();// l'heure sur la premiêre ligne du LCD
  ah = now.hour();
  am = now.minute();
  if(lunch==true){
  // affichage de bonjour
     lcd.setCursor(4,0);
     lcd.print("B");
     delay(200);
     lcd.setCursor(5,0);
     lcd.print("o");
     delay(200);
     lcd.setCursor(6,0);
     lcd.print("n");
     delay(200);
     lcd.setCursor(7,0);
     lcd.print("j");
     delay(200);
     lcd.setCursor(8,0);
     lcd.print("o");
     delay(200);
     lcd.setCursor(9,0);
     lcd.print("u");
     delay(200);
     lcd.setCursor(10,0);
     lcd.print("r");
     
     lcd.setCursor(4,1);
     lcd.print("Il est");

     delay(2000);
     lcd.clear();
     lunch=false;
  }
  
  etat_B1=digitalRead(PinB1);
  
  Serial.println("Etat de B1");
  Serial.println(etat_B1);
  Serial.println("Etat de B1 precedent");
  Serial.println(etat_B1_p);
  Serial.println("Etat du menu ");
  Serial.println(etat_menu1);

  
  if(etat_B1==LOW and etat_B1_p==HIGH and etat_menu1==0){
   etat_menu1=1 ;
  }
  else if(etat_B1==LOW and etat_B1_p==HIGH and etat_menu1==1){
   etat_menu1=0 ;
  }
  etat_B1_p=etat_B1;
  

  
  if(etat_menu1==0){
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(now.hour());
  lcd.print(":");
  if (now.minute() < 10) {
    lcd.print("0");
  }
  lcd.print(now.minute());
  lcd.print(":");
  if (now.second() < 10) {
    lcd.print("0");
  }
  lcd.print(now.second());
  
  lcd.setCursor(12, 0);
  if(alarme==true){
  lcd.print("ON");
  }
  else;
 {lcd.print("OFF");
 }
  // la date sur la deuxième ligne du LCD
  lcd.setCursor(0, 1); 
  lcd.print(now.day()); 
  lcd.print(" "); 

  switch (now.month()) {
  case 1:
    lcd.print("janvier");
    break;
  case 2:
    lcd.print("fevrier");
    break;
  case 3:
    lcd.print("mars");
    break;
  case 4:
    lcd.print("avril");
    break;
  case 5:
    lcd.print("mai");
    break;
  case 6:
    lcd.print("juin");
    break;
  case 7:
    lcd.print("juillet");
    break;
  case 8:
    lcd.print("aout");
    break;
  case 9:
    lcd.print("septembre");
    break;
  case 10:
    lcd.print("octobre");
    break;
  case 11:
    lcd.print("novembre");
    break;
  case 12:
    lcd.print("decembre");
    break;
  }
  lcd.print(" "); 
  lcd.print(now.year()); 
  delay(1000);
  lcd.clear();

 //le systeme d'alarme
 if(alarme==true and am==bm and ah==bh){
  tone(PIN_BUZZER, 2637, 200);
  delay(400);
  tone(PIN_BUZZER, 1975, 200);
  delay(200);
  tone(PIN_BUZZER, 2093, 200);
  delay(200);
  tone(PIN_BUZZER, 2349, 200);
  delay(400);
  tone(PIN_BUZZER, 2093, 200);
  delay(200);
  tone(PIN_BUZZER, 1975, 200);
  delay(200);
  tone(PIN_BUZZER, 1760, 200);
  delay(400);
  tone(PIN_BUZZER, 1760, 200);
  delay(200);
  tone(PIN_BUZZER, 2093, 200);
  delay(200);
  tone(PIN_BUZZER, 2637, 200);
  delay(400);
  tone(PIN_BUZZER, 2349, 200);
  delay(200);
  tone(PIN_BUZZER, 2093, 200);
  delay(200);
  tone(PIN_BUZZER, 1975, 200);
  delay(400);
  tone(PIN_BUZZER, 1975, 200);
  delay(200);
  tone(PIN_BUZZER, 2093, 200);
  delay(200);
  tone(PIN_BUZZER, 2349, 200);
  delay(400);
  tone(PIN_BUZZER, 2637, 200);
  delay(400);
  tone(PIN_BUZZER, 2093, 200);
  delay(400);
  tone(PIN_BUZZER, 1760, 200);
  delay(400);
  tone(PIN_BUZZER, 1760, 200);
  delay(800);
  tone(PIN_BUZZER, 1760, 200);
  delay(400);
  tone(PIN_BUZZER, 2349, 200);
  delay(200);
  tone(PIN_BUZZER, 2794, 200);
  delay(200);
  tone(PIN_BUZZER, 3520, 200);
  delay(400);
  tone(PIN_BUZZER, 3136, 200);
  delay(200);
  tone(PIN_BUZZER, 2794, 200);
  delay(200);
  tone(PIN_BUZZER, 2637, 200);
  delay(600);
  tone(PIN_BUZZER, 2093, 200);
  delay(200);
  tone(PIN_BUZZER, 2637, 200);
  delay(400);
  tone(PIN_BUZZER, 2349, 200);
  delay(200);
  tone(PIN_BUZZER, 2093, 200);
  delay(200);
  tone(PIN_BUZZER, 1975, 200);
  delay(400);
  tone(PIN_BUZZER, 1975, 200);
  delay(200);
  tone(PIN_BUZZER, 2093, 200);
  delay(200);
  tone(PIN_BUZZER, 2349, 200);
  delay(400);
  tone(PIN_BUZZER, 2637, 200);
  delay(400);
  tone(PIN_BUZZER, 2093, 200);
  delay(400);
  tone(PIN_BUZZER, 1760, 200);
  delay(400);
  tone(PIN_BUZZER, 1760, 200);
  delay(800);
  alarme=false;
 }


  
  }
  else if(etat_menu1==1)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(bh);
    lcd.print(":");
    lcd.print(bm);
    lcd.print("_Alarme");
    if(alarme==true){
    lcd.print("_ON");
    }
    else;
    {lcd.print("_OFF");}
    
    
    etat_B2=digitalRead(PinB2);
  
  if(etat_B2==LOW and etat_B2_p==HIGH and etat_menu2==0){
   etat_menu2=1 ;
  }
  else if(etat_B2==LOW and etat_B2_p==HIGH and etat_menu2==1){
   etat_menu2= 2 ;
  }

   else if(etat_B2==LOW and etat_B2_p==HIGH and etat_menu2==2){
   etat_menu2= 0 ;
  }
  etat_B2_p=etat_B2;

  switch(etat_menu2){
    
    case 0:
 

    lcd.setCursor(0, 0);
    etat_B3=digitalRead(PinB3);
    if(etat_B3==LOW){
    bh=bh+1;
    if(bh>24){
      bh=1;
    }
    delay(500);
    }

    case 1:
    lcd.setCursor(3, 0);
    etat_B3=digitalRead(PinB3);
    if(etat_B3==LOW){
    bm=bm+1;
    if(bh>60){
      bm=0;
    }
    delay(500);
    }
    case 2:
    etat_B3=digitalRead(PinB3);
    if(alarme==true and etat_B3==LOW){
    alarme=false;
    delay(1000);
    } 
    else if(alarme==false and etat_B3==LOW){
      alarme=true;
    delay(1000);
    }
  }
}
}

voici mon schema


j'ai également un modul rtc brancher scl au pin le plus haut et sda pin juste en dessous. et vvc du rtc en 5v gnd au gnd. Tout fonctionne pour l'affichage du temps.
je suis preneur de conseil sur l’organisation ou sur des lectures.
Merci beaucoup

Salut. J'ai un peu de mal à comprendre les branchements vos boutons. Le classique : bouton + résistance pull-up (côté ųcontroleur) + condensateur (filtrage des perturbations causées par le bouton).

Il faut bien comprendre la notion de Pull-up pour les boutons poussoirs. C'est bien expliqué ici :

Tu peux utiliser le pull-up interne de l'Arduino en déclarant ton bouton comme ceci

pinmode (pinB1, INPUT_PULLUP);

Dans ce cas il t'envoie un niveau bas lorsqu'il est enfoncé et tu détectes avec un
if (digitalRead(pinB1) == LOW)

Il faut connecter le bouton entre le GND est la pin de lecture.

Merci pour vos réponses ! Je n’avais pas de condensateurs je vais m’en procurer. Merci pour le lien je lis tout ça :)!

Bonjour,

Ce n'est pas un problème de condensateur, c'est un problème de connexion des boutons comme te l'a indiqué le sept.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.