Programme bouton à pression => partition

Bonjour
Pour faire simple :
J'ai un projet qui consiste en un gant qui est équipé de LED une sur chaque doigt sauf l’auriculaire et le pouce. Le but est de faire jouer "Au clair de la Lune" à la trompette et il suffit d'appuyer sur les doigts où les LED sont allumées (cela fait donc une note : doigté + souffle) et le système fonctionnera avec un capteur son qui, quand il détectera un son (normalement le bruit de la trompette), passera à la note suivante (les LED de la note actuelle s’éteindront brièvement et les LED de la note suivante s'allumeront). Ici j'ai remplacé le capteur son avec un bouton en attendant de le recevoir (j'espère que c'est assez clair).
En gros ça donne :

int i=0;
int d=0;
int r=3;
int m=4;
int index=2;
int majeur=4;
int annulaire=6;
int aucun=8;

void setup()
{
  pinMode(aucun,OUTPUT);
  pinMode(index,OUTPUT);
  pinMode(majeur,OUTPUT);
  pinMode(annulaire,OUTPUT);
  pinMode(0,INPUT);
}

void loop()
{
  boolean etatBouton = digitalRead(2);
 
  if (etatBouton==1)
  {
    digitalWrite(index,0);
    digitalWrite(majeur,0);
    digitalWrite(annulaire,0);
    digitalWrite(aucun,0);
    if (i=d)
    {
      if (d=2)
      {
        d=6;
      }
      else if (d=6)
      {
        d=10;
      }
      else
      {
        ++d;
      }
      ++i;
    }
    else if (i=r)
    {
      if (r=3)
      {
        r=5;
      }
      else if (r=5)
      {
        r=8;
      }
      else
      {
        ++r;
      }
      ++i;
    }
    else if (i=m)
    {
      if (m=4)
      {
        m=7;
      }
      ++i;
    }  
  }
  else
  {
    if (i=d)
    {
      digitalWrite(aucun,1);
      digitalWrite(index,0);
      digitalWrite(majeur,0);
      digitalWrite(annulaire,0);
    }
    
    else if (i=r)
    {
      digitalWrite(aucun,0);
      digitalWrite(index,1);
      digitalWrite(majeur,0);
      digitalWrite(annulaire,1);
    }
      
    else if (i=m)
    {
      digitalWrite(aucun,0);
      digitalWrite(index,1);
      digitalWrite(majeur,1);
      digitalWrite(annulaire,0);
    }
  }
}

C'est donc pour savoir s'il y a des fautes car je ne les trouves pas et ça ne semble pas fonctionner.

Je n'ai pas lu tes lignes de if, mais je vois deux problèmes :

  pinMode(0,INPUT);Les pins 0 et 1 sont réservées à la communication avec la console série sur ton PC : évite de les utiliser. Donc ôte cette ligne.

  boolean etatBouton = digitalRead(2);Tu lis la pin 2, mais elle est déjà déclarée en OUTPUT (led de l'index) donc ce n'est pas la pin du bouton. Il faut déclarer ton bouton, si possible en INPUT_PULLUP (voir ici). Le bouton sera cablé ente le GND et la pin que tu auras choisie et tu ajoutes sa déclaration dans le setup

pinMode (bouton, INPUT_PULLUP);Lorsque le bouton sera appuyé, le digitalRead renverra une valeur LOW.

Pour le reste du code, il me semble bien compliqué : qu'est-ce qu'il est censé faire ? S'il vérifie juste que les leds s'allument dans le bon ordre, il doit être possible de faire plus simple.

Attention avec le test d'égalité
Le test d'égalité doit être codé sous la forme == et surtout pas avec =

  if (etatBouton==1)

Dans ce cas tu teste correctement si la varable etatBouton est égale à 1

Par contre dans tous tes autres tests

 if (i=d)

Aucun test d'égalité n'est réalisé
Pire, la variable i va prendre la valeur de la variable d

Il faut écrire

if(i==d)

Tout d’abord je vais répondre à lesept.
J'ai corrigé toutes les erreurs par rapport au port :

 pinMode(10,INPUT_PULLUP);
 boolean etatBouton = digitalRead(10);

Maintenant les LED s'allument!

Et pour le code :
-j'ai créé une variable i qui augmente de 1 à chaque fois que le bouton est pressé.
-et en gros j'ai les 3 notes "d","r","m" (do,ré,mi) et j'ai essayé de faire en sorte que quand "i == une note" => le programme allume une ou plusieurs LED.

Pour répondre à Alain46.
En effet, ça me semblait bizarre comme je l'avais fais et j'ai donc tout corrigé mais ça n'avance pas :frowning: (le programme semble ne pas avancer).
Le programme semble être bloqué au do car seul la LED du do s'allume et j'ai beau appuyer sur le bouton la LED s’éteint mais c'est la même qui se rallume quand je relâche. Je

En tout cas merci pour l'aide! (et si je peux j’essaierai d'envoyer une photo du montage si cela peut aider à y voir plus clair)

re-postez votre programme corrigé avec les balises de code autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

(et tant que vous y êtes, éditez votre premier post pour le corriger et rajouter les balises aussi)

Je pense que le plus simple serait de compter les appuis sur le bouton. Si le nombre est compris entre 1 et 3, tu fais un do, s'il vaut 4 c'est un ré, 5 un mi, 6 un ré, etc.

Bon le programme est presque bon, seul petit problème :

int i=0;

void setup()
{
  pinMode (10,INPUT_PULLUP);
}

void loop()
{
  boolean etatBouton = digitalRead(10);
  
  if (etatBouton==1)
  {
  i++;
  }
}

C'est un résumé du programme sans toutes les LED pour exposer plus simplement le problème.
Donc pour faire simple j'aimerai que quand j’appuie sur le bouton "i" ne s'augmente que de 1 puis le programme sort de "if". Alors ce sera gagné!

Pour le code entier :

int i=0;
int index=2;
int majeur=4;
int annulaire=6;
int aucun=8;

void setup()
{
  pinMode(aucun,OUTPUT);
  pinMode(index,OUTPUT);
  pinMode(majeur,OUTPUT);
  pinMode(annulaire,OUTPUT);
  pinMode(10,INPUT_PULLUP);
}

void loop()
{
  boolean etatBouton = digitalRead(10);
  digitalWrite(index,1);
    digitalWrite(majeur,1);
    digitalWrite(annulaire,1);
    digitalWrite(aucun,1);
  
  if (etatBouton==1)
  {
    digitalWrite(index,0);
    digitalWrite(majeur,0);
    digitalWrite(annulaire,0);
    digitalWrite(aucun,0);
    
    i++ ;
  }
  else
  {
    if (i>=0 && i<=2)
    {
      digitalWrite(aucun,1);
    }
    else if (i==3)
    {
      digitalWrite(index,1);
      digitalWrite(annulaire,1); 
    }
    else if (i==4)
    {
     digitalWrite(index,1);
     digitalWrite(majeur,1);
    }
    else if (i==5)
    {
      digitalWrite(index,1);
      digitalWrite(annulaire,1);
    }
    else if (i==6)
    {
      digitalWrite(aucun,1);
    }
    else if (i==7)
    {
      digitalWrite(index,1);
      digitalWrite(majeur,1);
    }
    else if (i>=8 && i<=9)
    {
      digitalWrite(index,1);
      digitalWrite(annulaire,1);
    }
    else if (i==10)
    {
      digitalWrite(aucun,1);
    }
  }
}

Merci

Jinaoua:
Bon le programme est presque bon, seul petit problème :

Donc pour faire simple j'aimerai que quand j’appuie sur le bouton "i" ne s'augmente que de 1 puis le programme sort de "if".

Après avoir observé un appui sur le bouton (digitalRead() renvoie 1), tu dois attendre que le bouton soit rélaché avant de continuer à incrémenter !
Donc par exemple :

boolean etatBouton = digitalRead(10);
  
  if (etatBouton==1)
  {
    i++;
    while ( digitalRead(10) == 1 );
  }

C'est le strict minimum, en réalité il faudra aussi se préoccuper des "rebonds" du bouton.

Tu as un problème de rebond, c'est fréquent avec les boutons poussoirs et c'est très documenté sur le forum et sur internet (cherche "arduino debounce"). Tu peux ajouter delay(30); après le digitalRead

Bonjour,

Tant que le bouton est appuyé i s'incrémente.

Tu peux faire comme l'indique biggil mais ça a l'inconvénient de bloquer le programme tant que le bouton est appuyé, de plus il n'y a pas de traitement des rebonds.

Je te conseille plutôt la méthode suivante: Il faut que tu testes si le bouton vient d'être enfoncé et pour cela comparer l'état du bouton à l'état précédent.

void loop()
{
  static bool etatPrecedent = false;
  bool etatBouton = !digitalRead(10); // actif à l'état bas

  if (etatBouton != etatPrecedent)
  {
    if (etatBouton)
    {
      i++;
    }
    etatPrecedent = etatBouton;
    delay(20);      // anti rebond
  }
}

Merci à tous!!!
Le programme est terminé et il fonctionne.
Si quelqu'un est intéressé, je le laisse ici (il y a moyen de l'optimiser je pense).
(J'ai mis i=-1 parce que sinon le programme zap la première note).

int i=-1;
int index=2;
int majeur=4;
int annulaire=6;
int aucun=8;

void setup()
{
  pinMode(aucun,OUTPUT);
  pinMode(index,OUTPUT);
  pinMode(majeur,OUTPUT);
  pinMode(annulaire,OUTPUT);
  pinMode(10,INPUT_PULLUP);
}

void loop()
{
  static bool etatPrecedent= false;
  bool etatBouton = !digitalRead(10);
 
  if (etatBouton != etatPrecedent)
  {
    if (etatBouton)
    {
      digitalWrite(index,0);
      digitalWrite(majeur,0);
      digitalWrite(annulaire,0);
      digitalWrite(aucun,0);
    
      i++ ;
     }
    etatPrecedent = etatBouton;
    delay(20); 
  }
  else
  {
    if (i>=0 && i<=2)
    {
      digitalWrite(aucun,1);
    }
    else if (i==3)
    {
      digitalWrite(index,1);
      digitalWrite(annulaire,1);
    }
    else if (i==4)
    {
     digitalWrite(index,1);
     digitalWrite(majeur,1);
    }
    else if (i==5)
    {
      digitalWrite(index,1);
      digitalWrite(annulaire,1);
    }
    else if (i==6)
    {
      digitalWrite(aucun,1);
    }
    else if (i==7)
    {
      digitalWrite(index,1);
      digitalWrite(majeur,1);
    }
    else if (i>=8 && i<=9)
    {
      digitalWrite(index,1);
      digitalWrite(annulaire,1);
    }
    else if (i==10)
    {
      digitalWrite(aucun,1);
    }
    if (i>10)
    {
       digitalWrite(index,1);
       digitalWrite(majeur,1);
       digitalWrite(annulaire,1);
       digitalWrite(aucun,1);
       delay(500);
       digitalWrite(index,0);
       digitalWrite(majeur,0);
       digitalWrite(annulaire,0);
       digitalWrite(aucun,0);
       delay(500);
    }
  }
}

Bravo

Si vous faites cela, ce sera un peu plus propre

const byte index=2;
const byte majeur=4;
const byte annulaire=6;
const byte aucun=8;
const byte pinBouton = 10;

--> et remplacez partout l'usage de 10 par pinBouton, par exemple  bool etatBouton = (digitalRead(pinBouton) == LOW); // c'est mieux avec une comparaison logique