[Projet fini] Lumino-cube avec FastLED

Bon, ça fait un moment que je voulais faire un topic pour présenter mon mini-projecteur maison :
Le code :

///////////////////////////////code teste du bouton./////////////////////

#include <FastLED.h> // inclusion de la librairie fastLED.h

#define NUM_LEDS 64 // définition du nombre de led, ici 64
#define DATA_PIN 2 // définition de la pin du ruban de led, la D2
#define CLOCK_PIN 13
#define pinbuton 12 // definition pin du bouton, la D12

bool etatbuton = 0; // création de la variable bool de l'état du bouton, "etatbuton"

CRGB leds[NUM_LEDS]; // création d'une liste de leds

void setup() // Au demarage ("void setup()")
{
  pinMode(pinbuton, INPUT_PULLUP); // definition état de la pin du bouton a "INPUT_PULLUP"
  Serial.begin(115200); // vitesse de communication mise a 115200 bauds
  Serial.println("demarage du systeme :"); // ecrire "demarage du systeme :" au démarage sur le moniteur serie.
  FastLED.addLeds<WS2812,DATA_PIN,RGB>(leds,NUM_LEDS);
  FastLED.setBrightness(80); // mettre la luminosité a 80 %
  fill_solid(leds, NUM_LEDS, CRGB::Black); // par défaut, couleur noir
  FastLED.show();
}

void fadeall() { for(int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); } }

void loop() 
{ 
  etatbuton = digitalRead(pinbuton); // lire l'état du bouton et stocker la valeur sur la variable bool "etatbuton"

  if(etatbuton == 1) // si le bouton est pressé, qu'il est a 1
  {
    static uint8_t hue = 0;
  Serial.print("x");

  for(int i = 0; i < NUM_LEDS; i++) 
  {
    leds[i] = CHSV(hue++, 255, 255);
    FastLED.show(); 
    fadeall();
    delay(10);
  }
 Serial.print("x");
 
  for(int i = (NUM_LEDS)-1; i >= 0; i--) 
  {
    leds[i] = CHSV(hue++, 255, 255);
    FastLED.show();;
    fadeall();
    delay(10);
  }
  delay(10000);
 }
 else if(etatbuton == 0) 
 {
  fill_solid(leds, NUM_LEDS, CRGB::Black);
  FastLED.show();
 }
}

Bon, voici a quoi il ressemble :
image

image

Bon, je sais qu'il ne fait pas très fini, mais c'est un prototype.
J'en ai fais un deuxième pour des potes ( anniversaire ) en PLA, avec une pro mini, au lieu d'une Nano pour celui ci. Voici une photo du câblage :
image
Le bouton bleu en haut arrête la matrice ou non en coupant son alimentation ( 5V ) Le bouton noir en bas change le mode entre mode blanc ( éclairage ) et mode fête ( multicolore ).

Améliorations probables ( quand j’aurai plus d'expérience en programmation :wink: ) :

  • Retirer la carte Arduino et la remplacer par une carte D1 - mini ( conseillée par Abrège ( Youtube, je sais c'est pas bien :slight_smile: )
  • En plus des leds, rajouter soit un DHT22, soit carrément un BMP280. Le D1Mini enverra alors toutes les valeurs en Wifi.
  • Crée une appli je ne sais comment pour avoir les valeurs température - humidité - pression atmosphérique sur une belle petite interface, et également pouvoir activer / désactiver les leds et leurs modes.

Cordialement
Pandaroux007 ou Rémi

Vérification d'une possibilité de réparation de matrice à LEDs R.G.B (64) type WS2812B

4 Likes

Sympa !
Tu peux poster une vidéo ou des photos du cube en fonctionnement ?

Super!
Même remarque que @lesept

:star_struck:
Trés joli! AVec un code tout petit,on fait de grandes choses!
Ça tient combien de temps sur batterie(le temps d'une soirée ou pas :smiley:)

Tu pourrais aussi poster ton fichier 3d,pour les gens qui ne savent pas modéliser ou juste les mesures de l'engin,pour ceux qui veulent le reproduire.

Mais bravo sinon!!

Ça convient ou pas ceci?(Pour le réalisation)

Je ne suis pas sûre que les 5050 soit le plus adapter, mais d'autre que moi plus expérimenté pourrait mieux de renseigner.
Pour la consommation, ce genre de LED sont généralement limité à 20mA par couleur(RVB), soit 60mA par LED allumées.
donc si tu les allumes toutes en demandant du blanc, tu aura 64*60mA = 3840mA, donc si tu as une batterie de cette ordre de capacité, cela tiendra 1 heure.
Tu pourra remarqué que j'ai omis la consommation du µC qui est non négligeable.

Bon c’est bien de connaître les limites de ses propres projets :wink:
Ça permet de faire mieux la prochaine fois et d’évoluer.
En tout cas c’est déjà bien pour un petit bonhomme de 12 ans.
Félicitations Rémi

Bravo à toi ! Continue ainsi ! (Ça ressemble à une remarque de prof)

Pour code, utilise le raccourci Ctrl-T pour le formatage automatique.
Il permet en général de rendre ton code plus lisible.

Ça donne ça :

///////////////////////////////code teste du bouton./////////////////////

#include <FastLED.h>  // inclusion de la librairie fastLED.h

#define NUM_LEDS 64  // définition du nombre de led, ici 64
#define DATA_PIN 2   // définition de la pin du ruban de led, la D2
#define CLOCK_PIN 13
#define pinbuton 12  // definition pin du bouton, la D12

bool etatbuton = 0;  // création de la variable bool de l'état du bouton, "etatbuton"

CRGB leds[NUM_LEDS];  // création d'une liste de leds

void setup()  // Au demarage ("void setup()")
{
  pinMode(pinbuton, INPUT_PULLUP);          // definition état de la pin du bouton a "INPUT_PULLUP"
  Serial.begin(115200);                     // vitesse de communication mise a 115200 bauds
  Serial.println("demarage du systeme :");  // ecrire "demarage du systeme :" au démarage sur le moniteur serie.
  FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
  FastLED.setBrightness(80);                // mettre la luminosité a 80 %
  fill_solid(leds, NUM_LEDS, CRGB::Black);  // par défaut, couleur noir
  FastLED.show();
}

void fadeall() {
  for (int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); }
}

void loop() {
  etatbuton = digitalRead(pinbuton);  // lire l'état du bouton et stocker la valeur sur la variable bool "etatbuton"

  if (etatbuton == 1)  // si le bouton est pressé, qu'il est a 1
  {
    static uint8_t hue = 0;
    Serial.print("x");

    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CHSV(hue++, 255, 255);
      FastLED.show();
      fadeall();
      delay(10);
    }
    Serial.print("x");

    for (int i = (NUM_LEDS)-1; i >= 0; i--) {
      leds[i] = CHSV(hue++, 255, 255);
      FastLED.show();
      ;
      fadeall();
      delay(10);
    }
    delay(10000);
  } else if (etatbuton == 0) {
    fill_solid(leds, NUM_LEDS, CRGB::Black);
    FastLED.show();
  }
}

Et pour améliorer le code (optimisation en rapidité, lisibilité, mémoire utilisée, FAUTES D'ORTHOGRAPHE), je t'ai fait une autre version :grinning: :


#include <FastLED.h>  //Inclusion de la librairie fastLED.h

#define NUM_LEDS 64  //Définition du nombre de led, ici 64
#define DATA_PIN 2   //Définition de la pin du ruban de led, la D
#define CLOCK_PIN 13
#define pinbuton 12  //Définition de la broche sur laquelle est reliée le bouton

CRGB leds[NUM_LEDS];  //Création d'une liste de leds

void setup() {                                   //Initialisation
  Serial.begin(115200);                          //Vitesse de communication mise à 115200 bauds
  Serial.println("Demarage du systeme réussi");  //Affiche "Demarage du systeme réussi" dans le moniteur série.

  pinMode(pinbuton, INPUT_PULLUP);  //Met la broche où le bouton est connectée avec une résistance de tirage interne.

  FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
  FastLED.setBrightness(80);                //Met la luminosité des LEDS à 80 %.
  fill_solid(leds, NUM_LEDS, CRGB::Black);  //Par défaut, couleur noire
  FastLED.show();
}

void fadeall() {
  for (int i = 0; i < NUM_LEDS; i++) { leds[i].nscale8(250); }
}

void loop() {
  if (digitalRead(pinbuton)) {  //Si le bouton est pressé
    static uint8_t hue = 0;

    Serial.print("x");
    for (int i = 0; i < NUM_LEDS; i++) {
      leds[i] = CHSV(hue++, 255, 255);
      FastLED.show();
      fadeall();
      delay(10);
    }
    Serial.print("x");

    for (int i = (NUM_LEDS)-1; i >= 0; i--) {
      leds[i] = CHSV(hue++, 255, 255);
      FastLED.show();
      fadeall();
      delay(10);
    }
    delay(10000);
  } else {
    fill_solid(leds, NUM_LEDS, CRGB::Black);
    FastLED.show();
  }
}

Je n'ai pas testé, mais il devrait autant fonctionner.

Pourquoi ?

Merci @terwal!
C'est super @pandaroux007!

Avec plaisir :slightly_smiling_face: :
Mode blanc :
image
Bon, j'ai l’impression que mon ordi ne veut pas mettre des vidéos depuis mon appareil :sweat:
Pour le mode multicolore, comme c'est impossible de prendre en photo de la lumière colorée qui bouge, je ne peux pas en mettre :sob:
C'est dommage, c'est le plus cool :wink:

Cordialement
Rémi

P.S : je sens que je vais décevoir certains quant a mes capacités de programmation, mais c'est pas moi qui est pondu ce code, en tous cas la partie multicolore, j'ai juste adapté le code avec des trucs un simples... Ça viens de la :

Donc, pour répondre a ça :

Je ne sais pas, on peut le supprimer... :sweat:

Merci beaucoup, @techvij :wink:

Bonsoir @pandaroux007,est ce que vous purriez juste postez une photo du mode multicolore(pour voir)
Merci!

ba justement, comme je le dis là :

je ne peux pas faire de vidéo, car mon P.C convertie les vidéos en photo et du coup c'est flou...
Je vais encore tenter, mais je garantie rien... :innocent:

Non,juste une petite photo,pas forcément animé. :smiley:

image
Voila :innocent: toujours pas de vidéo, désolé...

1 Like

Bravo Rémi :wink:

Bonjour
J'ai voulu faire une mise a jour du code en changeant cette ligne :

FastLED.addLeds<WS2812,DATA_PIN,RGB>(leds,NUM_LEDS);

par celle ci :

FastLED.addLeds<WS2812B,DATA_PIN,RGB>(leds,NUM_LEDS);

Car je me suis aperçu que ce n'était pas les bonnes LEDs... Malheureusement, le cube ne s'allume plus. Je vais devoir faire une opération a cœur ouvert... Le code est bon, il compile et ce téléverse parfaitement, et juste avant de faire cette modif, le code fonctionnait ( les deux modes ). C'est incompréhensible, c'est un problème hardware, un faut contacte probablement...


C'est par ailleurs le bon moment pour le modifier avec le BMP280. Malheureusement, les achats sont contres moi, je me suis fait avoir... Comme un idiot, j'ai acheté sans me renseigner, et je ne connaissais pas la différence entre BMP280 et BME280 - qui lui fait aussi l'humidité... - il ne donnera donc pas toutes les valeurs... dommage :sneezing_face: :woozy_face:

Cordialement
Pandaroux007

Le sens des données pour des WS2812B est en GRB il e semble. Donc pour l'initialisation on mettra GRB au lieu de RGB. Je ne sais plus où en tout cas.

Bonjour

C'est FAUT ! il n'était pas bon, j'avais changé une ligne non pas dans le programme définitif, mais dans un projet test...
Petite photo de l'opération à cœur ouvert - qui m'a au passage permis de découvrir un court-circuit :smirk:
image
Peut-être bientôt un ajoute d'un de mes BMP280 inutiles ?

Cordialement
Pandaroux007

Bonjour
Mise à jour du projet :

  • le problème rencontré venais d'un mélange de version, mais j'ai remis ça au propre et maintenant, ça fonctionne.
  • Comme le boîtier était ouvert, j'en ai profité pour ajouter une LED verte pour indiquer quand il est allumé.
  • J'ai aussi retourné la carte à l’intérieur pour éviter d'avoir la lumière rouge de la LED 13 de la carte filtrer au travers de la matrice à LEDs (ce qui justifie l'ajout de la LED verte sur le dessus du boîtier).

Voici le câblage et une petite vidéo :

Câblage


NB : j'avais pas le temps de mettre les boutons, désolé...

Vidéo

https://youtu.be/uR0b38wNok0

Cordialement
R-P7

Déjà, un petit message d'encouragement pour ce jolie projet.

Je pense que tu devrais réencoder ta vidéos pour avoir une meilleur qualité.
J''ai l'impression que tu as poussé la compression un peu trop ?