Go Down

Topic: [partage] Fonctions pour NéoPixel  (Read 6402 times) previous topic - next topic

fifi82

Dec 05, 2015, 06:18 pm Last Edit: Dec 31, 2015, 09:14 am by fifi82
Bonjour à tous, je viens de recevoir mon ruban de leds programmable WS2812b 1m avec 30 NéoPixels

je commence à faire joujou avec, donc je partage mes premières fonctions si ça peut servir à d'autre:

Code: [Select]

#include <Adafruit_NeoPixel.h>
#define PIN 6 // broche 6
#define nbled 30 // nombre de led du ruban
Adafruit_NeoPixel led = Adafruit_NeoPixel(nbled, PIN, NEO_GRB + NEO_KHZ800);

unsigned long t0,t1=0,t2=0,t3=0,t4=0; // toutes les tempos
byte a,b,p=0; // sert au calcul dans les anim
int d=1,e; // direction des anim
uint32_t c;

void setup() {
  led.begin();
 }

//***************************** loop *********************************
void loop() {
 t0=millis(); // mémorise le temps 
// e=analogRead(A0); // lecture du potard
 if (t0>t3) {p=random(9); t3=t0+10000; t1=0; a=1;} // change le programme toutes les 10 secondes
// if (e) p=0;   // si utilisation du potard
 switch (p) {
    case 0: { prog0(1000);  break; } // potard
    case 1: { prog1(100);  break; } // 50 = temps de changement de led   
    case 2: { prog2(50);  break; } // 20 = vitesse de déplacement
    case 3: { prog3(500); break; } // 500 = vitesse de changement
    case 4: { prog4(100);  break; } // 50 = vitesse de déplacement   
    case 5: { prog5(100);  break; } // 10 = vitesse de déplacement 
    case 6: { prog6(10);  break; } // 10 = vitesse de déplacement   
    case 7: { prog7(10);  break; } // 10 = vitesse de déplacement   
    case 8: { prog8(1000);  break; } // 10 = vitesse de déplacement   
    case 9: { prog9(100);  break; } // 1000 = explosion toutes les seconde 

 }
  led.show();
}

 //**************************** animation 0 ************************** potard
 
void prog0(int t) {
   if (t0>t2)  {c=random(0x1000000); t2+=t;} // choix d'une couleur aléatoire
    a=map(e,0,1023,0,30);
    led.setPixelColor(a,c);
    t3=0;
  if (t0>t1) degrad(10);
 }

//**************************** animation 1 ************************** led aléatoires
void prog1(int t) {
 
  if (t0>t2) {
    c=random(0x1000000); // choix d'une couleur aléatoire
    led.setPixelColor(random(nbled),c); // allume une led au hasard
    t2=t0+t; }
  if (t0>t1) degrad(20); // 20= durée d'extinction des leds
 }
 
//**************************** animation 2 ************************** balayage D/G
void prog2(int t) {   
  uint32_t c=random(0x1000000); // choix d'une couleur aléatoire
  if (t0>t2) {
    led.setPixelColor(a,c);     
    a=a+d; if(a>=nbled) d=-1; if(a<=0) d=1;
    t2=t0+t;}
  if (t0>t1) degrad(10); // 10= durée d'instinction des leds
}

//**************************** animation 3 ************************** led Bleu blanche rouge
void prog3(int t) {   
  if (t0>t2) {
    a=random(nbled/3)*3;
    led.setPixelColor(a,0,0,255); led.setPixelColor(a+1,0xFFFFFF); led.setPixelColor(a+2,255,0,0); // bleu blanc rouge
    t2=t0+t;}
  if (t0>t1) degrad(30); // 20= durée d'exteinction des leds
}

//**************************** animation 4 ************************** balayage à droite
void prog4(int t) {   
  c=random(0x1000000); // choix d'une couleur aléatoire
  if (t0>t2) {
    led.setPixelColor(a,c);     
    a++; if(a>=nbled) a=0;
    t2=t0+t;}
  if (t0>t1) degrad(30); // 5= durée d'instinction des leds
}

//**************************** animation 5 ************************** balayage à droite
void prog5(int t) {   
  c=random(0x1000000); // choix d'une couleur aléatoire
  if (t0>t2) {
    led.setPixelColor(a,c);     
    a--; if(a<=0) a=nbled;
    t2=t0+t;}
  if (t0>t1) degrad(30); // 5= durée d'instinction des leds
}

//**************************** animation 6 ************************** balayage rapide à gauche
void prog6(int t) {   
  c=random(0x1000000); // choix d'une couleur aléatoire
  if (t0>t2) {
    led.setPixelColor(a,0);
    if(a==0) a=nbled+1;
    a--;
    led.setPixelColor(a,c);         
    t2=t0+t;}
}
//**************************** animation 7 ************************** balayage rapide à gauche
void prog7(int t) {   
  c=random(0x1000000); // choix d'une couleur aléatoire
  if (t0>t2) {
    led.setPixelColor(a,0);
    if(a==nbled) a=1;
    a++;
    led.setPixelColor(a,c);         
    t2=t0+t;}
}

//**************************** animation 8 ************************** explosion D & G
void prog8(int t) {
 
  if (t0>t2) {
    c=random(0x1000000); // choix d'une couleur aléatoire
    a=random(nbled);
    b=1;t4=t0+200; // tempo vitesse éclatement
    led.setPixelColor(a,c);
    t2=t0+t; }
   if (t0>t4){ 
    if (b<7) {led.setPixelColor(a+b,c);led.setPixelColor(a-b,c); b++;}
    t4=t0+50;
   }
  if (t0>t1) degrad(10);
 }
 
//**************************** animation 9 ************************** led Bleu blanche rouge décal
void prog9(int t) {   
  if (t0>t2) {
    a++; if(a>nbled) a=0;
    led.setPixelColor(a,0,0,255); led.setPixelColor(a+1,0xFFFFFF); led.setPixelColor(a+2,255,0,0); // bleu blanc rouge
    t2=t0+t;}
  if (t0>t1) degrad(10); // 20= durée d'exteinction des leds
}

//******************************** dégrade les leds allumées les éteint en douceur *********************************
void degrad(int t){ // t détermine la vitesse d'extinction des leds
  for(int i=0; i<nbled; i++) {
    uint32_t c = led.getPixelColor(i); // extraction des couleurs
    byte r =   c / 0x10000;
    byte v = ( c & 0xFF00)/0x100;
    byte b =   c & 0xFF;
    led.setPixelColor(i,r/1.05,v/1.05, b/1.05); // baisse la luminosité des leds
    }
  t1=t0+t; // initialise t1
}

fifi82


dfgh

 :) merci du partage
peux tu en dire plus: branchements? alimentation? principe de fonctionnement?

fifi82

#3
Dec 13, 2015, 11:20 am Last Edit: Dec 14, 2015, 09:02 pm by fifi82
le branchement très simple, une alim 5v 2A est conseillé, j'ai un petit transfo qui délivre 5,2v 1,5A ça fonctionne très bien
sur les néopixel il y à des flèches qui indique le sens de transmission des données
il y à 3 fils à brancher, le +5v (il peut servir aussi à alimenter l'arduino) la masse commune à l'arduino et à la bande néopixel, et les donnée qui partent de la broche 6 de l'arduino  à la première led.


le principe en gros des néopixels, on donne à la première led, 2 mots, le premier mot le numéro de la led à allumer et le deuxième mot la couleur, si le premier mot est différent de 0 le numéro de la led est décrémenté et passé à la led suivante et ainsi de suite, si il est égale à 0 la led s'allume de la couleur donné par le deuxième mot ... le tout à une frequence de 400khz ou 800khz suivant le type de ruban

le mien est à 7€ le mètre de 30 leds sur ebay ici...

Artouste

#4
Dec 13, 2015, 01:34 pm Last Edit: Dec 13, 2015, 01:35 pm by Artouste
le branchement très simple, une alim 5v 2A est conseillé, j'ai un petit transfo qui délivre 5,2v 1,5A ça fonctionne très bien
bonjour
il faut toujours avoir à l'esprit la conso "plein feux" qui est = à  60mA*nb ws2812
avec 30 WS2812 tu es déjà "limite" sur le stress maxi avec "ton petit transfo"  :smiley-mr-green:


fifi82

#5
Dec 13, 2015, 05:53 pm Last Edit: Dec 13, 2015, 05:55 pm by fifi82
oui mais comme je m'amuse à faire varier les couleurs et l'intensité des leds ça passe, j'évite d'avoir tout allumé en blanc, je ferai des tests de consommation pour voir, de toute façon 30leds à 60mA = 1,8A

dfgh


erwin38

Grand merci à toi =) très beau boulot.

Cette librairie reste un peu obscure pour moi je n'arrive pas à faire se que j'en veut , je m'inspire beaucoup de ce que tu a fait et c'est un bon début ! Mais j'ai pas autant de led que toi juste 9 ... Ducoup ça rend pas pareil

fifi82

j'ai un nouveau projet faire des panneaux avec des compteurs "3 x 7 digits" que je vais réaliser avec les néopixel il y aura aussi le dessin d'un rythme cardiaque animé c'est pour le téléthon  je viens tout juste de commander les rubans je posterai les détails de la fabrication ...

patg_

Bonjour,
Sympa comme projet.
Depuis que j'ai découvert la lib NeoPixelBus https://github.com/Makuna/NeoPixelBus je n'utilise plus que celle-là.
Elle est de plus haut niveau et dispose de fonctions pour faire facilement des effets et animations entre autres.

 
Mes Arduineries: http://breizhmakers.over-blog.com/

Artouste

Depuis que j'ai découvert la lib NeoPixelBus https://github.com/Makuna/NeoPixelBus je n'utilise plus que celle-là.
Elle est de plus haut niveau et dispose de fonctions pour faire facilement des effets et animations entre autres.

  
bonjour patg
je ne connaissais pas , rapide coup d'oeil , il semble aussi y avoir un peu de support dédié à l'esp8266.
Donc dans la banette : lib à tester :smiley-cool:

kol28

salut,

Je cherchais une animation (plus developpée) pour mon étoile de noël, nickel ... j'ai juste un soucis sur certaines animations, mon étoile et composée de 10 leds, j'ai modifié (#define nbled 10) et sur certaines anim, une ou deux leds ne s'allument pas ... je cherche mais je ne trouve pas le parametre à changer.

merci d'avance.

Olivier.

fifi82

Slt fais passer ton code pour voir ...

merci patg_ à tester NeoPixelBus

pour le moment je me bat avec l'horloge DS3132+AT24C32N pour fabriquer un compte à rebours j'ai eu quelques soucis de lecture de l'éprom mais je crois avoir trouvé ...

patg_

#13
Jul 04, 2016, 01:17 pm Last Edit: Jul 04, 2016, 01:17 pm by patg_
Hello,
Je viens de trouver cette lib https://github.com/kitesurfer1404/WS2812FX (dans le dernier Hackable Magazine)
Elle a l'air très intéressante pour faire des animations sans trop d'effort :)
Mes Arduineries: http://breizhmakers.over-blog.com/

Go Up