Christmas Tree Neopixel sketch

Il Christmas Tree Neopixel è il progetto che ho deciso di realizzare per Natale 2016.

Christmas Tree Neopixel genuino mkr1000

Durante il periodo delle festività natalizie, come ogni anno, puoi leggere su questo blog quale progetto natalizio ho realizzato per l’anno corrente.

Il progetto del 2016 puoi rileggerlo partendo dalgli articoli di qualche settimana e puoi leggere i precedenti articoli:

Schema di collegamento Christmas Tree Neopixel

Lo schema con cui puoi collegare i led all’MKR1000 Genuino è abbastanza semplice, come previsto dai neopixel stessi che per loro costruzione sono connessi con soli tre cavi:

Christmas Tree Neopixel schema

e sfruttano un sistema di conteggio che viene decrementato da ogni led prima di rilanciare il segale al led successivo.

Puoi realizzarti una semplice basetta millefori su cui collegare sia la MKR1000 sia il connettore verso i neopixel:

Christmas Tree Neopixel genuino mkr1000 shield connection

ecco il semplice connettore a tre contatti:

Christmas Tree Neopixel connector

ecco come devi collegare il connettore alla scheda su cui hai collegato la MKR1000 genuino:

Christmas Tree Neopixel connection pin

Lo sketch

Di seguito lo sketch che puoi caricare sul tuo Christmas Tree Neopixel:

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 7

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, 
//                        WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels,
//                                                   not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream 
//               (NeoPixel RGBW products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(40, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines 
  // if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code


  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue

  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0); //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) { // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        //turn every third pixel on
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));
      }
      strip.show();

      delay(wait);

      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0); //turn every third pixel off
      }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Lo sketch che vedi sopra è uno degli esempi  rilasciati con la libreria “Adafruit_NeoPixel.h” che esegue una serie di giochi di luce.

In origine lo sketch di esempio è scritto per utilizzare 16 neopixel collegati al pin 6 di arduino o genuino, quindi devi cambiare questi due dati nello sketch:

linea 006: cambia il pin a cui sono collegati da 6 a 7;

linea 019: il primo parametro con cui inizializzi l’istanza “Adafruit_NeoPixel” è relativo al numero di led che vuoi controllare;

linee 035-036: inizializza l’istanza “strip” e spegni tutti i led con il metodo show();

linee 041-043: richiama tre volte la funzione “colorWipe”  prima con il colore rosso, poi con il colore verde ed infine con il blue. Tutte con un delay di 50 millisecondi;

linee 046-048: richiama tre volte la funzioe “theaterChase” prima con il colore bianco, poi rosso ed infine blue. Tutti con un delay di 50 millisecondi;

linea 050: richiama la funzione “rainbow” con un delay di 50 millisecondi;

linea 051: richiama la funzione “rainbowCycle” con un delay di 20 millisecondi;

linea 052: richiama la funzione “theaterChaseRainbow” con un delay di 50 millisecondi;

Analizzando le funzioni singole inizio dalla colorWipe che accetta in ingresso due variabili: il colore da impostare sul led ed il tempo di attese tra l’accensione di un led ed il successivo:

linea 057: imposta un ciclo da 0 al numero massimo di pixel impostato;

linea 058: imposta per ciascun led del ciclo il colore impostato come primo parametro con cui la funziona è stata invocata;

linea 059: esegui il metodo .show() per rendere attivo il colore appena impostato per il led corrente;

linea 060: attendi il tempo impostato con il secondo parametro prima di proseguire con il led successivo;

Nei prossimi articoli descriverò le altre funzioni presenti nello sketch.

ll video Christmas Tree Neopixel

Ecco il video che ho realizzato e condiviso a tutti gli amici in occasione del Natale 2016 in cui vedi il Christmas Tree Neopixel sketch in funzione sulla MKR1000 genuino:

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/christmas-tree-neopixel-sketch.html

2 commenti

1 ping

    • Giuseppe il 27 Maggio 2019 alle 14:44
    • Rispondi

    Buon pomeriggio, potrebbe essere possibile cambiare gioco premendo un interruttore invece che fare una cosa ciclica? ( tipo luci di Natale)

    1. Si Giuseppe, è possibile dovrai cambiare la modalità in cui vengono selezionati i giochi di luce.

  1. […] Christmas Tree Neopixel sketch […]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.