16
Vos projets / Re : Re : Re : Un BV animé par ATtiny 85
« le: mai 09, 2021, 11:47:55 am »Avec WS2812 + Attiny85, il est possible d’augmenter le nombre de pièces éclairées tout en utilisant que 3 pattes (5v, gnd, 0).Je suis convaincu que c'est comme ça qu'il faut faire. L'intérêt est qu'avec une seule sortie on pilote un nombre dingue de LED et comme elles sont multicouleurs, tu peux avoir des effets soit de couleur et même des émulations de feu de cheminée ou de TV en fonctionnement.
Bibliothèque NeoPixel
La WE2812 est une solution d'avenir pour nos modules et surtout tellement simple.
...
Bonjour à tous
Je partage cette conviction. Dans le monde réel l'éclairage des pièces des bâtiments n'est pas uniforme. Les Leds WS2812 sont en effet une solution que je voulais essayé depuis quelques années.
Je vous propose ma petite contribution à base d'un ATtiny85 pour les commander. (La mise au point s'est faite avec un Nano).
Quelques précisions:
Mon code a pour base celui développé par Dominique et le maximum de pièces est fixé à 8.
Le principe retenu: 1 pièce 1 couleur (facilement modifiable en jouant sur les valeurs de rouge de vert et de bleu).
D'autre part n'ayant de ruban Neopixel j'ai utilisé un module de 8 Leds WS2812 RGB.
Code: [Sélectionner]
/* attiny anim batiment neopixel1
08/05/2021
Fantasio
Couleur personnalisée pour chacune des 8 pièces max
Après une temporisation de 10 ou 20 secondes l'état des leds change
D'après Version 1.01 du 15 juin 2017 Dominique (Locoduino)
lien: http://forum.locoduino.org/index.php?topic=336.0
lien: https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use
Attiny85 8MHz
Testé avec Module ruban de 8 LED WS2812 5050 RVB
lien: https://www.vs-elec.fr/fr/leds/2051-module-ruban-de-led-ws2812-5050-rvb-pour-arduino-3665662013330.html
Utilisation de la bibliothèque Adafruit_NeoPixel
lien: https://github.com/adafruit/Adafruit_NeoPixel
lien: https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use
Brochage Attiny85
=|1 U 8|= +5V
=|2 7|= 2 PIN--=|DIN Module 8 Leds|
=|3 6|=
GND =|4 5|=
*/
// constantes
const int tempo1 = 10000; // 10s
const int tempo2 = 20000; // 20s
// variables
byte etatPixels = 0B11111111; // état des leds donc au démarrage tout est allumé
unsigned long tempsActuel;
byte bitAleatoire; // le bit est choisi de manière aléatoire
byte octetAleatoire;
int tempo; // prend alternativement la valeur de 10 ou 20S
#include <Adafruit_NeoPixel.h>
#define PIN 2 // pin de l'Attiny85 connectée au DIN du module NeoPixel
#define NOMBREPIXELS 8 // nombre de Leds sur le module
Adafruit_NeoPixel bande(NOMBREPIXELS, PIN, NEO_GRB + NEO_KHZ800);
// pour chaque couleur: (rouge , vert , bleu ) de 0 à 255
uint32_t eteint = bande.Color( 0, 0, 0 );// on définit la couleur eteint
uint32_t blanc = bande.Color( 255, 255, 255 ); // on définit les différentes couleurs
uint32_t couleur1 = bande.Color( 255, 255, 100 );
uint32_t couleur2 = bande.Color( 125, 100 , 50 );
uint32_t couleur3 = bande.Color( 80, 90, 150 );
uint32_t couleur4 = bande.Color( 90, 140, 70 );
// attribution d'une couleur pour chaque pièce
uint32_t couleurPiece[NOMBREPIXELS] = {blanc, couleur1, couleur2, couleur3, couleur4, couleur1, couleur2, couleur3};
void setup() {
bande.begin(); // pour préparer la broche de données pour la sortie NeoPixel
bande.show(); // aucune couleur n'a encore été définie,tous les NeoPixels à un état initial «off»
tempsActuel = millis();
tempo = tempo1;
randomSeed(analogRead(0));
// bande.setBrightness (20); // (option) réglage luminosité globale (255 max)
}
void loop() {
for (int i = 0; i < NOMBREPIXELS; i++) { // pour chaque pixel si etat pixel = 1 alors la led s'allume
if ((bitRead(etatPixels, i)) == 1) {
bande.setPixelColor(i, couleurPiece[i]);// avec sa couleur pralablement choisie
}
else {
bande.setPixelColor(i, eteint); // sinon la led s'éteint
}
}
bande.show(); // allumage des leds fct des états et des couleurs
if (millis() > tempsActuel + tempo) { // alternance de tempo 10S et 20S
tempsActuel = millis();
if (tempo == tempo1) {
tempo = tempo2;
}
else {
tempo = tempo1;
}
bitAleatoire = random(0, NOMBREPIXELS + 1); // affiche un nombre aléatoire entre 0 et 8
octetAleatoire = 0; // remise à 0 de l'octet
octetAleatoire = bitSet(octetAleatoire, bitAleatoire); // octetAleatoire = 00000001;00000010;00000100;00001000;00010000;00100000;01000000;10000000
etatPixels = etatPixels ^ octetAleatoire; // ou exclusif. le bit dans etatPixels est à 0 si concordance et à 1 si différence
}
}
Bonne continuation à vous tous