Problème boucle "if" a plusieurs conditions

Bonjour a tous, en ce moment je fais un projet.
Je comprend vite mais l écriture du code n'est pas mon fort
Mon problème est que je dois configurer un bouton rotatif a plusieurs possibilités. elles sont au nombre de 10
J ai donc fait un code permettant cela mais impossible d avoir une autre possibilité que la première....
Voici le code en question :


1.   pinMode(buttonPin1, INPUT); 
2.   pinMode(buttonPin2, INPUT);
3.   pinMode(buttonPin4, INPUT);
4.   pinMode(buttonPin8, INPUT);
5.   Serial.begin(9600);
6. }

7. void loop() {
8.  
9.   buttonState1 = digitalRead(buttonPin1);
10.   buttonState2 = digitalRead(buttonPin2);
11.   buttonState4 = digitalRead(buttonPin4);
12.   buttonState8 = digitalRead(buttonPin8);
13.  
14.   if (digitalRead(buttonPin1) == HIGH) {
15.     delay(1000);
16.     Serial.println("je suis classe 1");
17.    
18.   }
19.   else if (digitalRead(buttonPin2) == HIGH){ 
20.    delay(1000);
21.    Serial.println("je suis salle 2");
22.    
23.   }
24.    else if  (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2) == HIGH){ 
25.    delay(1000);
26.    Serial.println("je suis salle 3"); 
27. }
28.  else if (digitalRead(buttonPin4) == HIGH){ 
29.    delay(1000);
30.    Serial.println("je suis salle 4");
31.  }
32.   else if (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin4) == HIGH){ 
33.    delay(1000);
34.    Serial.println("je suis salle 5");
35.   }
36.    else if (buttonState2 && digitalRead(buttonPin4) == HIGH){ 
37.    delay(1000);
38.    Serial.println("je suis salle 6");
39.    }
40.     else if (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin4) == HIGH){ 
41.    delay(1000);
42.    Serial.println("je suis salle 7");
43.     }
44.      else if (digitalRead(buttonPin8) == HIGH){ 
45.    delay(1000);
46.    Serial.println("je suis salle 8");
47.     }
48.      else if (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin8) == HIGH){ 
49.    delay(1000);
50.    Serial.println("je suis salle 9");
51.     }
52.       else if (digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin8) == HIGH){ 
53.    delay(1000);
54.    Serial.println("je suis salle 10");
55.     }
56.     else {
57.       delay(1000);
58.    Serial.println("je suis dans aucune salle");
59.     }
60.     }

:warning: La rédaction de votre message ne répond pas aux critères attendus. Il n’aura sans doute pas de réponse tant que vous n’aurez pas pris en compte et mis en application les recommandations listées dans « Les bonnes pratiques du Forum Francophone”

Merci d’éditer votre post pour rajouter les balises de de code, c’est quasiment illisible tel quel:

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l’icône </> dans la barre d’outils pour indiquer que c’est du code

(Assurez vous aussi d’indenter le code correctement dans l’IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

Quelques infos sur le câblage de l'ensemble pourrait nous aider à t'aider, car le comportement que tu rencontres pourrait être causé par un câblage mal adapté.

Au début pour le câblage j ai un peux galérer et en gros j ai brancher le bouton de façon a faire passer 5V dans le bouton et avoir une sortie et connecter les différents ports 1 2 4 et 8 au pin de la carte 2 4 7 8 (digitales)...mais le code marche le câblage a l air de fonctionner aussi c est juste sur le moniteur série je n arrive que a avoir la première valeur je suis en "classe 1" et même si je change la position du bouton cela continue de me mettre je suis en classe 1.

On a de la chance, on a échappé à la photo de l'écran. :nauseated_face:
Relire le post #2 de JML.

C est fait.

Ton programme n'est pas complet. De plus tu as mis les numéros de ligne dans le code??

Je vais quand même répondre.
A chaque test il faut tester tous les boutons

  if (digitalRead(buttonPin1) == HIGH && digitalRead(buttonPin2)==LOW && digitalRead(buttonPin4)==LOW && digitalRead(buttonPin8)==LOW) {
    delay(1000);
    Serial.println("je suis classe 1");
  }
  else if (digitalRead(buttonPin2) == HIGH && digitalRead(buttonPin1)==LOW && digitalRead(buttonPin4)==LOW && digitalRead(buttonPin8)==LOW) {
    delay(1000);
    Serial.println("je suis salle 2");
  }
// ...

Ca fait un programme fastidieux, il y a moyen de faire plus simple

const int buttonPin1 = 2;
const int buttonPin2 = 4;
const int buttonPin4 = 7;
const int buttonPin8 = 8;

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState4 = 0;
int buttonState8 = 0;

void setup() {

  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin8, INPUT);
  Serial.begin(9600);
}

void loop() {
  buttonState1 = digitalRead(buttonPin1);
  buttonState2 = digitalRead(buttonPin2);
  buttonState4 = digitalRead(buttonPin4);
  buttonState8 = digitalRead(buttonPin8);

  int salle = 0;

  if (digitalRead(buttonPin1) == HIGH)
    salle += 1;
  if (digitalRead(buttonPin2) == HIGH)
    salle += 2;
  if (digitalRead(buttonPin4) == HIGH)
    salle += 4;
  if (digitalRead(buttonPin8) == HIGH)
    salle += 8;

  if (salle > 0 && salle <= 10)
  {
    Serial.print("je suis classe ");
    Serial.println(salle);
  }
  else
  {
    Serial.println("je suis dans aucune salle");
  }
  delay(1000);
}

hello
tu es sur que ce n'est pas 1 fois sur 2 que la reponse est "salle 1" ?

combien de pattes sur ton bouton rotatif ?

1,2,4,8 ça ne t'évoque rien?

tu dois rendre ton projet à quelle date?

Bonjour j'ai 6 pates sur mon bouton, (patte 1 2 4 8 et une entrée pour la tension )
Si ça ma fais penser a du binaire c'est ce que ma expliquer mon professeur, les position sont en Hexa et le transfert de donnée en binaire...
je dois rendre mon projet pour le 17 juin

un lien ou une photo de ce fameux bouton serait utile

L encodeur rotatif ressemble a ça

vous avez une résistance de pull-down?

un code simple comme cela donne quoi

const int buttonPin1 = 2;
const int buttonPin2 = 4;
const int buttonPin4 = 7;
const int buttonPin8 = 8;

void setup() {
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin8, INPUT);
  Serial.begin(115200);
}

void loop() {
  int salle = (digitalRead(buttonPin8) << 3) +
              (digitalRead(buttonPin2) << 2) +
              (digitalRead(buttonPin2) << 1) +
              (digitalRead(buttonPin1) << 0);
  Serial.print("Salle = 0b");
  Serial.println(salle, BIN);
  delay(1000);
}

chez moi, ça fait 5 pattes :grinning:

as tu regardé la data sheet du micro controleur?
as tu fait la relation entre un PORT et un octet?
as tu regardé un PIN MAP de la carte UNO?
le port B devrait t'interresser
les résistances de pullup aussi pour ton sélecteur rotatif (je parle des résistances internes du mico controleur).

JML te donne une des façons de coder ton exercice, je m'orientais vers une autre

Oui, lire un PORT d'un coup et faire le masque qui va bien est aussi une possibilité si les pins sont bien choisies

chez moi, ça fait 5 pattes

oui mais il y a bien 6 pattes ( Commutateur, DIP, 10 ou 16 voies)
image

Si tu as câblé comme tu l'expliques ici , il y a toujours des entrées en l'air.
Il faut :

  • câbler le commun de ton encodeur rotatif à la masse
  • raccorder les 4 sorties (1, 2, 4, 8) sur l'arduino
  • configurer les entrées en INPUT_PULLUP et non simplement en INPUT

oui, c'est bien à cela que je pensais
mon code en complément de celui de JML
tout est dans les commentaires

//code pour platine UNO
//le selecteur rotatif donne une information codée en Hexadécimal codé Binaire
//les 4 fils de sortie du sélecteur rotatif sont raccordés
//aux 4 bits de poids faible ( lsb ) du port B sont utilisés
//selon leurs poids respectifs ( 1, 2, 4, 8)
//le commun du sélecteur rotatif sera raccordé à GND

const int buttonPin1 =  8;  //pb0 sur 328 et  D8 sur UNO
const int buttonPin2 =  9;  //pb1 sur 328 et  D9 sur UNO
const int buttonPin4 = 10;  //pb2 sur 328 et D10 sur UNO
const int buttonPin8 = 11;  //pb3 sur 328 et D11 sur UNO

byte bouton   = 0;       //variable de lecture du port B
byte mask  = 0b00001111; //masque pour ne conserver que le lsb du port B
void setup() 
{
  Serial.begin(115200);
  pinMode(buttonPin1, INPUT_PULLUP);//portB bit 0 ==>valeur 1
  pinMode(buttonPin2, INPUT_PULLUP);//portB bit 1 ==>valeur 2
  pinMode(buttonPin4, INPUT_PULLUP);//portB bit 2 ==>valeur 4
  pinMode(buttonPin8, INPUT_PULLUP);//portB bit 3 ==>valeur 8
}

void loop()
{
  bouton=   ((PINB&mask)^mask);
  //exemple:
  //si PINB=01011110 alors sélecteur est sur position 1 car PB0 = 0
  //AND     00001111 and avec le mask
  //        00001110 il reste le lsb de PINB
  //XOR     00001111 ou exclusif entre le lsb et le mask
  //        00000001bil reste le bit 0 de poids 1
  
  Serial.print (bouton);
switch (bouton)
  {                                         //bits 76543210 
    case 1 : {                              //PINB=xxxx1110 = complement à 2 de 1
        Serial.println("je suis classe 1");
        delay(1000);
      } break;                              //bits 76543210
    case 2 : {                              //PINB=xxxx1101 = complement à 2 de 2
        Serial.println("je suis classe 2");
        delay(1000);
      } break;                              //bits 76543210
    case 3 : {                              //PINB=xxxx1100 = complement à 2 de 3
        Serial.println("je suis classe 3");
        delay(1000);
      } break;                              //bits 76543210
    case 4 : {                              //PINB=xxxx1011 = complement à 2 de 4
        Serial.println("je suis classe 4");
        delay(1000);
      } break;                              //bits 76543210
    case 5 : {                              //PINB=xxxx1010 = complement à 2 de 5
        Serial.println("je suis classe 5");
        delay(1000);
      } break;                              //bits 76543210
    case 6 : {                              //PINB=xxxx1001 = complement à 2 de 6
        Serial.println("je suis classe 6");
        delay(1000);
      } break;                              //bits 76543210
    case 7 : {                              //PINB=xxxx1000 = complement à 2 de 7
        Serial.println("je suis classe 7");
        delay(1000);
      } break;                              //bits 76543210
    case 8 : {                              //PINB=xxxx0111 = complement à 2 de 8
        Serial.println("je suis classe 8");
        delay(1000);
      } break;                              //bits 76543210
    case 9 : {                              //PINB=xxxx0110 = complement à 2 de 9
        Serial.println("je suis classe 9");
        delay(1000);
      } break;                              //bits 76543210
    case 10 : {                             //PINB=xxxx0110    0x0A
        Serial.println("je suis classe 10");
        delay(1000);
      } break;
    default : {                              //toutes les autres valeurs 11,12,13,14,15
        Serial.println("je ne suis dans aucune classe");  //0x0B, 0x0C, 0x0D, 0x0E, 0x0F
      } break;
  }
  delay(100);  //pour ne pas saturer le moniteur serie
}

On peut même juste prendre pinB & mask Et adapter les case en fonction (on peut les écrire 0b0101 Etc pour rendre plus facile la lecture)

j ai suivis ton conseil et du coup j ai refais mon code :

int buttonPin1 = 6;     // the number of the pushbutton pin
int buttonPin2 = 7;
int buttonPin4 = 8;
int buttonPin8 = 9;


// variables will change:
int buttonState1 = 0;         // variable for reading the pushbutton status
int buttonState2 = 0;   
int buttonState4 = 0;   
int buttonState8 = 0;   

void setup() {
  Serial.begin(9600);
  
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(buttonPin4, INPUT);
  pinMode(buttonPin8, INPUT);
  
}

void loop() {
  
buttonState1 = digitalRead(buttonPin1);  
buttonState2 = digitalRead(buttonPin2); 
buttonState4 = digitalRead(buttonPin4); 
buttonState8 = digitalRead(buttonPin8); 
  
  // read the state of the pushbutton value:
if (buttonState1 == HIGH && buttonState2 == LOW && buttonState4 == LOW && buttonState8 == LOW){
Serial.println("Je suis en salle 1.");
delay(3000);
  }
  
if (buttonState1 == LOW && buttonState2 == HIGH && buttonState4 == LOW && buttonState8 == LOW){
Serial.println("Je suis en salle 2.");
delay(3000);
  }

if (buttonState1 == HIGH && buttonState2 == HIGH && buttonState4 == LOW && buttonState8 == LOW){
Serial.println("Je suis en salle 3.");
delay(3000);
  }

if (buttonState1 == LOW && buttonState2 == LOW && buttonState4 == HIGH && buttonState8 == LOW){
Serial.println("Je suis en salle 4.");
delay(3000);
  }

if (buttonState1 == HIGH && buttonState2 == LOW && buttonState4 == HIGH && buttonState8 == LOW){
Serial.println("Je suis en salle 5.");
delay(3000);
  }

if (buttonState1 == LOW && buttonState2 == HIGH && buttonState4 == HIGH && buttonState8 == LOW){
Serial.println("Je suis en salle 6.");
delay(3000);
  }

if (buttonState1 == HIGH && buttonState2 == HIGH  && buttonState4 == HIGH && buttonState8 == LOW){
Serial.println("Je suis en salle 7.");
delay(3000);
  }

if (buttonState1 == LOW && buttonState2 == LOW && buttonState4 == LOW && buttonState8 == HIGH){
Serial.println("Je suis en salle 8.");
delay(3000);
  }

if (buttonState1 == HIGH && buttonState2 == LOW && buttonState4 == LOW && buttonState8 == HIGH){
Serial.println("Je suis en salle 9.");
delay(3000);
  }

if (buttonState1 == LOW && buttonState2 == HIGH && buttonState4 == LOW && buttonState8 == HIGH){
Serial.println("Je suis en salle 10.");
delay(3000);
  }
else  {
Serial.println("Je suis dans aucune salle.");
delay(3000);
  }
}

mais maintenant dans le moniteur série il ne me le met 1 fois sur 10 mais il me met les bonnes valeurs

tu t'adresses à qui?
as tu regardé le code que je t'ai posté?