Les codes (sur arduino nano, neo pixel, et bande leds blanches avec mosfet)
la tour :
#include <Adafruit_NeoPixel.h>
#include <EasyButton.h> // https://easybtn.earias.me/docs/fundamentals
#define DATA_PIN 3 // pin pour neopixels
#define WHITE_PIN 5 // pin PWM commande leds blanches
#define BTN_PIN 7 // entrée bouton
#define NUMPIXELS 480 // nombre total de neopixels
#define MAX_WHITE 150 // 150 pour batterie 18v, 255 pour batterie 12v
#define MAX_NEO_WHITE 120 // blanc max pour neopixels
//#define FPS 50 // on travaille en 50 images par seconde
#define LONGEUR_FIRE 3 // nombre de leds qui composent le feu
#define LONGEUR_QUEUE 15 // nombre de leds qui composent le feu
#define MAX_SHOT 10 // nombre de fusée en même temps
#define B_MAX 45 // bleu max plus le chiffre est petit plus ce sera blanc
#define CYCLE_WHITE 15 // pour void cycle
#define MAX_COLOR 255 // colour max pour neopixel
int bande_white_PIN[] = {5, 9};
int slot = 0; //de 0 à MAX_SHOT = dernière animation déclecnhés avec le bouton
int anim[MAX_SHOT], r[MAX_SHOT], g[MAX_SHOT], b[MAX_SHOT]; // // position de chaque anim[0] à anim[7]+ couleurs des différentes anims possibles
int white = 0; // puissance du blanc
// pin, debounce, pullup
EasyButton button(BTN_PIN, 10, true);
Adafruit_NeoPixel pixels(NUMPIXELS, DATA_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// initialize le bouton
button.begin();
// lance l'explosion après un triple clic sur une seconde
//button.onSequence(3, 1000, cycle_white);
// lance l'explosion après un clic de 3 secondes
button.onPressedFor(1000, cycle_white);
// initialise le tableau d'animations
for (int i = 0; i < MAX_SHOT; i++)
{
anim[i] = 10000;
r[i] = random(255);
g[i] = random(255);
b[i] = random(255);
}
// on en force quelques une pour avoir des chouettes couleurs (à peaufiner huhuh)
r[0] = 255;
g[0] = 0;
b[0] = 0;
r[1] = 255;
g[1] = 255;
b[1] = 0;
r[2] = 0;
g[2] = 0;
b[2] = 255;
r[3] = 0;
g[3] = 255;
b[3] = 0;
r[4] = 0;
g[4] = 0;
b[4] = 255;
r[5] = 0;
g[5] = 255;
b[5] = 255;
r[6] = 255;
g[6] = 0;
b[6] = 0;
r[7] = 255;
g[7] = 255;
b[7] = 0;
r[9] = 0;
g[9] = 0;
b[9] = 255;
r[11] = 0;
g[11] = 255;
b[1] = 0;
r[13] = 0;
g[13] = 0;
b[13] = 255;
r[14] = 0;
g[14] = 255;
b[14] = 255;
pixels.begin();
Serial.begin(9600);
}
void loop() {
button.read();
if (button.wasReleased() || random(500) == 1) {
if (slot > MAX_SHOT - 1)
{
slot = 0;
}
anim[slot] = 0;
Serial.write('slot : ');
Serial.println(slot);
slot ++;
}
// boucle sur chaque anim
for (int i = 0; i < MAX_SHOT; i++) {
// incrémente de une frame chaque animation
anim[i] ++;
if (anim[i] > 10000)
{
anim[i] = 10000;
}
// etape 1 : la montée !
if (anim[i] > 0 && anim[i] < 480)
{
// éteint la leds précédente
pixels.setPixelColor(anim[i], pixels.Color(0, 0, 0));
// la queue de fusée
for (int f = LONGEUR_QUEUE; f < LONGEUR_QUEUE + LONGEUR_FIRE; f++)
{
pixels.setPixelColor(anim[i] + f, pixels.Color(r[i] , g[i], b[i]));
}
// la fusée en elle même
for (int f = 1; f < LONGEUR_QUEUE; f++)
{
pixels.setPixelColor(anim[i] + f, pixels.Color(r[i] / LONGEUR_QUEUE * f , g[i] / LONGEUR_QUEUE * f, b[i] / LONGEUR_QUEUE * f));
}
}
// etape 2 : la descente
if (anim[i] > 480 && anim[i] < 961)
{
// éteint la leds précédente
pixels.setPixelColor(960 - anim[i], pixels.Color(0, 0, 0));
// la queue de fusée
for (int f = LONGEUR_QUEUE; f < LONGEUR_QUEUE + LONGEUR_FIRE; f++)
{
pixels.setPixelColor(960 - anim[i] - f, pixels.Color(r[i] , g[i], b[i]));
}
// la fusée en elle même
for (int f = 1; f < LONGEUR_QUEUE; f++)
{
pixels.setPixelColor(960 - anim[i] - f, pixels.Color(r[i] / LONGEUR_QUEUE * f , g[i] / LONGEUR_QUEUE * f, b[i] / LONGEUR_QUEUE * f));
}
}
}
pixels.show(); // Send the updated pixel colors to the hardware.
delay(1);
}
void cycle_white() {
pixels.clear();
pixels.show();
noise();
int speed_white = 1;
int whiteval = 0;
int pinwhite = 0;
int cyclenumero;
int b = 0;
for (cyclenumero = 0; cyclenumero < CYCLE_WHITE; cyclenumero++ ) {
pinwhite = 0;
whiteval = 0;
//selection de la pin
//montée neo
for ( whiteval = 0; whiteval < MAX_NEO_WHITE; whiteval = whiteval + speed_white) {
for (int i = 0; i < NUMPIXELS; i++) {
b = whiteval * B_MAX / MAX_NEO_WHITE;
pixels.setPixelColor(i, pixels.Color(whiteval, whiteval, b));
}
pixels.show();
}
delay(10);
Serial.println(whiteval);
//descente
for ( whiteval ; whiteval > 0; whiteval = whiteval - speed_white) {
for (int i = 0; i < NUMPIXELS; i++) {
b = whiteval * B_MAX / MAX_NEO_WHITE;
//b = whiteval / B_MAX;
pixels.setPixelColor(i, pixels.Color(whiteval, whiteval, b));
}
pixels.show();
}
pixels.clear();
pixels.show();
//fin neo
//montée bande 1
for ( whiteval = 0; whiteval < MAX_WHITE; whiteval = whiteval + speed_white) {
analogWrite(bande_white_PIN[0], whiteval);
delay(10);
}
//descente
for ( whiteval ; whiteval > 0; whiteval = whiteval - speed_white) {
analogWrite(bande_white_PIN[0], whiteval);
delay(10);
}
analogWrite(bande_white_PIN[0], 0);// pas necessaire
delay(10);
//montée bande 2
for ( whiteval = 0; whiteval < MAX_WHITE; whiteval = whiteval + speed_white) {
analogWrite(bande_white_PIN[1], whiteval);
delay(10);
}
//descente
for ( whiteval ; whiteval > 0; whiteval = whiteval - speed_white) {
analogWrite(bande_white_PIN[1], whiteval);
delay(10);
}
analogWrite(bande_white_PIN[1], 0);// pas necessaire
delay(10);
Serial.println("neo");
if (speed_white < 65) {
speed_white = speed_white * 2;
}
pinwhite = 0;
Serial.print("speed_white ");
Serial.println(speed_white);
}
// fin cycle
delay(2000);
// boom
ALL_ON();
delay (3000);
//fin
pixels.clear();
pixels.show();
analogWrite(bande_white_PIN[0], 0);
analogWrite(bande_white_PIN[1], 0);
delay(15000);// 15 secondes avant relance
}
void ALL_ON () {
analogWrite(bande_white_PIN[0], MAX_WHITE);
analogWrite(bande_white_PIN[1], MAX_WHITE);
pixels.clear();
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(MAX_NEO_WHITE, MAX_NEO_WHITE, B_MAX));
} pixels.show();
}
void ALL_OFF () {
analogWrite(bande_white_PIN[0], 0);
analogWrite(bande_white_PIN[1], 0);
pixels.clear();
pixels.show();
}
void noise() {
//noise
for (int i = 0; i < 10; i++) {
int r = random(10, 100);
delay(r);
ALL_ON();
delay(r);
ALL_OFF();
}
}
le sac a dos firework
#include <Adafruit_NeoPixel.h>
#define MAX_COLOR 255 // colour max pour neopixel
#define DATA_PIN 3 // pin pour neopixels
#define WHITE_PIN 5 // pin PWM commande leds blanches
#define BTN_PIN 7 // entrée bouton
#define NUMPIXELS 240 // nombre total de neopixels
#define MAX_WHITE 100 // 150 pour batterie 18v, 255 pour batterie 12v
#define FPS 50 // on travaille en 50 images par seconde
#define FIRE_BALL 5 // nombre de leds la tete dela fusee
#define LONGEUR_FIRE 20 // nombre de leds qui composent le feu
int slot = 0;
int var = 0;
int anim[8]; // de anim[0] à anim[7]
int r[8]; // couleurs des différentes anims possibles
int g[8];
int b[8];
int tail = LONGEUR_FIRE - FIRE_BALL; // queue de la fusee
int white = 0; // puissance du blanc
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 10; // the debounce time; increase if the output flickers
int lastButtonState = HIGH;
int buttonState;
Adafruit_NeoPixel pixels(NUMPIXELS, DATA_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
// initialise le tableau d'animations
for (int i = 0; i < 8; i++)
{
anim[i] = 10000;
var = 0;
while (var < 200) {
// do something repetitive 200 times
var++;
}
// vide serie de noire + couleurs vives
while (r[i] != 0 && g[i] != 0 && b[i] != 0) {
r[i] = random(2) * MAX_COLOR; // soit 0 soit 255
g[i] = random(2) * MAX_COLOR;
b[i] = random(2) * MAX_COLOR;
}
}
/*
// on en force quelques une pour avoir des chouettes couleurs (à peaufiner huhuh)
r[0] = 255;
g[0] = 0;
b[0] = 0;
r[1] = 255;
g[1] = 255;
b[1] = 0;
r[2] = 0;
g[2] = 0;
b[2] = 255;
r[3] = 0;
g[3] = 255;
b[3] = 0;
r[4] = 0;
g[4] = 0;
b[4] = 255;
r[5] = 0;
g[5] = 255;
b[5] = 255;
*/
pixels.begin();
pinMode(BTN_PIN, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
// gestion bouton
int reading = digitalRead(BTN_PIN);
// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer than the debounce
// delay, so take it as the actual current state:
// if the button state has changed:
if (reading != buttonState) {
buttonState = reading;
// only toggle the LED if the new button state is HIGH
if (buttonState == LOW) {
{
slot ++;
if (slot > 7)
{
slot = 0;
}
anim[slot] = 0;
Serial.println(slot);
}
}
}
}
lastButtonState = reading;
// boucle sur chaque anim
for (int i = 0; i < 8; i++) {
// incrémente de une frame chaque animation
anim[i] ++;
if (anim[i] > 10000)
{
anim[i] = 10000;
}
// etape un : la montée !
if (anim[i] > 0 && anim[i] < 240)
{
// éteint la leds précédente
pixels.setPixelColor(anim[i], pixels.Color(0, 0, 0));
for (int f = 1; f < LONGEUR_FIRE; f++)
{
int fonduVal = MAX_COLOR / tail;
}
//les leds premiers au max
if ( f <= FIRE_BALL ) {
pixels.setPixelColor(anim[i] + f, pixels.Color(r[i], g[i], b[i]));
}
// puis création de la queue
else {
int fondu = f * fonduVal;
pixels.setPixelColor(anim[i] + f, pixels.Color(r[i] - fondu, g[i] - fondu, b[i] - fondu));
}
}
// étape 2 extinction des leds de la montée
if (anim[i] >= 240 && anim[i] < 260)
{
for (int f = 0; f < LONGEUR_FIRE + 1; f++)
{
pixels.setPixelColor(anim[i], pixels.Color(0, 0, 0));
}
}
// étape 3, le boom !
if (anim[i] >= 240 && anim[i] < 285)
{
//white = white + (map(anim[i], 260, 285, 0, MAX_WHITE) / 8);
white = white + (MAX_WHITE / 2);
}
// étape 4, réduction du boom !
if (anim[i] >= 280 && anim[i] < 400)
{
//white = white - (map(anim[i], 300, 500, 0, MAX_WHITE)/8);
white = white - 1;
}
// étape 4, réduction du boom plus lent vers la fin
if (anim[i] >= 400 && anim[i] < 900)
{
//white = white - (map(anim[i], 300, 500, 0, MAX_WHITE)/8);
if (anim[i] % 3 == 0)
{
white = white - 1;
}
}
}
pixels.show(); // Send the updated pixel colors to the hardware.
// limitation du white à ce que l'on permet en min et max
if (white < 0)
{
white = 0;
}
if (white > MAX_WHITE)
{
white = MAX_WHITE;
}
analogWrite(WHITE_PIN, white);
//delay(3);
}
[…] défilé lumineux dans les rues selon un parcours surprise du 16 au 19 décembre 2020. Le Fablab a contribué à la réalisation d’équipements lumineux pour cette parade que vous pourrez découvrir dès ce […]