Projet propagation lumière led adressable bouton

Bonjour la commu !

j'ai récemment commencé à m'intéressé à la programmation sur arduino et j'en suis rendu ici pour faire appel à vos lumières :slight_smile:

Mon projet consiste à travailler avec un ruban led adressable et un bouton qui le commande.
L'objectif est de faire partir un "train de leds" en mode propagation lumineuse à chaque activation du bouton.
Problématique: je 'arrive à fair partir q'un seul "train" à la fois... si j'active 2 ou 3 fois le bouton il n'y a qu'un seul départ et je dois attendre la fin de la loop pour en relancer un autre.

voici mon code actuel :

#include <FastLED.h>
#define NUM_LEDS 200
#define DATA_PIN 6
#define BUTTON_PIN 7
CRGB leds[NUM_LEDS];

unsigned long currentTime=0;
unsigned long previousTime=0;
bool ledState=LOW;

void setup() { 

    Serial.begin(9600);
    FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);  
    pinMode(BUTTON_PIN, INPUT_PULLUP);
    FastLED.setBrightness(100);
}

void loop() { 

  fill_solid(leds, NUM_LEDS, CRGB::Black);
  FastLED.show();

  int valeurBouton = digitalRead(BUTTON_PIN);

  if (valeurBouton == LOW){
    
      for 
      
      (int i=-0; i<= NUM_LEDS; i++) {
     
        
        leds[i] = CRGB:: Red;
        FastLED.show();
        leds[i-2] = CRGB::Black;
        delay(20);  

        // int Reset = digitalRead(BUTTON_PIN);
        } 
        
  } 
}

n'hésitez pas à critiquer mon code je suis complètement novice alors si vous avez d'autres idées je suis très preneur :hugs:
j'ai commencé à étudier la variable "millis" mais je ne sais pas si je suis sur le bon chemin

Merci d'avance pour vos avis

Oui, ton animation est gérer dans une boucle, pendant ton animation, tu ne passe pas sur ta lecture de l'état de ton bouton, il ne peut donc pas être pris en compte.
De plus dans ton animation tu ne tiens pas du tout compte des différents appuis sur ton bouton.

Pour faire cela, il faudrait gérer ton bouton par interruption, pour être avertis, même lorsque tu es dans ton animation et que celle-ci prenne en compte des différents appuis du bouton.

Merci pour ton message !
mais une fois le bouton enclenché au milieu de l'animation, la première animation est redémarrée ou elle continue ?

C'est toi qui programme, donc c'est toi qui décide ce que l'Arduino fait.

Tu peux déjà dans un premier temps, utiliser une interruption pour que ton bouton soit pris en considération immédiatement et relance l'animation du départ.
L'interruption va comme son nom l'indique interrompre le programme en cours, pour exécuter une petite fonction en priorité.

Tu pourrais aussi modifier le code de la fonction loop, pour ne pas utiliser le for est faire qu'une étape de ton animation par appel de la fonction loop, qui est appelé en boucle par le "framework" Arduino

quand tu a appuyer sur le bouton il va faire tourner en boucle ton animation jusqu’à ce quelle a fini (quand quand i a atteint NUM_LEDS donc 200

tu dois dans la boucle for pouvoir tester si le bouton est a nouveau enclencher

Dans ce cas il est plus intéressant d'enlever la boucle for, la à pars la récupération de l'état du bouton, on a du coup deux boucles imbriquées l'une dans l'autre.

Bonjour rob_00

Ce qui veut dire que tu aimerai avoir plusieurs "trains" dans ta rampe, si plusieurs fois le bouton est pressé.

Si ce n'est que à chaque pression, même si une séquence est en route, le train redémarra au début, il suffit d'ajouter ceci dans ta boucle.

if (digitalRead(BUTTON_PIN) == 0)
{
	i = 0;
}		

Cordialement
jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.