Go Down

Topic: Maintien d'une variable (bistable ON / OFF) (Read 4631 times) previous topic - next topic

piflechien54

Bonjour @toutes et @tous

Voilà je souhaite faire ce montage : (pour mon hexapode)

- un bp poussoir
- une led
- mon arduino

avec comme code :
Code: [Select]
if ETAT_BP==APPUI && LED==OFF => LED=ON
if ETAT_BP==APPUI && LED==ON => LED=OFF
if ETAT_BP==PAS_APPUI && LED==OFF => LED=OFF
if ETAT_BP==PAS_APPUI && LED==ON => LED=ON


En gros je cherche à coder un état bistable ON / OFF
ainsi si je relâche le bp poussoir, la led reste allumée et si je rappui, elle s'éteint.

(peut être avec une mémorisation de l'état dans une variable, mais j'ai le même problème : la variable se remet à zéro quand je relâche le bp  :( )

Merci d'avance :D
Proverbe Tibétain : Un mensonge est un saut du haut du toit

Jean-François

Tu compliques drôlement...

Code: [Select]

if (bouton==1){
led =! led;
}
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

piflechien54

@Jean-François :  :smiley-eek: et ça marche ?? pourrais-tu préciser ton idée ? stp  :smiley-slim:
Proverbe Tibétain : Un mensonge est un saut du haut du toit

Jean-François

L'état de la led est inversé à chaque appuis sur le bouton.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

piflechien54

Ok :P
En gros cela donne ça : :smiley-roll-sweat:

Code: [Select]
const int APPUI=0;
const int PAS_APPUI=1;
const int BP=52;
const int LED=13;
int ETAT_BP;
int ETAT_LED=LOW;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BP, INPUT);
  digitalWrite(BP, HIGH) ;
}

void loop()
{
  ETAT_BP=digitalRead(BP);
  if (ETAT_BP==APPUI)
  {
    ETAT_LED != ETAT_LED
  }
 
  digitalWrite(LED,ETAT_LED);


j'ai bon ?  :~
Proverbe Tibétain : Un mensonge est un saut du haut du toit

Jean-François

#5
Jan 26, 2011, 07:11 pm Last Edit: Jan 26, 2011, 07:17 pm by Jean-François Reason: 1
Oui c'est ça, mais j'ai peut-être fait une erreur :

Code: [Select]

etat_led = !etat_led


à la place de :

Code: [Select]

etat_led != etat_led



et mets ça :

Code: [Select]
bolean ETAT_LED=LOW;

à la place de :

Code: [Select]
int ETAT_LED=LOW;
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

piflechien54

@Jean-françois : Merci \^^/ mais  :(
tu as raison en disant :
Quote
ETAT_LED != ETAT_LED;

car
Quote
Opérateurs logiques de comparaison :

    * x == y (x est égal à y)
    * x != y (x est différent de y)
    * x < y (x est inférieur à y)
    * x > y (x est supérieur à y)
    * x <= y (x est inférieur ou égal à y)
    * x >= y (x est supérieur ou égal à y)


Mais le programme ne marche pas :(

Au départ j'étais parti sur ce programme :
Code: [Select]
const int APPUI=0;
const int PAS_APPUI=1;
const int BP=52;
const int LED=13;
int ETAT_BP;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BP, INPUT);
  digitalWrite(BP, HIGH) ;
}

void loop()
{
  ETAT_BP=digitalRead(BP);
  if (ETAT_BP==APPUI)
  {
    digitalWrite(LED,1);
  }
  else
  {
    digitalWrite(LED,0);
  }
}


y-a-t-il pas moyen de le modifier ? pour qu'il fasse comme je le souhaites ? car moi je sèche complètement  :~  :smiley-roll-sweat: :(

Merci d'avance et désolé pour ces questions. :)
Proverbe Tibétain : Un mensonge est un saut du haut du toit

Jean-François

#7
Jan 26, 2011, 07:49 pm Last Edit: Jan 26, 2011, 07:55 pm by Jean-François Reason: 1
Essaye ça :

Code: [Select]

const int BP=52;
const int LED=13;
bolean ETAT_LED=LOW;

void setup()
{
 pinMode(LED, OUTPUT);
 pinMode(BP, INPUT);
  digitalWrite(BP, LOW) ;
}

void loop()
{
 
 if (digitalRead(BP)==1)
 {
   ETAT_LED = !ETAT_LED;
 }
 
 digitalWrite(LED,ETAT_LED);
}
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

fdufnews

En fait ce n'est pas tout à fait aussi simple.
Si tu tiens le bouton appuyé la LED va clignoter. A chaque boucle on rentre dans le IF et on complémente l'état.

En fait il faut:
     - Tester l'appui c'est à dire le changement de l'état repos à l'état actif.
     - Changer l'état de la LED
     - Attendre le retour à l'état repos

Hexa Emails

Bonjour,

dans les exemples du soft arduino il y a plusieurs exemples, si l'on est pas anglophobe cela peut aider  XD
je crois que c'est le sketch "debounce" qui correspond à ce cas de figure.
J'apprends tous les jours!

Jean-François

#10
Jan 27, 2011, 07:26 am Last Edit: Jan 27, 2011, 08:28 am by Jean-François Reason: 1
@fdufnews >  c'est juste j'avais pas pensé à ça...  :smiley-roll:

@ MrAlexis >  J'ai fais des essais avec Debounce et c'est pas encore ça.  :~ (en fait Debonce est pour l'anti-rebond)
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

B@tto

Pour limiter l'effet de rebond ce qui marche très bien c'est de mettre un condo (moi je mets 1µF) sur l'entrée. Sinon au niveau code, si on veut prendre en compte le mentien, il faut faire ça :
Code: [Select]
const int BP=52;
const int LED=13;
bolean ETAT_LED=LOW;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BP, INPUT);
  digitalWrite(BP, LOW) ;
}

void loop()
{
 
  if (digitalRead(BP)==1)
  {
    ETAT_LED = !ETAT_LED;
delay(1);
while (digitalRead(BP)==1) {
}
  }
 
  digitalWrite(LED,ETAT_LED);
}


Valeur du delay() à ajuster.
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Jean-François

#12
Jan 27, 2011, 12:22 pm Last Edit: Jan 27, 2011, 12:24 pm by Jean-François Reason: 1
Là, changement de l'état de la led à chaque appui et l'état de la led est préservé en cas d'appui prolongé :

Code: [Select]
const int BP=52;
const int LED=13;
boolean ETAT_LED=LOW;
boolean ETAT_BP=HIGH;

void setup()
{
 pinMode(LED, OUTPUT);
 pinMode(BP, INPUT);
 digitalWrite(BP, LOW) ;
}

void loop()
{
if(ETAT_BP==HIGH){
 if (digitalRead(BP)==0)
 {
   delay(5);
   ETAT_LED = !ETAT_LED;
   ETAT_BP = LOW;
 }}
 else if(digitalRead(BP)==1){
 
   ETAT_BP=HIGH;}
   digitalWrite(LED,ETAT_LED);

}


+ l'anti rebond de B@tto  ;)
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

piflechien54

@Jean-François, @B@tto, @MrAlexis44600 , @fdufnews :

Merci pour vos conseils et vos codes, j'essaie cela ce jour et vous retournerai les résultats :D
MERCI :) encore :P
Proverbe Tibétain : Un mensonge est un saut du haut du toit

piflechien54

@Jean-François : Merci pour ton programme ça MARCHE \^^/

Code: [Select]
const int BP=52;
const int LED=13;
boolean ETAT_LED=LOW;
boolean ETAT_BP=HIGH;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BP, INPUT);
  digitalWrite(BP, LOW) ;
}

void loop()
{
if(ETAT_BP==HIGH){
  if (digitalRead(BP)==0)
  {
    delay(5);
    ETAT_LED = !ETAT_LED;
    ETAT_BP = LOW;
  }}
  else if(digitalRead(BP)==1){
   
    ETAT_BP=HIGH;}
    digitalWrite(LED,ETAT_LED);

}


J'ai remplacé la ligne :
Code: [Select]
    delay(5);
par
Code: [Select]
    delay(2);
ça évite de bugger si j'actionne rapidement le bp

MERCI encore @toutes et @tous pour votre précieuse aide  8)
Proverbe Tibétain : Un mensonge est un saut du haut du toit

Go Up