deux boutons pour faire varier l'états de deux sorties

Bonjour,

Le programme que je vais vous présenter consiste à faire varier l'état de deux LED avec deux boutons. Genre :

B1 B2 Led1 Led2 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1

Voici le code :

// Variables contenant l'état du contact et de la LED
int contact = 2;
int contact2 = 3;
int etatcontact = 0 ;
int etatprecedent = 0 ;
int etatcontact2 = 0 ;
int etatprecedent2 = 0 ;
int etat =0;
int etat2 =0;
byte led1= 8;
byte led2 = 9;

void setup()
{
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (contact, INPUT_PULLUP);
  pinMode (contact2, INPUT_PULLUP);
}

void loop()
{
  
  int etatprecedent = 0 ;
  int etatprecedent2 = 0 ;
  etatcontact = !digitalRead(contact);
  etatcontact2 = !digitalRead(contact2);
  // Y-a-t-il eu une transition ?
  if (etatcontact == HIGH && etatprecedent == LOW) 
  {     
    etat = 1 - etat;
    delay(10) ; // Délai supérieur à celui des rebondissements 
    etatprecedent = etatcontact ; 
  } 
  if (etatcontact2 == HIGH && etatprecedent2 == LOW) 
  {        
   etat2 = 1 - etat2;
   delay(10) ; // Délai supérieur à celui des rebondissements  
  etatprecedent2 = etatcontact2 ;
  }
  if (etat == 0 && etat2 == 0)
   {
     digitalWrite(led1,LOW);
     digitalWrite(led2,LOW);
   }
  else if (etat == 0 && etat2 ==1)
    {
    digitalWrite(led1,LOW);
    digitalWrite(led2,HIGH);
    }
  else if (etat == 1 && etat2 == 0)
    {
    digitalWrite(led1,HIGH);
    digitalWrite(led2,LOW);
    }
  else if (etat == 1 && etat2 == 1)
    {
    digitalWrite(led1,HIGH);
    digitalWrite(led2,HIGH);
   } 
   etat = 0;
   etat2 = 0;
}

Seulement, que j'appuie sur un, l'autre ou les deux boutons, les deux LED s'allument, et cela me rend perplexe, au début, j'ai essayé avec un switch case mais cela ne fonctionne pas.

Ce bout de code sera intégrer dans un programme plus important avec ces deux boutons, je ferais varier la position d'un ou plusieurs servomoteurs

Cordialement

bonjour, déjà etatprecedent et etatprecedent2 sont toujours à 0 dans ton code.

void loop()
{
    int etatprecedent = 0 ;
  int etatprecedent2 = 0 ;

donc vire ces deux lignes

Merci pour votre aide, je modifierais le code en conséquence !!

infobarquee: bonjour, déjà etatprecedent et etatprecedent2 sont toujours à 0 dans ton code.

void loop()
{
    int etatprecedent = 0 ;
  int etatprecedent2 = 0 ;

donc vire ces deux lignes

Bon, j'ai supprimé les deux lignes que tu m'as indiqué et là, les leds ne s'allument plus du tout. Pourtant l'algorithme de mon programme me semble bon pourtant !! Il y a quelques choses qui m'échappe ... Et cela me fruste !!!

Si j'essaie d'analyser le comportement, on dirait que le microcontrôleur ne voit rien en entrée, car il n'y a pas de changement en sortie, je vais essayer de faire un programme qui me remonte l'état des entrées par la liaison série ...

// Variables contenant l'état du contact et des LED
int contact = 2;
int contact2 = 3;
int etatcontact = 0 ;
int etatprecedent = 0 ;
int etatcontact2 = 0 ;
int etatprecedent2 = 0 ;
int etat =0;
int etat2 =0;
byte led1= 8;
byte led2 = 9;

void setup()
{
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (contact, INPUT_PULLUP);
  pinMode (contact2, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop()
{
  etatcontact = !digitalRead(contact);
  etatcontact2 = !digitalRead(contact2);
  //Etat direct des boutons 
  Serial.println(etatcontact);
  Serial.println(etatcontact2);
  // Y-a-t-il eu une transition ?
  if (etatcontact == HIGH && etatprecedent == LOW) 
  {     
    etat = 1 - etat;
    delay(10) ; // Délai supérieur à celui des rebondissements 
    etatprecedent = etatcontact ; 
  } 
  if (etatcontact2 == HIGH && etatprecedent2 == LOW) 
  {        
   etat2 = 1 - etat2;
   delay(10) ; // Délai supérieur à celui des rebondissements  
  etatprecedent2 = etatcontact2 ;
  }
  //Etat des deux deux variables précédentes !
  Serial.println(etat,BIN);
  Serial.println(etat2,BIN);
  // comparaison de l'état des boutons et table de vérité des sorties LED1 et LED2 :
  if (etat == 0 && etat2 == 0)
   {
     digitalWrite(led1,LOW);
     digitalWrite(led2,LOW);
   }
  else if (etat == 0 && etat2 ==1)
    {
    digitalWrite(led1,LOW);
    digitalWrite(led2,HIGH);
    }
  else if (etat == 1 && etat2 == 0)
    {
    digitalWrite(led1,HIGH);
    digitalWrite(led2,LOW);
    }
  else if (etat == 1 && etat2 == 1)
    {
    digitalWrite(led1,HIGH);
    digitalWrite(led2,HIGH);
   } 
   }

Résumons :

  • Grâce à la laison série, je m'aperçois que l'Atméga s'aperçoit du changement de l'état des boutons avec le changement d'état de etatcontact et etatcontact2
  • Quand je remplace etat et etat2 par etatcontact et etatcontact2 dans les else if, j'ai les deux leds qui fonctionnent en même temps !!

Pour le 1 : les routines d'anti-rebond ne fonctionne pas correctement. Pour le 2 : le branchement en else if ne fonctionne pas non plus .... Pourtant tout le cela me semble correct !! Help me please !!! :disappointed_relieved:

tu te compliques bien la vie. utilise boolean https://www.arduino.cc/en/Reference/BooleanVariables

ca devrait donner un truc comme ca, vite fait sur le bout de pouce

int contact = 2;
int contact2 = 3;
int led1= 8;
int led2 = 9;

boolean running1 = false;
boolean running2 = false;


void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
   pinMode (contact, INPUT_PULLUP);
  pinMode (contact2, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(contact) == LOW) running1 != running1;
  if (digitalRead(contact2) == LOW) running2 != running2;

 digitalWrite(led1, running1);
 digitalWrite(led2, running2);
}

Bonsoir et merci pour ton aide, en fait si je passe par mon if else, car dans le prochain niveau du programme,pour changé l'état de la sortie, il faut un bouton soit activé ET pas l'autre !!

Comme cela S1 & (/S2) = L1 (/S1) & S2 = /L1

Car ce ne sera des leds mais un servomoteurs dont on changera la position, et l'application qui en découle exige qu'il n'y a pas d'états interdits ou non autorisés !

teste déjà ce code et regarde les possibilités ;)

Non, cela ne marche pas !!

14_ZYG_31: Non, cela ne marche pas !!

c'est a dire?????

Aucune leds s'allument !

regardes avec ça

int contact = 2;
int contact2 = 3;
int led1= 8;
int led2 = 9;

boolean running1 = false;
boolean running2 = false;


void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
   pinMode (contact, INPUT_PULLUP);
  pinMode (contact2, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(contact) == LOW) running1 != running1;
  if (digitalRead(contact2) == LOW) running2 != running2;
Serial.print(" contact  = ");Serial.print(contact); Serial.print("       et contact2 =  ");Serial.println(contact2);
Serial.print(" running1 = ");Serial.print(running1);Serial.print("       et running2 =  ");Serial.println(running2);
 digitalWrite(led1, running1);
 digitalWrite(led2, running2);
 delay(2000); // utile pour ralentir le defilement sur le moniteur
}

Quand j'appuie les 2 boutons ou un seul :

contact = 2 et contact2 = 3 running1 = 0 et running2 = 0

et toujours aucune leds qui s'allument ...

erreur de ma part celui ci fonctionne je viens de tester

int contact = 2;
int contact2 = 3;
int led1= 13;
int led2 = 9;

boolean running1;
boolean running2 ;
int debounce = 500;

void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode (contact, INPUT_PULLUP);
  pinMode (contact2, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop()
{
  /*
  int state = digitalRead(contact);
   if (state == LOW){
   running1 = !running1;
   digitalWrite(led1, running1);
   }*/
  if (digitalRead(contact) == LOW) {
    delay(debounce);

    running1 = !running1;
    digitalWrite(led1, running1);
  }

  if (digitalRead(contact2) == LOW) {
    running2 = !running2;
    delay(debounce);
    digitalWrite(led2, running2);
  }
  Serial.println(running1);
  Serial.println(running2);

}

Bonjour

infobarquee: erreur de ma part celui ci fonctionne je viens de tester

int contact = 2;
int contact2 = 3;
int led1= 13;
int led2 = 9;

boolean running1; boolean running2 ; int debounce = 500;

void setup() {  pinMode(led1, OUTPUT);  pinMode(led2, OUTPUT);  pinMode (contact, INPUT_PULLUP);  pinMode (contact2, INPUT_PULLUP);  Serial.begin(9600); }

void loop() {  /*  int state = digitalRead(contact);   if (state == LOW){   running1 = !running1;   digitalWrite(led1, running1);   }*/  if (digitalRead(contact) == LOW) {    delay(debounce);

   running1 = !running1;    digitalWrite(led1, running1);  }

 if (digitalRead(contact2) == LOW) {    running2 = !running2;    delay(debounce);    digitalWrite(led2, running2);  }  Serial.println(running1);  Serial.println(running2);

}

Sauf erreur de ma part, ce programme fait clignoter les LEDs a une fréquence de 1Hz pour un bouton appuyé et 0.5Hz pour les 2. De plus la LED garde l'état au moment du relâché.

Je verrais un truc du genre

#define CONTACT1 2
#define CONTACT2 3
#define LED1 13
#define LED2 9
#define DEBOUNCE 30

boolean prec1=false;
boolean prec2=false;

unsigned long start1;
unsigned long start2;


void setup()
{
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  pinMode (CONTACT1, INPUT_PULLUP);
  pinMode (CONTACT2, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop()
{
  if (digitalRead(CONTACT1) == LOW) 
  {
     if (prec1==HIGH)   //Détection appui
     {  
       start1=millis();
       prec1=LOW;
     }
     else
     {
        if(millis()-start1>DEBOUNCE)
        {
           digitalWrite(LED1,HIGH);
           Serial.println("LED1");
        }
     }
  }
  else
  {
     prec1=HIGH;
  }

  if (digitalRead(CONTACT2) == LOW) 
  {
     if (prec2==HIGH)   //Détection appui
     {  
       start2=millis();
       prec2=LOW;
     }
     else
     {
        if(millis()-start2>DEBOUNCE)
        {
           digitalWrite(LED2,HIGH);
           Serial.println("LED2");
        }
     }
  }
  else
  {
     prec2=HIGH;
  }
}

Attention, écrit à l'arrache sans test de compilation, je ne suis pas chez moi.

a+

non non, ca fonctionne sans clignotement, testé hier soir vite fait avec 2 leds et 2 bouts de fils pour faire bouton.

Bonsoir,

Bon, j'ai testé vos programmes et malheureusement, il ne marche pas. On allume une led mais on peut pas l'éteindre ..... Je vous remercie de votre aide mais on s'éloigne de mon cahier des charges ... Qui est :

14_ZYG_31: Bonsoir et merci pour ton aide, en fait si je passe par mon if else, car dans le prochain niveau du programme,pour changé l'état de la sortie, il faut un bouton soit activé ET pas l'autre !!

Comme cela S1 & (/S2) = L1 (/S1) & S2 = /L1

Car ce ne sera des leds mais un servomoteurs dont on changera la position, et l'application qui en découle exige qu'il n'y a pas d'états interdits ou non autorisés !

Bonsoir,

je n'ai pas essayé de compiler, mais

S1 & (/S2) = L1 (/S1) & S2 = /L1

doit pouvoir s'écrir :

    digitalWrite(led1, (digitalRead(contact2) == true && digitalRead(contact) == false));
    digitalWrite(led2, (digitalRead(contact) == true && digitalRead(contact2) == false));

Edit.: Oups! && pas ||

14_ZYG_31: Bonsoir,

Bon, j'ai testé vos programmes et malheureusement, il ne marche pas. On allume une led mais on peut pas l'éteindre ..... Je vous remercie de votre aide mais on s'éloigne de mon cahier des charges ... Qui est :

je peux te garantir que ca fonctionne parfaitement. maintenant, tout dépend si tu as modifié ou non le code et ce que tu utilise comme bouton.

et si on faisait plus simple...

int led1=10;
int led2=9;

int contact=8;
int contact2=7;

void setup() {
  // put your setup code here, to run once:

  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (contact, INPUT_PULLUP);
  pinMode (contact2, INPUT_PULLUP);
}


void loop() 
{
  // put your main code here, to run repeatedly:
  
  digitalWrite(led1,!digitalRead(contact));
  digitalWrite(led2,!digitalRead(contact2));

}

compile ok pour moi.

reste plus qu'à essayer.

Yan_duino.