Boutons appuyés simultanement sur un montage en analogique

Bonjour.

Avec le schéma en pièce jointe, Je veux arriver au cas de figure suivant:

-Quand j'appuie sur un bouton S3 par exemple, la Led correspondante s'allume (S1->D1, S2->D2, S3->D3 et S4->D4) Normal.
-Ensuite quand j'appuie sur un second bouton (S1) en même temps que S3 c'est toujours D3 qui reste allumée et c'est seulement quand je relâche S3 que La Led D1 s'allume.

C'est à dire que si j'appuie sur un bouton puis sur un autre c'est toujours le premier bouton qui garde sa valeur même si quelconque autre bouton est appuyé la mise à jour se fait une fois le premier bouton relâché.

Faudrait voir le code pour répondre (à mettre entre balise dédié pour une meilleure lecture)

Bonjour

Réponse équivalente à celle de ton autre topic

#include "simpleLed.h"
#include "simpleBouton.h"

simpleLed led1(8);//Cablage pin---Led---R---GND
simpleLed led2(9);
simpleLed led3(10);
simpleLed led4(11);

simpleBouton bouton1(3);//Cablage : pin---BP---GND
simpleBouton bouton2(4);
simpleBouton bouton3(5);
simpleBouton bouton4(6);

void setup() {}
void loop() {
  //actualiser seulement le bouton enfonce
  if      (bouton1.estEnfonce()) bouton1.actualiser();
  else if (bouton2.estEnfonce()) bouton2.actualiser();
  else if (bouton3.estEnfonce()) bouton3.actualiser();
  else if (bouton4.estEnfonce()) bouton4.actualiser();
  else {
    bouton1.actualiser();
    bouton2.actualiser();
    bouton3.actualiser();
    bouton3.actualiser();
  }
  led1.commander(bouton1.estEnfonce());
  led2.commander(bouton2.estEnfonce());
  led3.commander(bouton3.estEnfonce());
  led4.commander(bouton4.estEnfonce());
}

Bonjour à tous.

Le code:

int Lis_boutons_ana() {
  int EntreeAna = analogRead(A0);

  if (EntreeAna < 50)  return 1;
  if (EntreeAna > 100 && EntreeAna < 250)  return 2;
  if (EntreeAna > 250 && EntreeAna < 400)  return 3;
  if (EntreeAna > 400 && EntreeAna < 600)  return 4;

  if (EntreeAna > 900) return 0;
}

void setup() {
  Serial.begin(9600);

  pinMode(A0 , INPUT);

  pinMode(2 , OUTPUT);
  pinMode(3 , OUTPUT);
  pinMode(4 , OUTPUT);
  pinMode(5 , OUTPUT);
}

void loop() {
  Serial.println(analogRead(A0));

  int lb = Lis_boutons_ana();

  if (lb == 1) {
    digitalWrite(2, HIGH);
  }

  if (lb == 2) {
    digitalWrite(3, HIGH);
  }

  if (lb == 3) {
    digitalWrite(4, HIGH);
  }

  if (lb == 4) {
    digitalWrite(5, HIGH);
  }

  if (lb == 0) {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
  }
}

Pour te répondre Bricoleau, je précise que c'est un montage en analogique mais je trouve que tes bibliothèques sont pratiques.

Bonjour,

Tu as quatre boutons, il y a donc 16 combinaisons (2^4).
Tu dois réaliser les 16 tests: if (EntreeAna > x && EntreeAna < y) return z;

Non il faut regarder le schéma électrique :
Si S1 est appuyé n'importe quelle combinaison avec S2 S3 et S4 sera équivalente à S1.
Idem pour S2 avec S3 et S4 = S2
Idem pour S3 avec S4 = S4

Ce doit être les conditions dans la série de if qui ne sont pas bonnes.

PS les valeurs de résistances R12 R13 R14 R15 sont illisibles.

Pour être clair dans ce que je voudrais faire.
Avec le code ci-dessous, quand on appuie sur S1 puis sur S2 où bien S2 puis sur S4 ça se passe comme je le souhaite mais pas si j'appuie sur S2 puis S1 où bien S4 puis sur S2

En fichier joint, le schéma avec les valeurs de résistances.

int Lis_boutons_ana() {
  int EntreeAna = analogRead(A0);

  if (EntreeAna < 50)  return 1;
  if (EntreeAna > 100 && EntreeAna < 250)  return 2;
  if (EntreeAna > 250 && EntreeAna < 400)  return 3;
  if (EntreeAna > 400 && EntreeAna < 600)  return 4;

  if (EntreeAna > 900) return 0;
}

void setup() {
  Serial.begin(9600);

  pinMode(A0 , INPUT);

  pinMode(2 , OUTPUT);
  pinMode(3 , OUTPUT);
  pinMode(4 , OUTPUT);
  pinMode(5 , OUTPUT);
}

void loop() {
  

  int lb = Lis_boutons_ana();

  if (lb == 1) {
       
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    
  }
  
  if (lb == 2) {
   
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
  }

  if (lb == 3) {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(5, LOW);
  }

  if (lb == 4) {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, HIGH);
  }

  if (lb == 0) {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
  }
  Serial.println(lb);
}

Il me semble avoir répondu ICI.
A partir du moment où tu appuies sur S1, les autres boutons sont court-circuités.
S1 relie A0 à la masse. Donc si tu appuies sur S2, S3 ou S4, comme A0 est déjà à ZERO ... NO WAY.

@+

Deux réponse identiques :

Si S1 est appuyé n'importe quelle combinaison avec S2 S3 et S4 sera équivalente à S1.
Idem pour S2 avec S3 et S4 = S2
Idem pour S3 avec S4 = S4

Pourtant c'est évident.

Oui mais il doit être possible de contourner le problème en assignant des variables état.
Je pense que ce que je veux faire n'est pas impossible.

NON.
Suis le chemin du courant.
Si tu appuies sur S1, la tension sur A0 vaut ZERO.
Aucune chance de la faire varier avec S2 S3 ou S4.

Ne cherche pas à coder mais décrit en français ce qu'il doit se passer avec les conditions associées et tu verra si ta solution est possible.

Tu as une autre solution qui fonctionnerait :
Regardes ce qu'il se passe si tu modifies le câblage des contacts et que tu mets un contact en parallèle sur chaque résistance.
Tu verra que cela fonctionnera mieux.

Tu peux aussi regarder du coté des réseaux R/2R -> les différentes valeurs de tension seront mieux réparties.

En français, Ce que je veux faire:

-Si un 1er bouton appuyé : Choix = lb, EtatPrecedent = lb

-Si deuxième bouton appuyé simultanément avec 1er bouton : Choix = EtatPrécédent

-Si premier bouton relâché : Choix = lb

J'ai tenté quelque chose avec les boutons 3 et 4:

int Choix = 0;

int PrecEtat = 0;

int Lis_boutons_ana() {
  int EntreeAna = analogRead(A0);

  if (EntreeAna < 50)  return 1;
  if (EntreeAna > 100 && EntreeAna < 250)  return 2;
  if (EntreeAna > 250 && EntreeAna < 400)  return 3;
  if (EntreeAna > 400 && EntreeAna < 600)  return 4;

  if (EntreeAna > 900) return 0;
}

void setup() {
  Serial.begin(9600);

  pinMode(A0 , INPUT);

  pinMode(2 , OUTPUT);
  pinMode(3 , OUTPUT);
  pinMode(4 , OUTPUT);
  pinMode(5 , OUTPUT);
}

void loop() {

  int lb = Lis_boutons_ana();



  if (lb == 1) {
    Choix = 1;
  }


  if (lb == 2) {
    Choix = 2;
  }



  if (lb == 3) {
    if (PrecEtat == 0)
    {
      Choix = 3;
      PrecEtat = 3;
    }

    if (lb != PrecEtat and lb > 0) {
      Choix = PrecEtat;
    }

  }



  if (lb == 4) {

    if (PrecEtat == 0)
    {
      Choix = 4;
      PrecEtat = 4;
    }

    if (lb != PrecEtat and lb > 0) {
      Choix = PrecEtat;
    }

  }



  if (lb == 0) {
    PrecEtat = 0;
    Choix = 0;
  }


  Serial.print(lb);
  Serial.print(" ");
  Serial.print(Choix);
  Serial.print(" ");
  Serial.println(PrecEtat);




  //Serial.println(Choix);

  switch (Choix) {
    case 0:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      break;
    case 1:
      digitalWrite(2, HIGH);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      break;
    case 2:
      digitalWrite(2, LOW);
      digitalWrite(3, HIGH);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      break;
    case 3:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, HIGH);
      digitalWrite(5, LOW);
      break;
    case 4:
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, HIGH);
      break;
  }

}

Le Problème c'est qu'en analogique on ne peut pas savoir si deux boutons sont appuyés en même temps ni si un bouton est relâché.
C'est bien ça?
Sinon si quelqu'un sait le faire ça m'aiderai.

C'est bien ça?

En tous cas pas avec ton schéma.

68tjs:
Tu as une autre solution qui fonctionnerait :
Regardes ce qu'il se passe si tu modifies le câblage des contacts et que tu mets un contact en parallèle sur chaque résistance.
Tu verra que cela fonctionnera mieux.
Tu peux aussi regarder du coté des réseaux R/2R -> les différentes valeurs de tension seront mieux réparties.

@+

J'aurai du vous le dire avant mais je m'efforce de le faire avec ce schéma car j'ai déjà réalisé le C.I.

C'est un peu raté. Cela ne marchera jamais.

+1
Un circuit imprimé ne se fait que quand on est assuré que le montage est fonctionnel. C'est une évidence.
Clairement tu aurais du maquetter pour vérifier ton schéma avant de faire le circuit imprimé.

Tout n'est pas perdu pour autant : un circuit imprimé cela se bidouille avec un fer à souder, un scalpel pour couper les pistes en cuivre et du fil.

Il te faut ABSOLUMENT obtenir des tensions différentes et avec suffisamment d'écart entre deux tensions voisines pour que cela reste mesurable.

Je suis en total accord avec ce qu'à dit hbachetti : ton schéma ne fera JAMAIS ce que tu veux faire, ce n'est pas la peine de revenir dessus.

Par contre je reviens sur le réseau R/2R qui est le schéma qui te donnera la meilleure répartition des tensions.
Mais il va y avoir du câblage, possible sur plaquette pastillée.