Aide avec carte Arduino + Ruban LED

a marqué ce sujet comme résolu.

Bonjour à toutes et à tous.

Je me présente je suis étudiant en design d’interaction.

Je bénéficie d’un MacBook, d’une carte Arduino UNO, d’un câble USB A Mâle/B Mâle et d’un ruban de LED WS2812b.

Voilà je viens solliciter votre aide, je travaille sur un projet, mon but étant de créer une « lampe nuage » (à l’aide de cotons et avec le matériel que j’ai investi) qui évolue au fil de la journée (exemple : à 09:00 le ruban LED est bleu, à midi la couleur devient bleue-violette, à 19:00 elle devient complètement violette…).

Alors pour ce fait j’ai connecté la carte au ruban LED.

Je n’ai jamais fais de codage de ma vie, cependant après de longue fouilles et recherches j’ai réussi à allumer mon ruban LED d’une couleur verte ! (Youpiiii ✊😂). Cela s’allume LED par LED jusqu’au bout du ruban puis ça recommence.

Je viens solliciter votre aide car j’aimerai pouvoir réaliser en codage ce dont j’ai parlé juste avant (les lumières qui change en fonction des heures…)

Pouvez-vous m’aider ? Comme je l’ai dis je n’ai jamais fait de codage et j’aimerai mener à bien ce projet qui me tient à cœur…

Merci d’avance ! ❤️

Bonjour @nxttx !

On voudra bien t’aider pas d’inquiétude. Par-contre, il faut que tu nous aides à t’aider. :)

Par exemple, quel est ton code pour l’instant ? Quel sont tes branchements ? Tu arrives à changer la couleur ? Tu as quoi comme alimentation ? C’est quoi ce ruban à LED, il a l’air d’être RGB (Red Green Blue, donc capable d’afficher une palette de couleurs !)

Je n’ai jamais fais de codage de ma vie, cependant après de longue fouilles et recherches j’ai réussi à allumer mon ruban LED d’une couleur verte ! (Youpiiii ✊😂).

\o/ 🥳
C’est comme ça qu’on avance. Petit à petit.

Bon, j’aimerais bien comprendre au juste ce que tu veux faire. Tu veux allumer l’ensemble des led du ruban à led ou juste une led par une led et changer la couleur au fil de la journée ? ^^

+1 -0

voici mon code :

//Libraries
#include <FastLED.h>

//Constants
#define NUM_STRIPS 1
#define NUM_LEDS 60
#define BRIGHTNESS 10
#define LED_TYPE WS2812B
#define COLOR_ORDER BRG//RGB
#define FASTLED_ALLOW_INTERRUPTS 0
#define FASTLED_INTERRUPT_RETRY_COUNT 1
#define FRAMES_PER_SECOND 60
#define COOLING 55
#define SPARKING 120

//Parameters
const int stripPin  = 3;

//Variables
bool gReverseDirection  = false;

//Objects
CRGB leds[NUM_LEDS];

void setup(){
//Init Serial USB
Serial.begin(9600);
Serial.println(F("Initialize System"));
//Init led strips
FastLED.addLeds<LED_TYPE, stripPin, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(  BRIGHTNESS );
}

void loop(){
ledScenario();
}

void ledScenario(void ){/* function ledScenario */ 
////LEDS Strip scenario
for(int i=0;i<NUM_LEDS;i++){
      //leds[i] = CRGB::Goldenrod;
      leds[i].setRGB(255,0,255);
      leds[i+3].setRGB(255,0,255);
      FastLED.show();
      delay(100);
      leds[i] = CRGB::Black;
      FastLED.show();
      delay(100);
}}
+0 -0

Salut,

Bienvenue sur Zeste de Savoir !

J’ai pris la liberté d’éditer ton code pour le rendre lisible. Tu peux éditer ton message pour voir comment j’ai fait, à savoir ajouter des triples backticks avant et après le code. :)

Je t’invite notamment à lire ce tutoriel concernant l’utilisation du markdown pour rendre les messages lisibles.

+0 -0

Un grand merci d´avoir rendu mon code visible, c´est tout de suite beaucoup plus clair que le gros pavé initial :p

Maintenant j’aimerai savoir comment passer du vert au bleu puis du bleu…. petit à petit jusqu’au violet progressivement sur une journée (environ 12:00) sans passer par un RTC. Genre dès que mon arduino est branché j’aimerai que mon ruban LED s’allume entièrement et que la couleur change progressivement (en restant dans des tons un peu froid) sur une journée, l’utilité finale étant de pouvoir être guidé sur une journée en fonction de la couleur. (ça fonctionnerait comme un arc en ciel mais super lent du coup !…)

Le code que j’ai fais n’est pas représentatif du rendu souhaité, on va dire que c’était pour m’initié et au moins avoir les bons branchement au bons endroit ce qui était déjà énorme pour moi :p

si quelqu’un est fortiche en codage pour m’aider à réaliser ce que je souhaite je serai béni, j´ai visé haut en voulant faire ce travail alors que je n´ai jamais fais de codage de ma vie ^^ mais je suis certain de faire un super truc au final :)

(3 fils sont reliés entre la carte arduino et le ruban LED (GND, 5V et le pin 3)

:)

+0 -0

(3 fils sont reliés entre la carte arduino et le ruban LED (GND, 5V et le pin 3)

nxttx

Ah ! On a presque toutes les informations pour t’aider ! :D
On avance !

On aurait encore besoin de quelques informations. Combien il y a de LED sur ton ruban à LED ? ^^
Aussi, tu connais un peu les specs de ton ruban à LED ? Car sans ça, ça va être difficile de dimensionner l’alimentation. Pour l’instant tu as quoi comme alimentation ?

Alors voyons les problèmes.

  • Tu veux un truc qui soit en fonction de l’heure de la journée. Le truc c’est que l’Arduino n’a pas d’horloge interne. Donc l’Arduino ne connaît pas l’heure. Tout au plus, ce que tu auras c’est le nombre de secondes depuis que tu as allumé l’arduino. Sinon, il faut une horloge externe. Ce n’est pas forcément un problème grave.
  • Tu utilises le port 5V de l’arduino, il n’y a aucun problème à ça. Si le ruban de LED ne consomme pas trop. Je ne recommanderais pas d’utiliser ce port si ton ruban de LED au total demanderait plus d’1A.
  • Tu n’as pas l’air de comprendre le code que tu as. Ce n’est pas très gênant en soit mais si tu veux faire ce projet et « faire un super truc ». Je pense que tu auras plus de mérite en comprenant le code.

Bon, j’ai 20min à t’accorder on va dire.


for(int i=0;i<NUM_LEDS;i++){
      //leds[i] = CRGB::Goldenrod;
      leds[i].setRGB(255,0,255);
      leds[i+3].setRGB(255,0,255);
      FastLED.show();
      delay(100);
      leds[i] = CRGB::Black;
      FastLED.show();
      delay(100);
}}

L’indentation est super importante ! Sinon c’est vraiment dur à lire. Le code d’où est issue ce bout de code est bien mieux présenter que le tiens donc je vais partir de leur bout de code.

Bon après, la personne qui a écrit le code là-bas n’a pas l’air de comprendre son code non plus. Il y a des variables non utilisées des incohérences.

void ledScenario(void ) { /* function ledScenario */
  ////LEDS Strip scenario
  for (int i = 0; i < NUM_LEDS; i++) {
    //leds[i] = CRGB::Goldenrod;
    leds[i].setRGB(255, 0, 255);
    leds[i + 3].setRGB(255, 0, 255);
    FastLED.show();
    delay(100);
    leds[i] = CRGB::Black;
    FastLED.show();
    delay(100);
  }
}

Eh bien, ici, on parcourt toutes les LEDs. On allume à chaque fois la led courante et une autre LED (??!) d’une couleur verte (ou violet, la couleur complémentaire, ça dépends je suppose d’un paramètre qui m’échappe) pendant 100ms puis on l’éteins (mais pas l’autre LED bizarre) et on passe à la suivante qu’on allume pendant 100ms et ainsi de suite. Très clairement pour moi, la ligne :

  leds[i + 3].setRGB(255, 0, 255);

N’a rien à faire là.

Le truc c’est qu’avec ce code normalement, on devrait avoir un ruban de LED qui affiche au début 2, puis 3, puis 4 Leds. Et qui font la chenille. Bon je me plante peut-être mais c’est comme ça que je lis le code. À cause justement de cette ligne bizarre. Bref :

Pour allumer une LED on fait ça :

  leds[i].setRGB(255,0,255);

Là, on l’allume de la couleur RGB(255, 0, 255) qui correspond à violet normalement. Mais ici, tu affirmes que c’est vert donc bon passons. Ensuite on l’éteins avec :

      leds[i] = CRGB::Black;

Pour appliquer les changements on fait ça :

      FastLED.show();

Donc pour allumer toutes les LEDs on fait comme ça :

for(int i = 0;i < NUM_LEDS;i++) { 
      leds[i].setRGB(255, 0, 255);
}
FastLED.show();
delay(60*1000); // 60secondes donc 1minute

Ok, donc j’allume toutes les LEDs et j’éteins jamais. Je fais une pause de 1minute.

Maintenant, je veux changer la couleur des LEDs. Pour ça, je peux me servir de millis(). Tu dois changer la couleur de setRGB en fonction de millis. Là, c’est plus compliquer. En gros, si tu veux que ça varie sur une durée de 12h. Alors c’est 12*60*60*1000 millisecondes.

Donc en gros ta couleur est :

#define TEMPS_MAX_MS 12*60*60*1000 // 12h converties en ms

unsigned long temps = millis() % TEMPS_MAX_MS;
char greeny = 255 * (temps / (double)TEMPS_MAX_MS)

Et la boucle deviens :

unsigned long temps = millis() % TEMPS_MAX_MS;
char greeny = 255 * (temps / (double)TEMPS_MAX_MS)

for(int i = 0;i < NUM_LEDS;i++) { 
      leds[i].setRGB(255 - greeny, greeny, 255 - greeny);
}
FastLED.show();
delay(60*1000); // 60secondes donc 1minute, on mets moins si on veut actualiser plus rapidement.

C’est un code qui devrait marcher. Mais TRÈS lentement. Le première changement intervient au bout de 3min et il est imperceptible à l’œil nu. Je te conseil de baisser la constante :

#define TEMPS_MAX_MS 12*60*60*1000 // 12h converties en ms

À quelque chose genre 5min

#define TEMPS_MAX_MS 5*60*1000 // 5m converties en ms

Pour tes tests.

Bon courage \o

+0 -0

Merci ache tu es génial ! :D Tes explications points par points mon bien éclairé :) Mon ruban comporte 74 LED actuellement (je l´ai raccourci), (une led tout les 3 cm) et la largeur du ruban est de 1 cm. c´etait le model "3M 200 MP" de couleur blanche :) 5 v par LED et alimenté par la carte arduino branchée a mon macbook par câble USB.

Merci pour le millis j´en avais entendu parlé, dans mon cas cela permet d´éviter d´utiliser le RTC :p

Le code que j’avais fait, fonctionnait comme "une chenille qui s’agrandit" la première LED s’allume puis vient la deuxième, troisième… tout en gardant les précédentes allumées et quand cela arrive au bout cela recommence infiniement :) (que la couleur verte) (mais du coup oui c’etait pas du tout le rendu souhaité x) )

Et du coup oui pour le rendu souhaité : Le ruban led serait vert au depart et au bout de 12:00 deviendrait violet :)

+0 -0

Oh la la !

J’ai bien fais de poser la question o_O 74 LED ?! Par câble USB ? C’est chaud quand même.

Et je te recommande d’utiliser une alimentation externe plutôt que le port 5V de l’arduino (je tenterais pas de demander plus d’1A a ce port or si tu allumes toutes tes LEDs, tu es sur du ~1.5A (à la grosse louche).

Juste au passage, "3M 200MP" ce n’est pas un modèle. C’est juste le modèle de l’adhésif du ruban de LED. 3M, c’est la marque et 200MP c’est leur produit.

Si tu veux plus d’aide, donne nous vraiment le modèle :P

Merci ache tu es génial ! :D Tes explications points par points mon bien éclairé :)

Merci :D
J’accepte l’argent si t’en as trop et que tu veux m’en donner. x)

Le code que j’avais fait, fonctionnait comme "une chenille qui s’agrandit" la première LED s’allume puis vient la deuxième, troisième… tout en gardant les précédentes allumées et quand cela arrive au bout cela recommence infiniement :) (que la couleur verte) (mais du coup oui c’etait pas du tout le rendu souhaité x) )

Oui, ça m’étonne pas. C’est cohérent avec ce que tu dis. Normalement ton code est censé afficher le led en violet mais c’est vert qui est affiché.

leds[i] = CRGB::Black;

Est censé éteindre la LED mais certainement que comme pour le violet qui est l’opposé (donc vert), le noir est l’opposé. Donc normalement, blanc, plus vert, c’est un peu curieux ça.

Bon bref, ce qui m’étonne le plus: Toutes les LEDs peuvent s’allumer au final ?

+0 -0

ah oui haha désolé je t´ai donné la ref du collant ohlala… x) c´est un ruban led RGB WS2812B, 30 led par mètre, je n´ai pas plus de references… et non les led ne s´allume pas jusqu´au bout, et je souhaite garder cette alimentation (12 LED allumées me suffisent pour mon projet) :p

Du coup quel serait le codage type pour passer du vert au violet (pour 12 LED) sur 12:00 (du coup 12 60 60 * 1000) :p

et oui tu as raison pour les couleurs dans mon premier code il indique bien le violet :) (ça apparassait vert car je n´avait pas mis a jour la nouvelle ref) :p

si mon projet marche bien et que je reçois un petit prix promis je partage avec toi xD

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte