Pages: [1] 2   Go Down
Author Topic: Maintien d'une variable (bistable ON / OFF)  (Read 4389 times)
0 Members and 1 Guest are viewing this topic.
Dans l'Espace
Offline Offline
Sr. Member
****
Karma: 1
Posts: 294
ArduinoBot builder \^^/
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour @toutes et @tous

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

- un bp poussoir
- une led
- mon arduino

avec comme code :
Code:
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  smiley-sad )

Merci d'avance smiley-grin
Logged

Proverbe Tibétain : Un mensonge est un saut du haut du toit

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tu compliques drôlement...

Code:
if (bouton==1){
 led =! led;
}
Logged

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

Dans l'Espace
Offline Offline
Sr. Member
****
Karma: 1
Posts: 294
ArduinoBot builder \^^/
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Jean-François :  smiley-eek et ça marche ?? pourrais-tu préciser ton idée ? stp  smiley-slim
Logged

Proverbe Tibétain : Un mensonge est un saut du haut du toit

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

L'état de la led est inversé à chaque appuis sur le bouton.
Logged

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

Dans l'Espace
Offline Offline
Sr. Member
****
Karma: 1
Posts: 294
ArduinoBot builder \^^/
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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 ?  smiley-confuse
Logged

Proverbe Tibétain : Un mensonge est un saut du haut du toit

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Oui c'est ça, mais j'ai peut-être fait une erreur :

Code:
etat_led = !etat_led

à la place de :

Code:
etat_led != etat_led


et mets ça :

Code:
bolean ETAT_LED=LOW;

à la place de :

Code:
int ETAT_LED=LOW;
« Last Edit: January 26, 2011, 01:17:18 pm by Jean-François » Logged

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

Dans l'Espace
Offline Offline
Sr. Member
****
Karma: 1
Posts: 294
ArduinoBot builder \^^/
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Jean-françois : Merci \^^/ mais  smiley-sad
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 smiley-sad

Au départ j'étais parti sur ce programme :
Code:
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-confuse  smiley-roll-sweat smiley-sad

Merci d'avance et désolé pour ces questions. smiley
Logged

Proverbe Tibétain : Un mensonge est un saut du haut du toit

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Essaye ça :

Code:
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);
}
« Last Edit: January 26, 2011, 01:55:41 pm by Jean-François » Logged

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

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 104
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

dans les exemples du soft arduino il y a plusieurs exemples, si l'on est pas anglophobe cela peut aider  smiley-lol
je crois que c'est le sketch "debounce" qui correspond à ce cas de figure.
Logged

J'apprends tous les jours!

Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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.  smiley-confuse (en fait Debonce est pour l'anti-rebond)
« Last Edit: January 27, 2011, 02:28:03 am by Jean-François » Logged

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

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3756
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged


Forum Moderator
Geneva
Offline Offline
Faraday Member
*****
Karma: 30
Posts: 3231
Yoplait... le pt'it suisse
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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  smiley-wink
« Last Edit: January 27, 2011, 06:24:47 am by Jean-François » Logged

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

Dans l'Espace
Offline Offline
Sr. Member
****
Karma: 1
Posts: 294
ArduinoBot builder \^^/
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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 smiley-grin
MERCI smiley encore smiley-razz
Logged

Proverbe Tibétain : Un mensonge est un saut du haut du toit

Dans l'Espace
Offline Offline
Sr. Member
****
Karma: 1
Posts: 294
ArduinoBot builder \^^/
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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:
    delay(5);
par
Code:
    delay(2);
ça évite de bugger si j'actionne rapidement le bp

MERCI encore @toutes et @tous pour votre précieuse aide  smiley-cool
Logged

Proverbe Tibétain : Un mensonge est un saut du haut du toit

Pages: [1] 2   Go Up
Jump to: