projet glanerie1 ruban leds WS2801

Parlez nous de vos projets et de vos idées, imaginez des applications

projet glanerie1 ruban leds WS2801

Message non lude VickingJack » Mer 27 Aoû 2014 12:33

Bonjours,
On est en train de construire pour la fête de la recup de la glanerie du WE du 27-28 septembre un générateur d’électricité à pédales avec deux moteurs de machine a laver.

On voudrais récupérer les mesures du courant produit pour faire un affichage à LEDs avec une arduino.
Avec un diviseur de tension et un de courant on devrais avoir ces données en moins de 5v gérable par l'arduino.

L'affichage lisible de ces donnée ce ferrais avec des rubans de LEDs adressable WS2801 d'adafruit (J'en ais 3).
http://snootlab.com/adafruit/443-guirla ... 01-fr.html

Les infos sur le panneau serraient: puissance instantanée, puissance cumulée du WE, de la journée, de l'utilisateur actuel, calories, à quoi ça correspond pour un portable, pour un ménage, kilomètres parcouru...

Ces calcules ne devrais pas trop poser de problème.

La où le bas blesse c'est que je suis perdu pour programmer ces rubans...

J'ai téléchargé la bibliothèque et les exemples ici: https://github.com/adafruit/Adafruit-WS2801-Library
Ça fonctionne, c'est joli mais je ne comprend rien pour adresser chaque LED moi même!

Pourriez-vous m'expliquer comment faire un sketch simple du genre:
Led 1 allumé 1/2 sec en rouge puis la 2em 5sec en blanc et la 3 selon une ou plusieurs données d'une entré?

Merci
VickingJack
VickingJack
 
Messages: 20
Inscription: Lun 16 Déc 2013 13:58

Re: projet glanerie1 ruban leds WS2801

Message non lude phil » Mer 27 Aoû 2014 21:57

VickingJack a écrit:Pourriez-vous m'expliquer comment faire un sketch simple du genre:
Led 1 allumé 1/2 sec en rouge puis la 2em 5sec en blanc et la 3 selon une ou plusieurs données d'une entré?

Merci
VickingJack



Il y a 2 primitives
strip.setPixelColor(numéro de led, couleur);
Qui permet de pré-programmer une led avec une couleur
Et
strip.show();
Qui permet d afficher ce qui a été pre.-programmé

En plus il est souhaitable d utiliser le fonction

int32_t Color(byte r, byte g, byte b) qui retourne le code couleur d'une couleur composée de rouge (r) de vert (g) et de bleu (b), avec r g et b compris entre 0 et 255


Donc pour allumer la led 0 en rouge il faut faire



strip.setPixelColor(0, Color(255,0,0));
strip.show();
Ensuite pour allumer la led 1 en blanc




strip.setPixelColor(1, Color(255,255,255));

strip.show();


Et ainsi de suite...
Attention avec ce code la led 0 sera rouge et la led 1 sera blanche....



Pour tout effacer il suffit de rappeler la fonction

strip.show();

Sans rien avant
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: projet glanerie1 ruban leds WS2801

Message non lude VickingJack » Ven 29 Aoû 2014 13:09

Salut et merci de l'aide.
Il y a deux problèmes que je ne comprend pas:

-Je fais allumer les 25 LEDs une par une avec une pause d'1/2 sec et je voudrais que tout s’éteigne avant que ça reprenne. j'ai donc rajouté un "strip.show();" a la fin mais rien ne s’éteint. (voir code ci-dessous)

-2: avec "strip.setPixelColor(1, Color(255,255,255));" arduino refuse de compiler car "Color was not declared in the scop"
J'ai bien essayé de copier "int32_t Color(byte r, byte g, byte b)" en tête de programme mais ça bloque juste après.

Code: Tout sélectionner
#include "SPI.h"
#include "Adafruit_WS2801.h"

uint8_t dataPin  = 2;    // Yellow wire on Adafruit Pixels
uint8_t clockPin = 3;    // Green wire on Adafruit Pixels


Adafruit_WS2801 strip = Adafruit_WS2801((uint16_t)7, (uint16_t)7, dataPin, clockPin);

int a=500;


void setup() {
   
  strip.begin();

  // Update LED contents, to start they are all 'off'
  strip.show();
}


void loop() {
  delay (a*10);
 strip.setPixelColor(0, 0,0,5);
 strip.show();

 delay (a);
 
 strip.setPixelColor(1, 0,5,0);
 strip.show();
  delay (a);

strip.setPixelColor(2, 5,0,0);
 strip.show();
  delay (a);

strip.setPixelColor(3, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(4, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(5, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(6, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(7, 0,0,5);
 strip.show();
  delay (a);

 
strip.setPixelColor(8, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(9, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(10, 0,0,5);
 strip.show();
  delay (a);
strip.setPixelColor(11, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(12, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(13, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(14, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(15, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(16, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(17, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(18, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(19, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(20, 0,0,5);
 strip.show();
  delay (a);
strip.setPixelColor(21, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(22, 0,0,5);
 strip.show();
  delay (a);

strip.setPixelColor(23, 0,0,5);
 strip.show();

  delay (a);

strip.setPixelColor(24, Color(0,0,5));
 strip.show();
 delay (2000);
strip.show();

}
VickingJack
 
Messages: 20
Inscription: Lun 16 Déc 2013 13:58

Re: projet glanerie1 ruban leds WS2801

Message non lude phil » Sam 30 Aoû 2014 09:46

Bonjour
Pour le problème 1 il me semble que ça marche pour les ws2811 mais j avoue ne pas avoir tester avec les ws2801. .. le mieux du coup est de faire une boucle qui attribue a toutes les leds la couleur 0 puis faire un strip.show



Pour Color il faut copier l intégralité de la fonction après la loop.

C a d

Code: Tout sélectionner
  uint32_t Color(byte r, byte g, byte b)
{
  uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c;
}
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: projet glanerie1 ruban leds WS2801

Message non lude VickingJack » Ven 19 Sep 2014 15:26

Bonjours,
Des nouvelles fraiche et de nouvelles questions pour ce projet.
J'ai bien bataillé avec l’allumage et surtout l’extinction des LEDs.
Si j’incrémente directement dans le strip.setPixelColor
dans le genre :
Code: Tout sélectionner
strip.setPixelColor(b++,c++,d++,e);
strip.show ();
delay (a);
strip.setPixelColor (b,0,0,0);
strip.show();

Cela n’éteint pas la LED...
J'ai essayé plein de trucs qui font des choses bizarres comme au premier tour les LED s’allument et s’éteignent l'une après l'autre puis au second les LEDs fonctionnent par groupe de 2 puis trois... puis les 25 restent allumées et s’éteignent une par une au tour suivant et tout repart...

Mais bref, comme ça sa marche:
  void loop() {
  //J'incremente les variable avant le strip.set
 if (b<25){b++;}else {b=0;}
 if (c<255-50){c=c+50;}else {c=0;}
 if (d<255-100){d=d+100;}else {d=0;}
 if (e<255-75){e=e+75;}else {e=0;}
 if (1>0){f++;}//C'est la façon un peut bizar qui ne marche pas bien pour compter le nombre de loop dans le moniteur serie
  strip.setPixelColor(b,c,d,e);
 strip.show();
 delay (a);
 strip.setPixelColor(b,0);//J'eteint la led
 strip.show();
  }



Pour essayer de comprendre ce qui ce passe réellement je me suis dit qu'utiliser le moniteur serie serrais une bonne idée.
Serial.println("-------------------");
Serial.print (" ");
Serial.println(f);
Serial.println("-------------------");
Serial.print("a | ");
Serial.println(a);
Serial.print ("b | ");
Serial.println(b);
Serial.print ("c | ");
Serial.println(c);
Serial.print ("c | ");
Serial.println(d);
Serial.print ("e | ");
Serial.println(e);
Serial.println();



Le problème est que l’incrémentation des variables commence à l'ouverture du moniteur et ce remet à 0 si je le ferme et le rouvre.
Comment lire les réels valeurs traitées en direct par la carte?

Merci

Etienne






// BE SURE TO CHECK YOUR PIXELS TO SEE WHICH WIRES TO USE!
uint8_t dataPin  = 11;    // Yellow wire on Adafruit Pixels
uint8_t clockPin = 12;    // Green wire on Adafruit Pixels

// Don't forget to connect the ground wire to Arduino ground,
// and the +5V wire to a +5V supply

// Set the first variable to the NUMBER of pixels in a row and
// the second value to number of pixels in a column.
Adafruit_WS2801 strip = Adafruit_WS2801((uint16_t)7, (uint16_t)7, dataPin, clockPin);
 int z=500;// defini la valeur de depart de a donc le delay
 int a=z;// prend la valeur de z pour le delay
 int b=-1;// determine la led a commander
 int c=50;// rouge
 int d=100;//vert
 int e=150;//Bleu
 int f=0;//conpteur de boucle void loop
 int g=b;



void setup() {
    
  strip.begin();

  // Update LED contents, to start they are all 'off'
  strip.show();
  Serial.begin(9600);
}


  void loop() {
  //J'incremente les variable avant le strip.set
 if (b<25){b++;}else {b=0;}
 if (c<255-50){c=c+50;}else {c=0;}
 if (d<255-100){d=d+100;}else {d=0;}
 if (e<255-75){e=e+75;}else {e=0;}
 if (1>0){f++;}//C'est la façon un peut bizar qui ne marche pas bien pour compter le nombre de loop dans le moniteur serie
  strip.setPixelColor(b,c,d,e);
 strip.show();
 delay (a);
 strip.setPixelColor(b,0);//J'eteint la led
 strip.show();
 
  
//J'affiche la valeur de mes variable mais le compteur ce met a zero 
//à chaque ouverture du moniteur et ne contient donc pas les valeurs réel 
//assigné aux LEDs ni au compteur! 
Serial.println("-------------------");
Serial.print (" ");
Serial.println(f);
Serial.println("-------------------");
Serial.print("a | ");
Serial.println(a);
Serial.print ("b | ");
Serial.println(b);
Serial.print ("c | ");
Serial.println(c);
Serial.print ("c | ");
Serial.println(d);
Serial.print ("e | ");
Serial.println(e);
Serial.println();

Serial.println();
Serial.println();


}

VickingJack
 
Messages: 20
Inscription: Lun 16 Déc 2013 13:58

Re: projet glanerie1 ruban leds WS2801

Message non lude phil » Dim 21 Sep 2014 15:19

En effet, c'est des choses "étranges" que je vois là :-)

en quelques mots, voici ma fonction alloff qui éteint toutes les leds

Code: Tout sélectionner
void allOff()
{
  for (int i= 0;i<nbLeds;i++)
  {
    strip.setPixelColor(i, 0);
  }
  strip.show();
}


sinon pour eteindre une led ma fonction ledoff
Code: Tout sélectionner
void ledOff(int l)
{
    strip.setPixelColor(i, 0);
  strip.show();
}

++
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: projet glanerie1 ruban leds WS2801

Message non lude VickingJack » Lun 22 Sep 2014 08:45

OK merci, je commence à comprendre doucement les fonctions for!
Mais nouveaux probléme bizarre:
En fessant des essais j’écris par exemple
Code: Tout sélectionner
void alumTout ()
{
for (i=0, i>=74,i++)
{
strip.setPixelColor(i,255,0,0);
  strip.show();
  delay (200);
strip.setPixelColor(i,0);
strip.show();
}
}

Les 50 premières LEDs s’allument correctement mais aucune du dernier bandeaux! Et ce quelques soit le bandeaux, c'est toujours le dernier qui ne marche pas. J'ai pensé que mon alim était trop faible mais 1 Ampère devrais suffire largement et même en recâblant le dernier bandeaux en alimentation cela ne change rien.

Est-ce une erreur de ma part ou un défaut?
Et au cas ou, puis-je brancher le dernier bandeaux sur 2 autres pin?

Encore Merci
VickingJack
 
Messages: 20
Inscription: Lun 16 Déc 2013 13:58

Re: projet glanerie1 ruban leds WS2801

Message non lude phil » Lun 22 Sep 2014 09:15

Bonjour,

A propos de ton code

Code: Tout sélectionner
void alumTout ()
{
for (i=0, i>=74,i++)
{
strip.setPixelColor(i,255,0,0);
  strip.show();
  delay (200);
strip.setPixelColor(i,0);
strip.show();
}
}


Une boucle for est composé comme ça
Code: Tout sélectionner
for (compteur; condition; modification du compteur)
{liste d'instructions;
}


Cela veux dire dans cette exemple
Code: Tout sélectionner
for (i=1; i<6; i++) {
Serial.println (i);
}

Si on part de i qui vaut 1 (i=1) et que j'ajoute 1 à i à chaque boucle (i++) et tant que i est inférieur à 6 (i<6) affiche i (Serial.println
(i))

Du coup ta boucle me semble pas bonne
Essaye ça
Code: Tout sélectionner
void alumTout ()
{
int i = 0;
for (i=0, i<74,i++)
{
strip.setPixelColor(i,Color(255,0,0));
  strip.show();
  delay (2000);
strip.setPixelColor(i,0);
strip.show();
}
}


Ce code devrai allumer en rouge les 74 premières leds et au bout de 2 s éteindre la led 74
Il faut aussi vérifier la déclaration de ton strip : si c'est un strip de 74 leds, il faut faire ça comme ça :

Code: Tout sélectionner
uint8_t dataPin = 2; // Yellow wire on Adafruit Pixels
uint8_t clockPin = 3; // Green wire on Adafruit Pixels
Adafruit_WS2801 strip = Adafruit_WS2801(74, dataPin, clockPin);

Si ton clock et ton data sont bien sur la pin 2 et 3 :-)
Dernière édition par phil le Mar 23 Sep 2014 12:28, édité 1 fois.
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: projet glanerie1 ruban leds WS2801

Message non lude VickingJack » Lun 22 Sep 2014 11:04

Je n'ai pas compris ce qui semblais déconner dans ma fonction: Le
Code: Tout sélectionner
int=0;
était déclarée début de programme avec les autres variables.
Sinon je fessais éteindre chaque LED 200ms après les avoir allumé pour être sur de n'avoir pas de probléme d'intensité. 75 LEDs en rouge 255 ça fais 75*60mA=4,5A et je n'ai qu'une alim de 1A ici.
Sinon sur la declaration du strip c'est peut être la efectivement que le bas blesse. J'ai, recopié d'un exemple:
Code: Tout sélectionner
// Set the first variable to the NUMBER of pixels in a row and
// the second value to number of pixels in a column.
Adafruit_WS2801 strip = Adafruit_WS2801((uint16_t)7, (uint16_t)7, dataPin, clockPin);


Là si je comprend bien il déclare les LEDs dans une sorte de tableau de de 16*7 soit 112 deux fois ce qui donne 224.
J'essaie donc comme tu me dit.
Et effectivement CA MARCHE! (je teste au fur et a mesure...)

Sinon, pour l’espèce de tableau comme dans l'exemple que j'utilisais, a-t-il un intérêt sachant que nous allons affiché 12 LEDs par 2 pour la puissance instantané pareil pour la puissance cumulé par l'utilisateur puis le cumulé total, 20 pour la distance parcouru et 7 Pour une sorte de compteur de vitesse.
J'ai pour l'instant et pour faciliter le changement de montage de dernière minute, déclaré int PI1=0 ... int PI12=11 pour les puissance instantané puis PCU1=12... pour chaque LEDs.

Y a t-il a priori d'autre organisation en tableau plus pertinente?
Merci
Etienne
VickingJack
 
Messages: 20
Inscription: Lun 16 Déc 2013 13:58

Re: projet glanerie1 ruban leds WS2801

Message non lude VickingJack » Lun 22 Sep 2014 11:06

pour le début du post précédant j'ai voulu écrire
Code: Tout sélectionner
 int i=0;

Coquille!
VickingJack
 
Messages: 20
Inscription: Lun 16 Déc 2013 13:58

Re: projet glanerie1 ruban leds WS2801

Message non lude phil » Lun 22 Sep 2014 15:58

je n'avais pas vu le constructeur
Code: Tout sélectionner
 Adafruit_WS2801::Adafruit_WS2801(uint16_t w, uint16_t h, uint8_t dpin, uint8_t cpin, uint8_t order)



du coup la déclaration
Code: Tout sélectionner
Adafruit_WS2801 strip = Adafruit_WS2801((uint16_t)7, (uint16_t)7, dataPin, clockPin);

corespond a un tableau de 7 * 7 soit 49 leds

Les 50 premières LEDs s’allument correctement

Du coup c'est normal :-)

Si tu as 3 x 25 leds et que tu veux faire une matrice de 8 * 9 il faut déclarer
Code: Tout sélectionner
Adafruit_WS2801 strip = Adafruit_WS2801((uint16_t)8, (uint16_t)9, dataPin, clockPin);

et tu auras une matrice de 72 points avec 3 leds qui servent a rien :-)
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: projet glanerie1 ruban leds WS2801

Message non lude phil » Lun 22 Sep 2014 16:03

Sinon pour
Sinon, pour l’espèce de tableau comme dans l'exemple que j'utilisais, a-t-il un intérêt sachant que nous allons affiché 12 LEDs par 2 pour la puissance instantané pareil pour la puissance cumulé par l'utilisateur puis le cumulé total, 20 pour la distance parcouru et 7 Pour une sorte de compteur de vitesse.
J'ai pour l'instant et pour faciliter le changement de montage de dernière minute, déclaré int PI1=0 ... int PI12=11 pour les puissance instantané puis PCU1=12... pour chaque LEDs.


En effet je sais pas si c'est intéressant d'avoir un tableau...

du coup tu as
2 x 12 leds pour la puissance instantané
2 x 12 leds pour la puissance cumulé par l'utilisateur
2 x 12 leds pour le cumulé total
20 leds pour la distance parcouru
et
7 pour le compteur de vitesse
Je pense que c'est pas ça car ça fait un total de 99 leds
Est ce que tu peux préciser un peu ?
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: projet glanerie1 ruban leds WS2801

Message non lude VickingJack » Lun 22 Sep 2014 22:52

Je me suis peut être mal exprimé:
2*6 LEDs qui s'affiche 2 par 2 sur six niveaux (2 premiers en vert, 2 niveau en plus ou violet et les 2 niveaux supérieur en rouge)

Donc
2*6=12 Puissance instantanée
2*6=12 Puissance cumulé utilisateur
2*6=12 Puissance cumulé total
20 Distance parcourue (idéalement elle change de couleur par utilisateur, si on a le temps...)
7 pour la vitesse (1 central qui change de couleur et 6 du vert au rouge en arc de cercle
12+12+12+20+7=63 il nous reste du rab au cas où au départ je voulais mettre la puissance consommé après la batterie mais on est déjà suffisamment à la bourre (La fête de la recup c'est ce samedi et Dimanche à la glanerie, imp de la glaciere à Toulouse!) et on est toujours pas sur de fournir suffisamment de courant pour recharger la batterie branché sur une petite sono. Mais tout avance bien, il y a des chances que ça fonctionne au dernier moment!
On te paie une bière si tu passe!
VickingJack
 
Messages: 20
Inscription: Lun 16 Déc 2013 13:58

Re: projet glanerie1 ruban leds WS2801

Message non lude phil » Mar 23 Sep 2014 11:19

Le câblage en bus est le plus simple et du coup il faut gérer la complexité dans le code

Je peux peut être passer demain vers 13h. Est ce que c'est bon ?
Si oui je prendrai bien un nom et un numéro de tel en MP pour que l'on puisse se trouver....
++
all your shields are belong to us...
Avatar de l’utilisateur
phil
 
Messages: 192
Inscription: Mer 7 Sep 2011 11:19

Re: projet glanerie1 ruban leds WS2801

Message non lude kit ruban led » Jeu 30 Avr 2015 07:59

Bonjour,
Est-ce que quelqu'un peut publier des photos ? Pour voir vos projets.
Je suis bloqué sur le miens j'arrive pas à comprendre que veut dire WS2801, j'ai achetez un kit ruban led ici, et j'ai quatre fils a de différentes couleurs.
kit ruban led
 
Messages: 1
Inscription: Jeu 30 Avr 2015 07:55


Retourner vers Vos projets, vos idées

Qui est en ligne

Utilisateurs parcourant ce forum: Bing [Bot], Google [Bot] et 2 invités

cron