Faire de 5 booleans une variable type 00010

Bonjour
Cinq capteurs en digital, cinq variables booléennes.
Comme je veux comparer toutes les combinaisons (robot line follower), je pense qu'il sera plus aisé de "combiner" ces cinq variables pour en obtenir une qui comporte cinq chiffres, de 0 à 1. Je veux une variable faite de 1 et de 0.
Dans un switch case ca fera très joli, et question relecture, c'est top.

case 00100 > tout droit
case 00010 > tourne à droite
case 00001 > tourne à fond à droite

Vous voyez l'idée?
Comment fait-on? :smiley:

kammo:
Bonjour
Cinq capteurs en digital, cinq variables booléennes.
Comme je veux comparer toutes les combinaisons (robot line follower), je pense qu'il sera plus aisé de "combiner" ces cinq variables pour en obtenir une qui comporte cinq chiffres, de 0 à 1. Je veux une variable faite de 1 et de 0.
Dans un switch case ca fera très joli, et question relecture, c'est top.

case 00100 > tout droit
case 00010 > tourne à droite
case 00001 > tourne à fond à droite

Vous voyez l'idée?
Comment fait-on? :smiley:

Garçon, l'addition s'il vous plaît!

Haha ^^
et bah non, paske 1+0+0+0+0 ça fait pas 10000 mais ... la tête à tototo
Bon, et sans déconner? :smiley:

Tu multiplie par l'emplacement où il va se trouver et tu additionnes.

tout à droite multiplie par 1 (pas indispensable...)
le deuxième à droite par 10
le troisième par 100
etc

Tu additionnes le tout après coup et hop....

+1
Bravo
C'est futé ... Merci

Du coup, c'est plus des booleans... On y servivra
Autre problème, comment je lui dis que chaque valeur compte 5 chiffres pour éviter ceci:

110
1000
11000
11000
11000
1
0
0
0
110
1000
0
0
0
1110

tu mets six positions avec un 1 tout à gauche et tu ne lis que les 5 autres.... :grin:

Futé, mais ya pas plus propre?

Haha c'est la cata:

-3002
16960
-14112
27960
17070
16960

  VarLL = digitalRead(PinLL) * 10;
  VarLC = digitalRead(PinLC) * 100;
  VarCC = digitalRead(PinCC) * 1000;
  VarCR = digitalRead(PinCR) * 10000;
  VarRR = digitalRead(PinRR) * 100000;

  int Traj = 1000000 + VarLL + VarLC + VarCC + VarCR + VarRR;

En fait ça ne marche pas parce qu'on multiplie 0 par qch. En plus, mes valeurs relevées sur les pins ne sont plus booléennes, ça fait joli, mais c'est pas ce que je cherche à faire ....

Il faut convertir tes boléens avant de les multiplier

à part faire une chaine.... pas sur que ce soit possible plus propre.

jfs:
Tu multiplie par l'emplacement où il va se trouver et tu additionnes.

tout à droite multiplie par 1 (pas indispensable...)
le deuxième à droite par 10
le troisième par 100
etc

Tu additionnes le tout après coup et hop....

Euh, un programmeur doit d'abord penser en binaire!

Si pin1, ajoute 1
Si pin2, ajoute 2
Si pin3, ajoute 4
Si pin4, ajoute 8
etc.

pour l'utilisation:
case B00100 > tout droit
case B00010 > tourne à droite
case B00001 > tourne à fond à droite

Sacrebleu!

Pour multiplier par 2, il y a l'instruction "<<1", par 4 "<<2" etc.
Donc tu peux faire un truc comme

(B5 << 5) + (B4 << 4) + (B3 << 3) + (B2 << 2) + (B1 << 1) + B0

où B0 à B5 sont les 6 bits à regrouper : cool non ?

Donc :

Traj= digitalRead(PinLL)+ digitalRead(PinLC) <<1  +digitalRead(PinCC)<<2 + digitalRead(PinCR) <<3 + digitalRead(PinRR) <<4;

lesept:
Pour multiplier par 2, il y a l'instruction "<<1", par 4 "<<2" etc.
Donc tu peux faire un truc comme

(B5 << 5) + (B4 << 4) + (B3 << 3) + (B2 << 2) + (B1 << 1) + B0

où B0 à B5 sont les 6 bits à regrouper : cool non ?

Donc :

Traj= digitalRead(PinLL)+ digitalRead(PinLC) <<1  +digitalRead(PinCC)<<2 + digitalRead(PinCR) <<3 + digitalRead(PinRR) <<4;

Non!

On ne doit pas faire d'arithmetique avec des booleans!
Si "False" est toujours 0, "True" peut être tout sauf zero.
Suivant le compilateur et le processeur ca peut être 1 ou 255 ou 65535 ou...

On commence avec

Traj=0;
if (digitalRead(PinLL)) Traj++;
Traj = Traj << 1;
if (digitalRead(PinLC)) Traj++;
Traj = Traj << 1;

etc...

Bon, un vrai programmeur Arduino lira le registre en une fois, basta*!
Avec par exemple les entrées de D8 à D13

DDRB = 0;    //mettre les entrées en mode digital input 
Traj = PINB & B0011111;  // lire les 8 entrées et masquer les 2 inutiles.

Fini!

*au prix de la compatibilité de son code

Punaise
Je sais pas si c'est l'heure ou l'apéro, mais là, je suis dépassé.
Par contre c'est super intéressant.
Pour les << je connaissais pas, je me fais des exercices demain pour que ça rentre, merci lesept.
Par contre le PINA je vois pas d'où il sort.
J'avance dans mes projets, mais en code comme en électronique, je découvre encore plein de bases que je n'ai pas, j'apprends sur le tas. Pour dire, les && et trucs avec des !! j'ai du mal à les lire, mais ça va venir.

Merci pour vos contributions, reste à déchiffrer tout ça et à comprendre pourquoi vous n'êtes pas d'accord ^^

Bon apéro, bon appétit !

kammo:
Punaise
Je sais pas si c'est l'heure ou l'apéro, mais là, je suis dépassé.
Par contre c'est super intéressant.
Pour les << je connaissais pas, je me fais des exercices demain pour que ça rentre, merci lesept.
Par contre le PINA je vois pas d'où il sort.
J'avance dans mes projets, mais en code comme en électronique, je découvre encore plein de bases que je n'ai pas, j'apprends sur le tas. Pour dire, les && et trucs avec des !! j'ai du mal à les lire, mais ça va venir.

Merci pour vos contributions, reste à déchiffrer tout ça et à comprendre pourquoi vous n'êtes pas d'accord ^^

Bon apéro, bon appétit !

A lire absolument!
pour PINA-iller:
Bidouiller avec les registres

Je lis ça demain!

En attendant, ceci semble fonctionner:

  VarLL = digitalRead(PinLL) * 1;
  VarLC = digitalRead(PinLC) * 10;
  VarCC = digitalRead(PinCC) * 100;
  VarCR = digitalRead(PinCR) * 1000;
  VarRR = digitalRead(PinRR) * 10000;






  long int Traj = 100000 + VarLL + VarLC + VarCC + VarCR + VarRR; //on obtient une variable à 6 chiffres, le premier ne sert à rien^^

  Serial.println(Traj);

Ca renvoie

1 0 100 1000 10000
111101

0 10 100 1000 10000
111110

0 10 100 1000 10000
111110

1 0 100 1000 10000
111101

1 0 100 1000 10000
111101

1 0 0 1000 10000
111001

1 0 0 1000 10000
111001

1 10 0 1000 10000
111011

kammo:
Je lis ça demain!

En attendant, ceci semble fonctionner:

  VarLL = digitalRead(PinLL) * 1;

VarLC = digitalRead(PinLC) * 10;
  VarCC = digitalRead(PinCC) * 100;
  VarCR = digitalRead(PinCR) * 1000;
  VarRR = digitalRead(PinRR) * 10000;
  long int Traj = 100000 + VarLL + VarLC + VarCC + VarCR + VarRR; //on obtient une variable à 6 chiffres, le premier ne sert à rien^^

Serial.println(Traj);

Faire ensuite un switch() avec un long int...
Moi, j'aurais pas osé!

Tiens nous au courant.

RIN67630:
Non!

On ne doit pas faire d'arithmetique avec des booleans!
Si "False" est toujours 0, "True" peut être tout sauf zero.

Et ça :

Traj= byte(digitalRead(PinLL))+ byte(digitalRead(PinLC)) <<1  +byte(digitalRead(PinCC)) <<2 + 
byte(digitalRead(PinCR)) <<3 + byte(digitalRead(PinRR)) <<4 + 1 <<5;

ça se tente, non ?
Pour le même prix j'ajoute le 1 au début :slight_smile:

RIN67630:
Non!

On ne doit pas faire d'arithmetique avec des booleans!
Si "False" est toujours 0, "True" peut être tout sauf zero.
Suivant le compilateur et le processeur ca peut être 1 ou 255 ou 65535 ou...

Bonjour,

digitalRead() n'est pas un booléen, mais un int. La valeur retournée est soit HIGH soit LOW.

Quand lesept fait

Traj= digitalRead(PinLL)+ digitalRead(PinLC) <<1  +digitalRead(PinCC)<<2 + digitalRead(PinCR) <<3 + digitalRead(PinRR) <<4;

Il assume que HIGH vaut 1.
Ce n'est pas très portable, mais guère moins que lorsqu'on fait

if (digitalRead(PinLL)) Traj++;

ce qui assume que HIGH est différent de 0.

Pour ma part, si j'avais à le faire j'utiliserai la solution de lesept, car c'est la solution la plus élégante et il y a quand même de grandes chances que HIGH reste à 1 dans les futures révisions du framework.

lesept:
Et ça :

Traj= byte(digitalRead(PinLL))+ byte(digitalRead(PinLC)) <<1  +byte(digitalRead(PinCC)) <<2 + 

byte(digitalRead(PinCR)) <<3 + byte(digitalRead(PinRR)) <<4 + 1 <<5;


ça se tente, non ?
Pour le même prix j'ajoute le 1 au début :)

Pourquoi ajouter 1 au début? Juste pour tromper l'ennemi?

Dans le code, on met les zeros non significatifs qu'on veut.

case B00100: