Fonction des broches A6 et A7 arduino nano

Bonsoir à tous,

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é");
} 

Avez-vous un petit idée ?

Merci par avance

La question n'est pas très claire. Qu'est-ce qui te pose problème, l'absence de pullup ou autre chose?

Bonsoir JustinPirolley

Pas avec la bibliothèque, sur un Nano, ces 2 pin sont uniquement des entrées analogiques.

Cordialement
jpbbricole

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é.

Bonne soirée
jpbbricole

Merci pour tes conseils.

J'essaie et vous tiens au courant

Bonne soirée

Ca veut dire quoi concrètement ? Pourquoi avez vous besoin d’autres broches pour lire l’état de vos broches gérées par OneButton ??

Avant la modification du programme je me servais

-Broche A0 pour monter manuellement le rideau (1) ou enregistrer le position haut (avec OneButton)

-Broche A1 pour descendre manuellement le rideau (1) ou enregistrer le position basse (avec OneButton)

-Broche A2 pour monter manuellement le rideau (2) ou enregistrer le position haut (avec OneButton)

-Broche A3 pour descendre manuellement le rideau (2) ou enregistrer le position basse (avec OneButton)

-Broche A4 pour monter manuellement le rideau (3) ou enregistrer le position haut (avec OneButton)

-Broche A5 pour descendre manuellement le rideau (3) ou enregistrer le position basse (avec OneButton)

-Broche A6 pour monter manuellement le rideau (4) ou enregistrer le position haut (avec OneButton)

-Broche A7 pour descendre manuellement le rideau (4) ou enregistrer le position basse (avec OneButton)

-Broche D11 pour monter automatiquement les 4 rideaux jusqu’aux positions hautes enregistrées (avec la fonction digitalRead())

-Broche D12 pour descendre automatiquement les 4 rideaux jusqu’aux positions basses enregistrées (avec la fonction digitalRead())

Et après la modification

-Broche D11 pour monter manuellement le rideau (4) ou enregistrer le position haut (avec OneButton)

-Broche D12 pour descendre manuellement le rideau (4) ou enregistrer le position basse (avec OneButton)

-Broche A6 pour monter automatiquement les 4 rideaux jusqu’aux positions hautes enregistrées (avec la fonction digitalRead())

-Broche A7 pour descendre automatiquement les 4 rideaux jusqu’aux positions basses enregistrées (avec la fonction digitalRead())

Ok compris

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().

ça marche, je vais essayer avec analogRead()

Si c'est pour passer par analogRead, pourquoi ne pas utiliser plusieurs boutons par broche?

Salut.

ça fonctionne !

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à ?

500ms c'est peut-être un peu beaucoup. Cela ne ralenti pas le fonctionnement?

Je n'est pas encore essayé le code complet. Si jamais c’est lent, je réduirai le délai.

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.

Bon point effectivement et comme ill y a deux boutons, si le rideau est déjà monté, ce n'est pas comme si ça allait envoyer un ordre pour descendre.

Sinon ce serait un bon cas d'usage de votre bibliothèque

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.

Je comprends. Dans le principe, il me faudrait passer par millis() éviter de bloquer le programme.