Pages: 1 [2]   Go Down
Author Topic: Maintien d'une variable (bistable ON / OFF)  (Read 4127 times)
0 Members and 1 Guest are viewing this topic.
France
Offline Offline
Newbie
*
Karma: 0
Posts: 13
F6GGI
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,
Il existe une  manière plus simple de réaliser cela en utilisant  attachInterrupt
Exemple du site Arduino ( référence langage )

Code:
int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()
{
  state = !state;
}

    * LOW to trigger the interrupt whenever the pin is low,
    * CHANGE to trigger the interrupt whenever the pin changes value
    * RISING to trigger when the pin goes from low to high,
    * FALLING for when the pin goes from high to low.

Il reste à écrire le code de gestion du bouton poussoir ... sur digital pin 2  smiley-wink
Salutations.
Logged

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

Effectivement c'est plus simple....   smiley

d'un autre coté le code que j'ai mis avant permet de faire un changement avec une valeur analogique (pour un seuil par exemple), ce qui peutt être intéressant. smiley-wink

En plus, la place prise n'est pas la même :

avec attachInterrupt()   >>  size: 2462 bytes

Avec mon code              >>  size: 1736 bytes
« Last Edit: January 28, 2011, 01:45:12 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: 3582
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Et encore y'a pas d'anti rebond et de gestion du "rester appuyé"
Logged


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

J'osais pas le dire  smiley-mr-green
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
Newbie
*
Karma: 0
Posts: 13
F6GGI
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
Il est vrai que je n'avais pas considéré l'occupation en mémoire flash aussi j'ai repris mes réflexes AVR Studio.
et j'ai ressorti un programme tiré d'un tutorial  WEB dont voici le code:

Code:
// **********************************************************************
// Télérupteur testé sur Arduino UNO et DUEMILANOVE
// Bouton poussoir sur entrée digitale 2
// LED sur pin 13 ( bien pratique )
// Occupation Flash : [b]506 bytes.[/b]
// **********************************************************************
#define F_CPU 16000000UL       // pas sûr que cela soit nécessaire .....
#define BUTTON_DDR DDRD        // PORTD bouton direction
#define BUTTON_PORT PORTD       
#define BUTTON_PIN PIND         
#define BUTTON_BIT PORTD2 
#define LED_PORT PORTB         
#define LED_BIT PORTB5         
#define LED_DDR DDRB 
#define DEBOUNCE_TIME 25        // delay debounce bouton */
#define LOCK_INPUT_TIME 300     // delai après bouton pressé */

#include "avr\io.h"
#include <util/delay.h>

 
int button_is_pressed()
{       
        if (bit_is_clear(BUTTON_PIN, BUTTON_BIT))
        {
           _delay_ms(DEBOUNCE_TIME);
           if (bit_is_clear(BUTTON_PIN, BUTTON_BIT)) return 1;
        }       
        return 0;
}

void init_io() {       
       
        LED_DDR |= (1 << 5);              //  LED pin 13 en sortie       
        BUTTON_PORT |= _BV(BUTTON_BIT);   //  pull-up résistance pour le bouton
}

void toggle_led()
{
        LED_PORT ^= _BV(LED_BIT);
}

void setup()
{
      init_io();   
}
void loop()
{
     if (button_is_pressed())
     {
      toggle_led();
      _delay_ms(LOCK_INPUT_TIME);
     }
}
Le gain est intéressant smiley
Bien sûr il reste la gestion du maintien  smiley-wink
Salutations.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 55
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour

Je recherche également à faire d'un bouton poussoir une variable bistable. Seulement à la place d'allumer une simple LED je voudrais faire tourner une boucle.

Exemple:

Si j'appuie une fois sur le bouton, 4 leds clignottent une après l'autre à l'infini. Quand je ré-appuie, la boucle s'arrête. Pas besoin de tout le code, mais juste savoir comment introduire la condition pour que la boucle tourne tant qu'on n'a pas ré-appuyé une deuxième fois sur le bouton. (Ce que je n'ai pas trouvé dans le code de la page précédente). Merci !

Edit:

J'ai trouvé une solution peut-être plus courte, celle du compteur : http://arduino.cc/en/Tutorial/ButtonStateChange

Seulement je n'arrive pas à le régler pour que 1x = on et 2x = off. C'est bien dans la partie modulo qu'on règle ça, non ?
« Last Edit: November 21, 2012, 07:25:41 pm by kevo » Logged

France
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

J'ai utilisé avec succés le code énoncé dans ce topic:

Code:

  {
  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);
}

Mais je ne comprends pas tout, et ça me travaille... Serait il possible d'avoir un descriptif plus approfondi du codage de cette bascule ?

Merci
Logged

Arduino Uno Rev3 (Sarter Kit Arduino officiel)

Pages: 1 [2]   Go Up
Jump to: