bonjour
le plus simple pour simuler un telerupteur avec plusieurs boutons est de cabler les boutons en //
d'incrementer une variable lors d'un appui sur un des boutons et de calculer le modulo 2
le resultat sera soit 0 soit 1
Tu utilises INPUT_PULLUP, donc tes boutons sont en logique négative (enfoncés à 0). Donc soit tu changes la logique de ton programme pour raisonner en logique inversée, soit ce que je te conseille c'est d'inverser l'état à la lecture:
int bp1=!digitalRead (BP1);
int bp2=!digitalRead (BP2);
comme ça tu n'as rien d'autre à changer dans ton programme.
Artouste, j'aimerais garder la modularité sans toucher au câblage à chaque changement...
l'option de //lisation hard etait simplement pour exposer une solution
apres que tu fasse
si bp1 appuyé = compteur + 1
si bp2 " " = compteur +1
si bpx " " +1
et qu'en sortie tu verifie simplement
etat = valeur compteur modulo 2
ça ne changera rien à l'etat final de ton telerupteur quelque soit le nombre de points de sollicitations
Je ne suis pas sûr du tout qu'Arduino comprenne cela de la manière dont on aimerait qu'il le comprenne. En l'occurrence, je pense que tu mélanges le OU logique || et le OU bit à bit |.
Le premier sert à tester une condition, par exemple:
if((spb == pb1) || (spb == pb2)){
...
}
Le deuxième serait plus adapté à ce que tu cherches, il permet de faire des opérations bit à bit. Par exemple, 0011 | 0101 == 0111 Dans ton cas puisque tu cherches à comparer les états de deux boutons poussoir, il n'y a pas besoin de déclarer des int, le format boolean suffirait. Et l'opérateur | donnerait le résultat escompté.
Julienduino:
Normalement lors de l'appui du BP la led s'allume et s’éteint lorsqu’on relâche, c'est bien ça?
Et bien non...c'est l'inverse...
Ca dépend comment est branchée ta led. Si elle est connectée au 5V (bien sur avec une résistance) elle s'alumera quand la sortie sera à 0, si elle est connectée au 0V, elle s'allumera quand la sortie est à 1
Julienduino:
si j'ai bien fait le boulot, après être passé en boolean, même résultat...
C'est normal. Le C++ n'est pas un langage très typé, on peut remplacer un booléen par un entier et qu'on utilise des booléens ou des entiers ça donnera le même résultat.
Conceptuellement, et peut être pour des questions de performance il vaut mieux utiliser des bool pour les opérations logiques.
pepe:
Le langage C++ est en général très typé, mais il a été conçu pour être au maximum compatible avec le langage C dans lequel type booléen (bool) n'existe pas.
Je persiste à dire que le C++ n'est pas un langage très typé. Par exemple on peut affecter à un entier un booléen, un caractère, un unsigned et même un enum.
Ce langage est toujours utilisé dans les cursus de formation, pour ses vertus pédagogiques induites par la rigueur de programmation qu'il impose.
Déjà à l'époque, mes profs me disaient : apprenez à développer en ada et ensuite vous aurez de bonnes habitudes pour programmer en C.
Dans le milieu professionnel on le trouve encore, là où la fiabilité des programmes est primordiale (avionique, spacial, militaire, etc.).