Go Down

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

Bernarduino

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

Code: [Select]
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  ;)
Salutations.

Jean-François

#16
Jan 28, 2011, 07:41 am Last Edit: Jan 28, 2011, 07:45 am by Jean-François Reason: 1
Effectivement c'est plus simple....   :)

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. ;)

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

avec attachInterrupt()   >>  size: 2462 bytes

Avec mon code              >>  size: 1736 bytes
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

Et encore y'a pas d'anti rebond et de gestion du "rester appuyé"
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Jean-François

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

Bernarduino

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: [Select]
// **********************************************************************
// 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 :)
Bien sûr il reste la gestion du maintien  ;)
Salutations.

kevo

#20
Nov 21, 2012, 11:01 pm Last Edit: Nov 22, 2012, 01:25 am by kevo Reason: 1
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 ?

terch

Bonjour,

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

Code: [Select]

  {
  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
Arduino Uno Rev3 (Sarter Kit Arduino officiel)

Go Up