[réglé] Help modifier luminosité d'une LED par Bouton.

Bonsoir tout le monde,

Comme dit dans ma présentation, je suis tout nouveau dans le monde Arduino. J'ai acheté le bouquin "Démarrez avec Arduino" de Massimo Banzi et suis pas à pas les montages de ce dernier. Toutefois je bloque sur le code de l'exemple 05. En gros, il s'agit de modifier l'intensité lumineuse d'une LED suivant la durée d'appui sur un bouton. Un appui bref allume et eteint la diode, un appui long augmente l'intensité. Un montage assez simple en soi. Mais j'ai beau suivre à la lettre les indications du dit livre, ça ne fonctionne pas. Lorsque j'appuie sur le bouton, brièvement ou longuement, la diode s'allume, mais c'est tout. Rien d'autre ne se passe. Voici le code que j'ai écrit, si vous avez une idée de ce qui cloche.

Merci d'avance! :)

// Ex_05 Allumage led en pressant le bouton, et la maintient apres relachement
// inclut une tempot anti rebond, et si le bouton reste appuyé, la luminosité change

/*Déclaration des variables et constantes */

const int LED = 9; // patte pour LED 9
const int BUTTON = 7; 

int val = 0 ; // sauve l'état du bouton
int old_val = 0; // sauve précédente valeur de val
int state = 0; // 0 = led off, 1 = Led ON
int brightness = 64 ; // sauve la luminosité
unsigned long startTime = 0 ; // instant début d'appui de bouton


void setup() {

  pinMode(LED, OUTPUT); // Patte 9 en sortie
  pinMode(BUTTON, INPUT); // bouton en entrée

}

void loop() {

  val = digitalRead(BUTTON); // lit et sauve l'état du bouton

  // Test si il y a un chamngement d'état
  if ((val == HIGH) && (old_val == LOW)) {
    state = 1 - state; // inverse l'état de la led
    startTime = millis(); // millis() horloge de la carte
                // Temps en ms depuis le démarrage de la carte
                // enregistre quand le bouton a été pressé

                delay(10);

    // teste si le bouton est maintenu appuyé
    if ((val == HIGH) && (old_val == HIGH)) {
      // si bouton appouyé plus de 500ms
      if (state == 1 && (millis() - startTime) > 500) {
        brightness++ ; // plus lumineux de 1 (brightness +1 = brightness++
        delay(10); // tempo pour allumage progressif

        if (brightness > 255) { // 255 = maxi
          brightness = 0; // si on dépasse 255, on retourne à 0
        }
      }
    }

    old_val = 1; // sauve l'ancienne valeur de val
    if (state == 1) {
      analogWrite (LED, brightness); // allume la LED
    }
    else {
      analogWrite (LED, 0); // eteint la led
    }
  }

}

Bonsoir, Es-tu sur que c'est l'exemple du livre ? Peut être une version déjà modifiée par tes soins. ;)

Bonsoir,

bmushu:     old_val = 1; // sauve l'ancienne valeur de val

Cette ligne n'est pas logique. Essaie plutôt avec :

    old_val = val; // sauve l'ancienne valeur de val

Bonsoir vous deux, Merci pour vos réponses.

Icare, oui c'est bien la version du bouquin, seuls les commentaires sont modifiés!

Haifger, je viens d'essayer, mais il n'y a pas de changement.. :(

Je vais continuer à chercher... :sweat_smile:

bmushu: Haifger, je viens d'essayer, mais il n'y a pas de changement.. :(

Ah bah c'est qu'il doit y avoir plusieurs problèmes alors :) L'accolade fermante du premier if est probablement mal placée : la logique voudrait qu'elle se trouve entre l'instruction delay(10); et le deuxième if, mais là elle est tout à la fin du programme.

Suis d'accord avec haifger ... Tu n'entres dans l'ensemble des tests que si old_val == LOW ... Et comme dans le test imbriqué ou tu compte le temps d'appui tu testes si old_val== HIGH et qu'entre temps rien ne change old_val ... Et bien tu n'entres jamais dans le comptage de durée d'appui

Aaaah! Merci beaucoup pour cette explication! Ça fonctionne!

J'ai avancé dans ma compréhension grâce à vous!

:%