Il y a t-il un moyen de faire fonctionner les broches A6 et A7 d’un arduino nano avec la librairie “OneButton“ ?
J’ai fait des recherches sur ces deux broches qui ne fonctionnent pas comme les autres à causes du manque de la résistance pull-up.
Dans mon projet qui consiste a commander séparément 4 enrouleurs de rideaux (4 boutons pour la montée et 4 boutons pour la descente) la librairie “OneButton“ me permet avec un double clic (enregistrer les positions haute et basse de chaque enrouleur), avec un appui long (d’actionner le l’enrouleur en monté ou descente manuellement) et enfin avec le relâchement de l’appui long (arrêter la montée ou descente manuelle). Donc de A0 jusqu'à A7. Toute les autres pins sont attribuées pour d’autres fonctions mis à par la D13.
Néanmoins, elles seraient utilisables avec la fonction “analogRead()“ mais je ne sais pas comment l’inclure de mon programme.
Pour une question de lisibilité, voici le programme simplifié uniquement pour les pins A6 et A7 qui commande l’enrouleur de rideau n°4.
#include <OneButton.h>
#define PIN_INPUT7 A6 // initialisation de A6 en INPUT
#define PIN_INPUT8 A7 // initialisation de A7 en INPUT
OneButton bouton4H(A6, false); // initialise de bouton sur A6 et commander par un -(false) par un +(true)
OneButton bouton4B(A7, false); // initialise de bouton sur A7 et commander par un -(false) par un +(true)
void setup() {
Serial.begin(9600);
// pin A6, Bouton commande montée rideau 4
bouton4H.attachDoubleClick(doubleclick4H);
bouton4H.attachLongPressStart(longPressStart4H);
bouton4H.attachLongPressStop(longPressStop4H);
// pin A7, Bouton commande descente rideau 4
bouton4B.attachDoubleClick(doubleclick4B);
bouton4B.attachLongPressStart(longPressStart4B);
bouton4B.attachLongPressStop(longPressStop4B);
}
void loop() {
bouton4H.tick(); // appel les fonctions OneButton
bouton4B.tick();
delay(50);
}
void doubleclick4H(){
Serial.println("bouton montée R4 double clic");
}
void longPressStart4H(){
Serial.println("bouton montée R4 appui long");
}
void longPressStop4H(){
Serial.println("bouton montée R4 relâché");
}
void doubleclick4B(){
Serial.println("bouton descente R4 double clic");
}
void longPressStart4B(){
Serial.println("bouton descente R4 appui long");
}
void longPressStop4B(){
Serial.println("bouton descente R4 relâché");
}
La question était si les pins A6 et A7 pouvaient fonctionner avec la librairie OneButton mais jpbbricole a répondu à ma question.
Plus loin dans le programme je me sert des pins D11 et D12 pour lire l'état de deux boutons pour une autre fonction avec digitalRead().
Si j’inverse les fonctions des pins “D11 et D12” pour la fonction OneButton puis “A6 et A7” pour lire l'état des deux boutons. Ça pourrait fonctionner ?
Oui, c'est possible, tu lis l'entrée en analogique et tu décides que depuis une certaine valeur lue, le bouton est pressé.
Tu peux même mettre une résistance extérieur de PULLUP, 10K devraient aller, et mettre GND sur l'autre pin du bouton.
Ainsi, quand la valeur lue tend vers GND, le bouton est vu pressé.
A6 et A7 ne peuvent pas être utilisées avec digitalRead() car ces IO n'ont pas de buffer d'entrée digitale. On ne peut les utiliser qu'avec analogRead().
Du coup pour les boutons sur les pins A6 et A7, j’ai ajouté une résistance de 10k comme conseillé et contrôlé les valeurs avec “analogread();“ appuyé (859) et relâché (0). J’ai quand même mis un délais de 500ms pour éviter les rebonds du bouton.
void modemanuel(){
etatbtnH = analogRead(btnH); // lit la valeur de la tension analogique présente sur la broche A6
etatbtnB = analogRead(btnB); // lit la valeur de la tension analogique présente sur la broche A7
if(etatbtnH >= 800){
Serial.println("montée du rideau");
delay(500);
}
if(etatbtnB >= 800){
Serial.println("descente du rideau");
delay(500);
}
}
Merci en tout cas pour l’astuce.
Aurait-il un autre moyen pour éviter les rebonds avec cette fonction là ?
Le souci c’est que vous enlever sans doute les rebond lors de l’appui mais pas au relâchement.
Si vous tenez un peu le bouton appuyé - par exemple plus de une demi seconde et que ensuite vous relâchez et si le code vient revérifier les appuis à ce moment là, il pourrait voir le rebond au relâchement (si le rebond a le temps de recharger le petit condensateur de l’ADC - ce qui n’est pas forcément très probable).
Pas d'accord. Si vous tenez le bouton appuyé plus d'une demi seconde, on aura un nouvel affichage "montée du rideau" toutes les 1/2 secondes. Si on tient le bouton appuyé 2,1s, on aura 4 affichages...
Si on relâche le bouton avant la demi-seconde, si il y a ou pas du rebond, on ne les verra pas. Si on relâche après les 0,5s on aura vu un appui supplémentaire rebond ou pas.
Avec cette solution, il faut que le delay() soit plus long que le temps maximum d'appui. Le test qui a été fait n'a sans doute pas tenu compte d'un appui un peu long qui n'est pas "normal". Mais quand on fait une maquette, il faut peut être penser à parer les erreurs des cas peu probables dans la mesure du possible.
Il faut bien entendu virer le delay() et le remplacer par un code non bloquant à base de millis(), sinon on ne verrait pas un appui sur descente ou arrêt ou un fin de course.
C'est pour cela que je préconisait de mettre plusieurs boutons sur une même broche et de prendre soit un code qui fonctionne soit une bibliothèque. Si on n'appuis que sur un bouton à la fois, on ne peut guère dépasser 100 boutons sur une seule broche. Si on veut pouvoir différencier les appuis de plusieurs boutons à la fois, on est sans doute limité à 6 boutons avec une seule broche.
J'ai un peu de mal avec les perturbations que les rebonds au relâchement pourraient occasionner.
Les "boutons" sont des contacts « travail », c'est-à-dire qu'ils sont ouverts au repos et qu'ils sont fermés quand ils sont pressés.
Je conçois bien les perturbations apportées par les rebonds "à la fermeture" : l'équipage mécanique en rebondissant ouvre le circuit, mais l'équipage mécanique ne parcours qu'une distance extrêmement faible, 1/10 de mm suffit pour rompre le contact.
Par contre, au relâchement pour que le rebond soit pénalisant, il faudrait que la mécanique soit pourrie au point de ne pas simplement décoller du contact, mais aller frapper le contact de l'autre position qui est située à plusieurs millimètres.
Tout est toujours possible, mais ce serait oublier que de l'avis général le meilleur anti-rebond est une bascule RS.