<RESOLU>FastLED - Allumage/extinction progressif d'une ou plusieurs LED

Bonjour,

Je suis en train de concevoir un projet pour enfant et je suis en train de rager pour allumer et éteindre de manière progressive 3 leds WS2812B avec la syntaxe de la bibliothèque FASTLED.

Tout se passe dans la sous fonction void AllumagePulsat(), j'incrémente par pas de 1 la variable définissant la brillance (brightnessc) de 0 à 255. Quand j'arrive à 255 j'inverse la valeur du pas.

Quand j'affiche dans le moniteur la valeur de la brillance(brightnessc) : je vois bien la variation (valeur qui croit jusqu'à 255 puis décroit jusqu'à 0 etc...). Mais physiquement on dirait que les Leds s'éteignent presque juste après avoir atteint le max de luminosité ( 255).

Sur le screenshot du serial plotter on voit que la pente 225>0 est plus brutale que celle du 0>255. donc je comprends l'effet perçu.

--> Néanmoins je fais appel à la communauté pour voir si quelques choses cloches avec mon code pour avoir la même pente d'allumage qu'à l'extinction.

Même si ici je partais sur une structure de machine à état, Je n'aime pas les fonctions bloquantes il n'y pas de boucle for ni de delay --> est-ce que cela peut être une cause ?

Est-ce qu'il n'y a pas un phénomène de "repli" à 0 de la valeur de brillance car je suis au borne de son registre de déclaration (brightnessc est un byte) ? :man_shrugging:

Coté soft : Arduino IDE 2.3.3
Coté Hard : Arduino Nano.

Mon code complet ci-dessous, merci ppur votre temps et votre aide à m'améliorer.

Aurélien.

#include <FastLED.h>
#define FASTLED_ALLOW_INTERRUPTS 0
FASTLED_USING_NAMESPACE

//  ========== DÉCLARATION DES VARIABLES ===========
//Entrées
const byte bp1CORAIL = 3;
const byte bp2HIPPO = 4;
const byte bp3REQUIN = 5;
const byte bp4ETOILE = 6;
const byte bp5POISSON = 7;
const byte bp6RAIE = 8;


//Internes
unsigned long currentMillis;
unsigned long previousMillis = 0;
unsigned long prevMilMaint = 0;
unsigned long prevMilEtat = 0;
unsigned long dureeAnim = 8000;

const String NomEtat;

const byte NUM_LEDS = 10;  //------> Valeur du nombre de Leds
byte PREM_LED;
byte DER_LED;

byte brightnessc;
byte incrementBri = 1;

#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];  // Création d'un tableau de LEDs
CRGB couleurLED;

//Sorties
const byte ledOK = 0;
const byte DATA_PIN = 10;


//-------------------------------------------------


void AllumagePulsat() {

  brightnessc = brightnessc + incrementBri;

  fill_solid(&leds[PREM_LED], DER_LED - PREM_LED + 1, couleurLED);
  FastLED.setBrightness(brightnessc);
  FastLED.show();

  if (brightnessc <= 1 || brightnessc >= 255) {
      incrementBri = !incrementBri;
    }
}


//---------------------------------------------------------------------
//----------------------------- S E T U P -----------------------------

void setup() {

  Serial.begin(9600);

  //Initialisation broche d'entrée
  pinMode(bp1CORAIL, INPUT_PULLUP);
  pinMode(bp2HIPPO, INPUT_PULLUP);

  //Initialisation broche de sortie
  pinMode(ledOK, OUTPUT);
  digitalWrite(ledOK, LOW);

  PREM_LED = 0;
  DER_LED = NUM_LEDS;
  brightnessc = 0;
  FastLED.clear();  // cette instruction efface la consigne d'allumage -> revient à dire : consigne allumage = 0 leds.
  FastLED.show();   // cette instruction active l'affichage des leds suivant une consigne amont. Ici elle est égale à zéro (voir instruction précédente) --> donc le bandeau va s'éteindre complètement.

  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS)
    .setCorrection(TypicalLEDStrip);
  // FastLED.setMaxPowerInVoltsAndMilliamps(5, MAX_POWER_MILLIAMPS);
  FastLED.setBrightness(255);
}
//---------------------------------------------------------------------
//---------------------------------------------------------------------

//---------------------------------------------------------------------------------------
//----------------------------- L O O P - BOUCLE PRINCIPALE -----------------------------
void loop() {

  currentMillis = millis();

  digitalWrite(ledOK, HIGH);

  enum tEtats  //================ Définition des états de la machine à états======================
  {
    ATTENTE,  // 0
    CORAIL,   // 1
    HIPPO,    // 2
    REQUIN,   // 3
    ETOILE,   // 4
    POISSON,  // 5
    RAIE,     // 6
  };

  static tEtats etat = ATTENTE;  // Initialisation de etat sur la valeur ATTENTE

  switch (etat) {

    case ATTENTE:
      FastLED.clear();
      FastLED.show();
      brightnessc = 0;
      NomEtat = "ATTENTE";

      if (digitalRead(bp1CORAIL) == LOW) {
        PREM_LED = 0;
        DER_LED = 2;
        brightnessc = 0;
        couleurLED = CRGB::Red;
        etat = CORAIL;
      }
      if (digitalRead(bp2HIPPO) == LOW) {
        etat = HIPPO;
      }

      break;

    case CORAIL:

      NomEtat = "CORAIL";

      AllumagePulsat();

      if (currentMillis - prevMilEtat > dureeAnim) {
        prevMilEtat = currentMillis;
        etat = ATTENTE;
      }


      break;

    case HIPPO:

      NomEtat = "HIPPOCAMPE";
      couleurLED = CRGB::BlueViolet;
      fill_solid(&leds[4], 3, couleurLED);
      FastLED.setBrightness(255);
      FastLED.show();

      if (currentMillis - prevMilEtat > dureeAnim) {
        prevMilEtat = currentMillis;
        etat = ATTENTE;
      }


      break;

    case REQUIN:


      break;

    case ETOILE:


      break;

    case POISSON:


      break;

    case RAIE:


      break;
  }

  // ----------------MODE MAINTENANCE : AFFICHAGE MONITEURS SERIE----------------

  if (currentMillis - prevMilMaint > 100) {
    prevMilMaint = currentMillis;

    //Serial.print("Etat activé:");
    // Serial.println(NomEtat);  //affiche l'état toutes les 800ms.

    Serial.print("valeur brillance:");
    Serial.println(brightnessc);  //affiche l'état toutes les 800ms.

    // Serial.print("etatbp1CORAIL:");
    //Serial.println(digitalRead(bp1CORAIL));

    //Serial.print("etatbp2hippo:");
    //Serial.println(digitalRead(bp2HIPPO));
  }
}

saisissez ou collez du code ici

Bonjour,

Je suppose que ce que tu veux faire c'est
incrementBri = -incrementBri;

De plus tu as défini incrementBri comme byte, il ne peut pas être négatif. Il faut le définir comme int

:clown_face:Roooh p***** je me sens tellement nul de ne pas avoir regardé tout simplment ça... c'était bien l'incrément à passer en int merci bcp!

Sur le coup j'ai testé mais ça ne fonctionnait qu'une fois c'est à dire que mon changement d'état ne fonctionnait qu'une seule fois. j'ai du veiller à bien initialiser la luminosité et le pas comme ceci avant d'aller sur l'état qui génère cette animation :

 brightnessc = 0;
 incrementBri = -1;

merci en tout cas :slight_smile: :saluting_face:

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