Problème boucle "if" a plusieurs conditions

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.

oui elles s affichent mon prof ma parler d une commande Switch qui serait bien pour regrouper les condition if
Et on a vérifier le câblage et y a pas de problème au niveau de ça
mais les valeurs qui ne s’affichent pas peuvent s'afficher...mais une fois tous les 10 ans :confused:

Ca semble bien confirmer que c'est un problème de câblage (faux contact).

L'instruction switch ne semble pas vraiment adaptée pour ce problème.
La meilleure solution me semble être celle que je t'ai donnée au post #8 ou celle de JML au post #13

oui ça marche votre code mais seul problème est que si il reste trop longtemps sur la position il met je suis dans aucune salle... mais je vais me contenter de ça ^^

Oui, alors là c'est vraiment pas glorieux comme réponse....

Le commutateur possède 10 positions, qui sont codées de 0 à 9. Donc le décodage devrait couvrir ces 10 cas là. Or l'état low-low-low-low, zéro, n'est jamais testé par contre l'état high-low-high-low, dix, est testé mais ce commutateur ne peut pas générer cette combinaison.

Autre chose, ces résultats erronés 9 fois sur 10 sont quand même assez bizarres et font vraiment penser à un problème de câblage ou de schéma.
Donc ce serait bien que tu nous présentes un schéma de ton montage et aussi une photo.

Oui, c'est le problème que je t'ai signalé au post #23. Il faut des «else if» à la place des «if»

oui j'ai vu ça Quand j'ai tester ça à marcher. Merci beaucoup a vous et aux autres pour m'avoir aidé ! :slight_smile:

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