ButtonOnFadingLed.ino

De Wikilipo.
// Getting Started with Arduino
// p. 61
// Example 05: Turn on LED when the button is pressed 
// and keep it on after it is released
// including simple de-bouncing.
// If the button is held, brightness changes.
// Une DEL est allumée par un boutton et reste allumée
// si le bouton est maintenu enfoncé, la DEL varie d'intensité
// April 13, 2012 revised by
// @atelierpdf.com

#define LED 9     // la fiche de DEL (mode PWM)
#define BUTTON 7  // la fiche du poussoir

int val = 0;      // contient l'état du bouton

int old_val = 0;  // contient la version précédente de la variable "val" 
int state = 0;    // 0 = LED étiente while 1 = LED allumée

int brightness = 128;        // la valeur d'intensité de la DEL
unsigned long startTime = 0; // depuis quand le bouton est-il pressé?

void setup() { 
  pinMode(LED, OUTPUT);   // fiche de la DEL comme sortie
  pinMode(BUTTON, INPUT); // fiche du bouton comme entrée 
} 

void loop() {
 
  val = digitalRead(BUTTON); // lecture de l'état du bouton

  // tester s'il y a eu une transition entre en et hors (0/1) 
  if ((val == HIGH) && (old_val == LOW)) {
 
    state = 1 - state; // inverser la valeur d'état

    startTime = millis(); // millis() retourne la valeur de l'horloge de l'arduino
                          // combien de millème de secondes
                          // ont-elles passé depuis que le cuircuit a 
                          // été réinitialisé?
                          // (on se souvient de quand le bouton a été
                          // sollicité la dernière fois)
    delay(10);
  }

  
// tester si le bouton est maintenu enclencché 
  if ((val == HIGH) && (old_val == HIGH)) {

    // si le bouton est maintenu enfoncé pendant plus de 500 milisecondes
    if (state == 1 && (millis() - startTime) > 500) {

      brightness++; // auguementer la luminosité de la LED de 1
      delay(10);    // un délai d'attente pour éviter une
                    // montée en puissance trop rapide

      if (brightness > 255) { // a-t-on atteint le maximum d'intensité?

        brightness = 0; // si l'on a dépassé 255
                        // on retombe à 0
      }
    }
  }

  old_val = val; // la variable "val" est vieille, mettons-la en mémoire

 // si le bouton est enclenché
  if (state == 1) {      
    analogWrite(LED, brightness); // allumons la DEL
                                  // à la valeur actuelle d'intensité
  } else { 
    analogWrite(LED, 0);
  } 
}