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) ?
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