Bonjour Philippe,
Pour NANO, il te faut définir les 4 entrées A0 à A3 comme digitales et en entrées dans le setup().
Sur un NANO, pour A0 à A3, c'est faisable.
Note que ce ne serait pas faisable pour A6 et A7 qui ne peuvent être qu'analogiques.
On va donc avoir dans le setup :
pinMode(A0, INPUT_PULLUP); // BP 0
pinMode(A1, INPUT_PULLUP); // BP 1
pinMode(A2, INPUT_PULLUP); // BP 2
pinMode(A3, INPUT_PULLUP); // BP 3
On utilise la résistance interne de l'Arduino pour tirer la tension vers le +5V (d'où le terme "pull_up").
Ton BP ou ton inter sera donc entre la masse (GND = ground) et la broche A0, A1...A3.
Jusque là, je pense que je ne t'apprends rien, mais on ne sait jamais.
Passons maintenant à la modification du programme lui-même.
La ligne
int numPoussoir = (analogRead(pinPoussoirs) + 64) / 128;
n'a maintenant plus de raison d'être.
A quoi servait-elle ?
C'est là qu'on voit un programme bien fait :
Le nom de la variable donne la solution : elle donne le numéro du poussoir.
Les numéros vont de 0 à 7 et quand le numéro vaut 8, c'est qu'aucun bouton n'est appuyé.
C'est très bien expliqué dans l'article cité précédemment.
Deux choses restent à faire :
1°) trouver numPoussoir quand on appuie sur un bouton
2°) passer à 4 au lieu de 8 puisque tu n'as que 4 boutons. A plusieurs endroits.
Le module "lirePoussoirs" est au pluriel parce qu'il cherche quel est le bouton appuyé dans la chaîne de poussoirs.
Mais il ne lit qu'un bouton.
En fait, c'est dans le loop() qu'on balaye les boutons, dans la boucle :
for (numServo = 0; numServo < 8; numServo++) gereServo(numServo);
Et donc, là aussi, il faudra mettre 4 au lieu de 8.
Donc, reste à lire tes 4 boutons.
Voyons quelles sont les difficultés (outre le problème des rebonds) :
La première idée qui vient serait d'écrire :
numPoussoir = 4;
if (digitalRead(A0) == LOW)
{
numPoussoir = 0;
}
if (digitalRead(A1) == LOW)
{
numPoussoir = 1;
}
if (digitalRead(A2) == LOW)
{
numPoussoir = 2;
}
if (digitalRead(A3) == LOW)
{
numPoussoir = 3;
}
On note qu'on cherche un LOW et pas un HIGH, puisqu'on à par défaut un HIGH (pull_up) et qu'on met à LOW en appuyant sur le bouton.
Si on n'appuie sur rien, il sort bien numPoussoir = 4. OK.
Si on n'appuie que sur un seul bouton, numPoussoir va bien donner 0, 1, 2 ou 3 suivant le bouton appuyé. OK.
Mais si on appuie sur plusieurs boutons, le programme ne va retenir que le dernier appuyé.
Par exemple 2 et 3 :
numPoussoir va passer successivement par 4 (au départ), puis 2, puis 3, effaçant 2... complètement oublié dans l'histoire.
Si on imbriquait les if(...) {...} avec des if(...){...}else{...}, ça ne changerait pas grand chose : on obtiendrait le premier bouton appuyé et on sortirait des tests.
Cette fois, ce serait 3 qui serait oublié et numPoussoir vaudrait 2.
numPoussoir = 4;
if (digitalRead(A0) == LOW)
{
numPoussoir = 0;
}
else
{
if (digitalRead(A1) == LOW)
{
numPoussoir = 1;
}
else
{
if (digitalRead(A2) == LOW)
{
numPoussoir = 2;
}
else
{
if (digitalRead(A3) == LOW)
{
numPoussoir = 3;
}
}
}
}
On gagne juste un peu de temps : on ne fait en moyenne que 2 tests alors qu'avant on en faisait forcément 4.
Gain quasi nul et sans intérêt : le problème n'est pas là.
Ce qu'il faudrait, c'est mémoriser la position des 4 boutons et de ne retenir pour numPoussoir que pour le bouton qui a changé d'état.
Même si deux ont changé d'état en même temps, on traitera le premier, puis le deuxième au tour suivant.
Il faut donc 8 variables supplémentaires : ancienA0, nouveauA0, ancienA1, nouveauA1 ... nouveauA3.
Je n'ai pas la solution tout de suite, mais je te la donne dès que j'ai vérifié. Je ne voudrais pas écrire des bêtises.