Boutons sur entrées analogiques

Bonjour. Indulgence pour mon premier topic.
Je ne sais si ce genre de sujet a déjà été traité mais je préfère partager ma singulière petite expérience.
Ayant un UNO et toutes les broches digitales utilisées mais plein de broches analogiques libres, j’avais besoin de 4 boutons pour changer deux valeurs distinctes dans mon petit projet, changement du seuil d’arrêt et seuil de démarrage d’un ventilateur suivant la température acquise.
Après avoir parcouru en long et en large une foultitude de forums Arduino sur le net, j’ai trouvé une soluce simple, simuler l’acquisition de la valeur d’un potentiomètre à appliquer à 4 boutons sur une seule entrée analogique.
Sur 10kohms, 4 boutons et 4 résistances de 2.5kohms plus une résistance de 10kohms sur +5v.
Dans l’image jointe, je n’ai pas représenté le reste des éléments de mon projet.
Il se peut que l’affichage des deux valeurs vous paraisse étrange avec ce schéma et ce source car il faudra adapter cette routine à vos projets, pour ma part, analogRead de la valeur d’une ctn, mise en forme et map de ladite valeur.
Sur mon montage, lorsque je le démarre, l’acquisition de température se fait et le ventilateur réagit suivant les seuils haut et bas, fixés à 25°C de base. A l’appui d’un des boutons, l’incrément/décrément se fait bien au pas de 1 et affiche bien la nouvelle valeur sur le LCD ainsi que le ventilateur réagit bien au changement de l’un des deux seuils.
Ce n’est pas grand chose mais si ça peut aider…
A plus!

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//rs e d4 d5 d6 d7 (r/w à la masse)

int a=0;
int val1;
int val2;

void setup()
{
///For debug///
Serial.begin(9600);

//while (!Serial); <-Leonardo only

///LCD///
lcd.begin(20, 2);//J’utilise un LCD 20x2
lcd.setCursor(0, 0);
lcd.print(“Whole llord”);// Anagramme de ce “Hello world” que je ne supporte plus…
delay(3000);
lcd.clear();

///BUTTONS///
val1 = 25;//<- Dans mon cas, température d’arrêt du ventilateur
val2 = 25;//<- Dans mon cas, température de démarrage du ventilateur
}

void loop()
{
///buttons///
a=analogRead(A1);
if (a==1023 || !a)// Quoi qu’il en soit, affichage des valeurs en cours
{
lcd.setCursor(5,0);
lcd.print(val1);
lcd.setCursor(10,0);
lcd.print(val2);
}
else
{
if (a>650 && a<700)//Appui sur bouton 1
{
val2 = val2–;//Décrément de 1 la valeur existante
lcd.setCursor(10,0);
lcd.print(val2);
delay(500);// Petit délai pour éviter l’incrément/décrément plus rapide que votre ombre à l’appui sur l’un des boutons…
}
else
if (a>750 && a<800)//Appui sur bouton 2
{
val2 = val2++;//Incrément de 1 la valeur existante
lcd.setCursor(10,0);
lcd.print(val2);
delay(500);
}
else
if (a>850 && a<900)//Appui sur bouton 3
{
val1 = val1–;//Décrément de 1 la valeur existante
lcd.setCursor(5,0);
lcd.print(val1);
delay(500);
}
else
if (a>950 && a<1000)//Appui sur bouton 4
{
val1 = val1++;//Incrément de 1 la valeur existante
lcd.setCursor(5,0);
lcd.print(val1);
delay(500);
}
}
}

C'est expliqué ici: https://www.arduino.cc/en/Tutorial/AnalogInputPins

Bonjour,
En fait les pins analogiques sont comme des pins digitaux mais améliorés via un convertisseur (en interne dans la carte)
Donc si vous souhaitez les utiliser comme des pins digitaux, pas de problème.

Dans votre cas (le bouton poussoir), vous devrez mettre votre bouton entre le pin +5v et un pin analogique (Ax). Vous utiliserez la fonction "pinMode(Ax, INPUT_PULLUP)" puis "digitalRead(Ax)". Le retour du digitalRead sera soit HIGH (interrupteur fermé) soit LOW (interrupteur ouvert). Il vous suffira donc de stocker ce retour dans une variable pour la transformer en condtition.

Merci pour ce petit rappel, pepe et fdufnews.
Cependant, là, en l’occurrence, il s'agit de mettre jusqu'à X boutons par entrée analogique dans la plage ohmique de 10k, ce qui s'éloigne du simple "un bouton par entrée analogique"!
D'où une économie substantielle si on a un manque d'entrées sur un UNO par exemple, ce qui n'aura pas grande importance sur un MEGA, par contre.

Mercyval68 Je ne vois pas trop l'utilité du INPUT_PULLUP dans mon cas. Pas besoin si on prend le soin d'équilibrer les valeurs de résistances pour chaque bouton et d'appliquer les bonnes valeurs dans les boucles conditionnelles, non?

sagittarius21:
Merci pour ce petit rappel, pepe et fdufnews.
Cependant, là, en l’occurrence, il s'agit de mettre jusqu'à X boutons par entrée analogique dans la plage ohmique de 10k, ce qui s'éloigne du simple "un bouton par entrée analogique"!
D'où une économie substantielle si on a un manque d'entrées sur un UNO par exemple, ce qui n'aura pas grande importance sur un MEGA, par contre.

bonjour
c'est ce qui est utilisé sur les "LCD KEYPAD"
voir ici par exemple

Artouste:
bonjour
c'est ce qui est utilisé sur les "LCD KEYPAD"
voir ici par exemple

Tout à fait Artouste! Merci pour ce lien intéressant! Hop! En favoris...
Je sais que je n'ai rien inventé mais bon, c'était juste une petite contribution d'expérience...
Outre la redondance du code, cela peut être très pratique dans le cas d'un manque cruel d'entrée sur un UNO ou équivalent au même format de shield...

sagittarius21:
Tout à fait Artouste! Merci pour ce lien intéressant! Hop! En favoris...
Je sais que je n'ai rien inventé mais bon, c'était juste une petite contribution d'expérience...
Outre la redondance du code, cela peut être très pratique dans le cas d'un manque cruel d'entrée sur un UNO ou équivalent au même format de shield...

Il y a aussi dans la même idée une methode pour utiliser un encodeur A/B sur un pin ana

Je suis verni ce soir! Que de bons liens! ^^
C'est là que j'aime Arduino!

pepe => En logique, si +5 à une entrée (donc bouton fermé), cette entrée interprète HIGH et lycée de versaille, non?
Sauf si on tronque le fonctionnement dans le source en créant un nand logiciel...

J'adore ce type d'explication, claire, nette, précise.
Enfin trouvé un forum francophone où les gens ne te parlent pas avec une suffisance et une hauteur limite gerbante.

Tu as raison:

+5 ///_-°-_____________ pin x digital
|
|
0v ///_
___| (où r1 et r2 = 10k)

et j'ai bien if(bt=0){pin=high}

Au temps pour moi. :grin:

Bonjour,
Autant pour moi pour l'histoire du input_pullup si on met un bouton entre 5V et Ax. En effet on doit dans ce cas le mettre entre GND et Ax...
Mais il faudrait quand même mettre le input pullup au lieu de juste input pour beneficier de la resistance de pullup interne, nécessaire au fonctionnement d'un bouton