Problème boucle "if" a plusieurs conditions

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

Et on a demandé si vous aviez des pull down

Il faut des else if à la place des if autrement tu vas (presque) toujours passer dans le dernier cas 'aucune salle'.

Comme dit plus haut il faut des résistances de pulldown (ou INPUT_PULLUP et travailler en logique inverse).

En supposant que ceci a été fait, il y une autre source de problème: toutes les entrées ne basculent pas en même temps (à la vitesse du micro), sans compter les rebonds.
Ce qu'il faut faire:

  • surveiller que l'une des entrées (au moins) à changé d'état
  • quand on détecte un changement d'état, attendre 50ms pour que toutes les entrées soient stabilisées, puis lire les entrées pour afficher la salle.

Alors oui je l'ai vu mais je ne comprend absolument rien aux commandes que tu as taper...
Je suis juste un lycéen..

Oui j ai un pull down parce que j ai mis des résistance sur les différents branchements pour justement que quand par exemple le 1 n'est plus demander il descende a 0 volt et qu il reste pas a un état haut.

Le problème étant que je n ai que certaine valeurs qui s affichent sinon il me met
je suis dans aucune classe
les valeurs qui ne s affichent pas sont le : 1,3,5,7,9
La seul qui fonctionne normalement est la position 10.

Je ne comprend pas. Est ce que les valeurs 2,4,6,8 s'affichent?
Si c'est le cas, vérifies le câblage du bouton 1.