fonction attachInterrupt avec deux boutons

Bonsoir à tous,

J'ai un petit projet à réaliser avec Arduino et je n'arrive pas à avancer parce que j'ai l'impression que mon code Arduino est faux mais je vois pas où :o . Le but étant d'utiliser la fonction attachInterrupt de sorte à afficher un message sur le monitor en fonction du bouton appuyé.
Or quand j’exécute mon code, et que j'appuie sur un bouton il m'affiche les deux messages des deux fonctions. pareil pour le deuxième bouton.
pour information j'ai une carte Arduino Uno.

Mon code arduino est :

const int buttonMarche = 3;
const int buttonArret=2;

void setup()
{
pinMode(buttonMarche, INPUT);
pinMode(buttonArret, INPUT);

attachInterrupt(digitalPinToInterrupt(buttonMarche), fonctionArret, CHANGE);
attachInterrupt(digitalPinToInterrupt(buttonArret), fonctionMarche, CHANGE);
Serial.begin(9600);

}

void loop() {}

void fonctionMarche()
{
if (digitalRead(buttonMarche) == HIGH)
{
Serial.println("c'est le bouton marche");
}
}

void fonctionArret()
{
if(digitalRead(buttonArret)==HIGH)
{
Serial.println("c'est le bouton off");
}
}


Je vous remercie pour votre aide!!

fonctionbouton.ino (621 Bytes)

Bonsoir,

Mets ton code entre balises

Tu t'es trompé de bouton dans les tests en interruption

void message()
{ 
  if (digitalRead(buttonArret) == HIGH) 
  {
    Serial.println("c'est le bouton arret");
  } 
}

  void hello()
  {
        if(digitalRead(buttonMarche)==HIGH)
        {
          Serial.println("c'est le bouton marche");
        }
  }

edit: tiens le code a changé!, mais c'est toujours inversé

Merci pour votre réponse, désolé pour le code.
j'ai rectifié mais le problème persiste.

const int buttonMarche = 3; 
const int buttonArret=2;
  
void setup()
{
  pinMode(buttonMarche, INPUT);
  pinMode(buttonArret, INPUT);
  
  
  attachInterrupt(digitalPinToInterrupt(buttonMarche), fonctionMarche, CHANGE);
  attachInterrupt(digitalPinToInterrupt(buttonArret), fonctionArret, CHANGE);
    Serial.begin(9600);  
    
}

void loop() {}

void fonctionMarche()
{ 
  if (digitalRead(buttonMarche) == HIGH) 
  {
    Serial.println("c'est le bouton marche");
  } 
}

  void fonctionArret()
  {
        if(digitalRead(buttonArret)==HIGH)
        {
          Serial.println("c'est le bouton off");
        }
  }

La ça devrait fonctionner. Il peut y avoir du rebond sur les boutons, mais dans ce cas le même message sera affiché plusieurs fois.
Tes boutons sont cablés comment?

j'ai pour chaque bouton , une résistance de 10K et un condensateur de 20nF

y a des rebonds je veux bien, mais quand j'appuie sur le bouton qui doit m'afficher le message "c'est le bouton marche" il m'affiche les deux messages "c'est le bouton marche" et "c'est le bouton off" :o

C'est incompréhensible. Tu es sur de ton cablage?

Oui Oui, les résistances en série avec le bouton et les condensateur en parallèle.

Donc mon code est juste? il n'y a pas d'erreur?

Non je ne vois pas d'erreur dans le code
Qu'es ce que tu entends par en série?

Ça serai pas un luxe d'avoir une photo de ton montage

je vous envoie une photo de mon montage
j’espère que c'est bien visible :confused:

On ne voit pas vraiment comment c'est cablé

Ton bouton doit être cablé comme ceci

ou ceci

Oui voilà, c'est exactement comme ça que j'ai câblé.
c'est pour ça que je n'arrive pas à comprendre pourquoi j'ai les deux fonctions qui s'exécutent à la fois x(

Je viens de faire l'essai chez moi, pas de problème, mais quelquefois il y a des rebonds ce qui se traduit par 2 ou 3 fois le même message

C'est vraiment étrange, parce que moi quand je le fais y a des rebonds et en plus avec un message qui ne doit pas être là.

Je pense que je n'aurais pas de réponse x(.
je vais essayer de changer de matériel du coup.

Merci beaucoup d'avoir tenté de m'aider x)

Bonjour,

Tes résistances sont-elles suffisantes ? Le schéma de kamill te propose 10 kohms. Si tu mets beaucoup moins, il est possible que l'appui sur un bouton "tire" sur l'alim et que ce soit interprété comme une interruption.

Autre chose. Pourquoi ne pas simplifier ton code en détectant le font montant ("RISING") et éviter alors le test de l'état du bouton ?

hello
en suivant ta photo, la petit BP rond est bien cablé
le gros BP est mal cablé. les deux fils du BP arrivent sur la meme ligne de la bred board.
et tu as inversé la logique de cablage entre GND et +.

recable correctement le gros BP
les deux BP doivent établir un contact avec GND s'il sont enfoncés.

regarde le code ci joint et tu verras qu'en déclarant les entrées "pullup" tu peux t'éviter de mettre des résistances extérieures.

dans les fonctions d'interruptions, il n'est pas nécessaire de tester les BP puisque c'est un appui sur l'un d'eux qui à déclenché l'appel de l'isr d'interruption correspondante

const int buttonMarche = 3;
const int buttonArret = 2;

void setup()
{
  pinMode(buttonMarche, INPUT_PULLUP);
  pinMode(buttonArret, INPUT_PULLUP);
  attachInterrupt(1), isr_Marche, FALLING);
  attachInterrupt(0, isr_Arret, FALLING);
  Serial.begin(9600);
}

void loop() {}

void isr_Marche()
{
  {
    Serial.println("c'est le bouton marche");
  }
}

void isr_Arret()
{
  {
    Serial.println("c'est le bouton off");
  }
}