How to Merry Christmas Neopixels

How to Merry Christmas Neopixels è la descrizione di come puoi realizzare anche tu la città di natale con una base neopixel che colori il paesaggio.

how to Merry Christmas neopixel tinkercad dimensions

Lo scorso Natale 2018 hai letto l’articolo Merry Christmas Neopixels in cui unendo due progetti:

la base della Halloween Pumpkin 

il villaggio di natale in 3D

ho realizzato la piccola città illuminata di Natale.

Primo step dell’how to Merry Christmas Neopixels

Il primo passo, ed anche l’ispirazione del progetto è stato lo splendido lavoro di  lolo_aguirre pubblicato sul sito Thingiverse ID:3234211:

Christmas village

Fonte: Thingiverse ( vedi link sopra )

che, come puoi leggere sulla pagina del progetto originale, è stato realizzato con una stampante 3D per ospitare delle luci in corrispondenza delle case:

Christmas village light

Fonte: Thingiverse ( vedi link in alto )

questo progetto mi ha ispirato la realizzazione del how to Merry Christmas Neopixels.

Puoi sostituire le luci inserite nel progetto con un anello di neopixel da 16 led che controlli con un Attiny85, la base dell’Halloween Pumpkin.

Dovrai, ovviamente, cambiare la programmazione a meno che tu non desideri realizzare una città spettrale. 

Modifica il progetto Christmas elf town lamp

Per la modifica ti occorre un account sul sito tinkercad, già utilizzato per i tutorial base con Arduino.

Oggi usi la parte di elaborazione 3D del tool tinkercad.

Il primo step consiste nell’importare il file STL condiviso dall’autore del progetto nella schermata e how to Merry Christmas neopixel tinkercad imported

ed in fase di importazione dovrai scegliere una scala del 50% in quanto il progetto originale è di dimensioni doppie rispetto alla circonferenza della base a nostra disposizione:

how to Merry Christmas neopixel tinkercad imported import scale 50

in questo modo il diametro della città e della base saranno molto simili, resterà leggermente più grande la base della città.

Ora aggiungi un cilindro che userai per “scavare” nella base della Christmas elf town lamp lo spazio necessario ad ospitare i led neopixel ed il micro controllore Attiny85:

how to Merry Christmas neopixel tinkercad dimensions

ed una volta posizionato correttamente il cilindro nella base, imposta la sottrazione:

how to Merry Christmas neopixel tinkercad boolean difference

cliccando su “Vuoto” che indica al tool di sottrarre il cilindro dal progetto originale.

Infine esporta il file in formato STL ed otterrai il progetto pronto per la stampa 3D.

Un aggiunta in OpenSCAD per completare l’opera

Porchè l’Attiny85 ed i neopixel ring della base usata per la zucca di halloween sono alquanto alti ti occorre un distanziale di circa 10mm ( 1 cm ) da inserire tra la base ed il villaggio.

Per realizzare un cilindro di questo tipo puoi usare sia tinkercad sia altri programmi grafici.

Io ho preferito openScad in cui sono più rapido per la realizzazione di oggetti semplici come questo:

Ring Merry Christmas Neopixels

ora sei pronto per stampare sia il villaggio sia l’anello distanziale.

Programmazione del how to Merry Christmas Neopixels

Per realizzare l’how to Merry Christmas Neopixels ti manca solo lo sketch:

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

#define pinLED 4

#define NUMPIXELS      16

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, pinLED, NEO_GRB + NEO_KHZ800);

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

  pixels.begin(); // This initializes the NeoPixel library.
  pixels.setBrightness(64);
  // circle start
  for(byte i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(255,255,255)); pixels.show(); delay(50); }
  // circle stop
  for(byte i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(0,0,0)); pixels.show(); delay(50); }
  
  delay(1000);
}

void loop() {
  sunrise();   
  day();      delay(3000);
  sunset();
  evening();  delay(8000);
}

void sunrise() {
  for(int br=0;br<250;br++) { 
    for(int i=0;i<NUMPIXELS;i++){ 
      pixels.setPixelColor(i,pixels.Color(255,130,5));
      pixels.setBrightness(br);
      pixels.show();
    }
    delay(15); 
  }
}

void day() {
  for(int c=0;c<=255;c++){ 
    for(int i=0;i<NUMPIXELS;i++){ 
      byte r=max(255,c);
      byte g=max(130,c);
      byte b=max(5,  c);

      pixels.setPixelColor(i,pixels.Color(r,g,b)); pixels.show();
      delay(2); 
    }
  }
}

void sunset() {
  for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i,pixels.Color(255,255,255)); }
  pixels.show();
  for(int br=255;br>0;br--) { pixels.setBrightness(br); pixels.show(); delay(15); }
}

void evening() {
 for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i,pixels.Color(0,0,0)); pixels.setBrightness(255);  pixels.show();}
 
 pixels.setPixelColor(3,pixels.Color(255,130,5)); pixels.show();
 pixels.setPixelColor(4,pixels.Color(255,130,5)); pixels.show();
 delay(1000);
 
 pixels.setPixelColor(6,pixels.Color(255,130,5)); pixels.show();
 pixels.setPixelColor(7,pixels.Color(255,130,5)); pixels.show();
 delay(1000);
 
 pixels.setPixelColor(10,pixels.Color(255,130,5)); pixels.show();
 pixels.setPixelColor(11,pixels.Color(255,130,5)); pixels.show();
 delay(1000);
 
 pixels.setPixelColor(13,pixels.Color(255,130,5)); pixels.show();
 pixels.setPixelColor(14,pixels.Color(255,130,5)); pixels.show();
 pixels.setPixelColor(15,pixels.Color(255,130,5)); pixels.show();
 delay(1000);
 
}

in cui puoi notare che tutti gli effetti di luce sono state programmate come funzioni, trovi infatti 4 funzioni:

  • sunrise() – Alba
  • day()         – Giorno
  • sunset()  – Tramonto
  • evening() – sera

ho evitato la funzione notte in quanto sono solo luci spente.

Dettaglio delle funzioni dello sketch 

Ecco nel dettagli o le 4 funzioni:

Sunrise – Alba

void sunrise() {
  for(int br=0;br<250;br++) { 
    for(int i=0;i<NUMPIXELS;i++){ 
      pixels.setPixelColor(i,pixels.Color(255,130,5));
      pixels.setBrightness(br);
      pixels.show();
    }
    delay(15); 
  }
}

in cui alla linea 37 imposti un ciclo per la regolazione della lumnosità che parte da 0 e va fino a 250;

linea 38: imposta un ciclo per il controllo di tutti i led dell’anello di neopixel;

linee 39-41: usi le funzioni della libreria di controllo dei neopixel per impostare il colore ( 255,130,5 ), arancione. Imposta la luminosità e invia i dati ai neopixel;

linea 43: attendi per ogni fase di luminosità untempo di 15 millisecondi.

Day – Giorno

Passa adesso alla funzione giorno:

void day() {
  for(int c=0;c<=255;c++){ 
    for(int i=0;i<NUMPIXELS;i++){ 
      byte r=max(255,c);
      byte g=max(130,c);
      byte b=max(5,  c);

      pixels.setPixelColor(i,pixels.Color(r,g,b)); pixels.show();
      delay(2); 
    }
  }
}

il cui scopo è accendere la luce di tutti i neopixel partendo dai valori iniziali dell’alba fino alla massima luminosità ( 255,255,255 ).

Per eseguire questo effetto crea alla linea 48 un ciclo da 0 a 255;

linea 49: imposta il consueto ciclo per tutti i neopixel a tua disposizione;

linee 50-52: per ciascun colore e per ogni valore della lettera “c” preleva di volta in volta il valore massimo tra quello di partenza impostato per il colore corrispondente ed il valore di “c”. La funzione max( a,b ), se leggi nella reference di Arduino, ti restituisce sempre il valore maggiore tra i due a e b

In questo modo, ad esempio, per il colore verde “g” fino a quando c avrà valori inferiori al 130 restituirà 130 ed al valore 131 di c avrai g a 131 e così fino a 255.

linea 54: imposta il colore calcolato su ciasun pixel;

linea 55: attendi 2 millisecondi tra un valore di c ed il successivo, puoi calcolare quanto durerà un ciclo completo:

2ms x 255 = 510 millisecondi.

Sunset – Tramonto

Passa alla funzione successiva:

void sunset() {
  for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i,pixels.Color(255,255,255)); }
  pixels.show();
  for(int br=255;br>0;br--) { pixels.setBrightness(br); pixels.show(); delay(15); }
}

in cui realizzi il tramonto, ossia il passaggio dalla luce al buio ( 0,0,0, ) prima della sera.

La linea 61: si accerta, con un ciclo su tutti i led, che siano tutti al 100% ossia 255,255,255;

linea 62: applica i colori all’anello di 16 neopixel leds;

linea 63: con un ciclo inverso da 255 a 0 imposti la luminosità di tutti i led man mano in dissolvenza verso il valore 0 ossia il buio;

Evening – Sera

L’ultima funzione dell’how to merry christmas neopixels è quella che si occupa dell’accensione delle luci nelle case la sera:

void evening() {
 for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i,pixels.Color(0,0,0)); pixels.setBrightness(255);  pixels.show();}
 
 pixels.setPixelColor(3,pixels.Color(255,130,5)); pixels.show();
 pixels.setPixelColor(4,pixels.Color(255,130,5)); pixels.show();
 delay(1000);
 
 pixels.setPixelColor(6,pixels.Color(255,130,5)); pixels.show();
 pixels.setPixelColor(7,pixels.Color(255,130,5)); pixels.show();
 delay(1000);
 
 pixels.setPixelColor(10,pixels.Color(255,130,5)); pixels.show();
 pixels.setPixelColor(11,pixels.Color(255,130,5)); pixels.show();
 delay(1000);
 
 pixels.setPixelColor(13,pixels.Color(255,130,5)); pixels.show();
 pixels.setPixelColor(14,pixels.Color(255,130,5)); pixels.show();
 pixels.setPixelColor(15,pixels.Color(255,130,5)); pixels.show();
 delay(1000);
 
}

la linea 67: imposta tutti i pixel a 0, spenti, con una luminosità massima di 255;

linee 69-84: accendi con un ritardo di 1 secondo tra i differenti blocchi i pixel corrispondenti ai numeri:

  • 3,4
  • 6,7
  • 10,11
  • 13,14,15

corrispondenti alle case presenti nel progetto how to merry christmas neopixels.

Ottenendo l’effetto che puoi osservare in questo video:

Il prossimo Natale anche tu potrai realizzare tutti progetti che desideri con i neopixel, l’attiny85 ed una stampate 3D.

Dopo Natale ho leggermente modificato il progetto e condiviso su tinkercad, puoi visionarlo qui.

  • 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/how-to-merry-christmas-neopixels.html

2 commenti

  1. Buongiorno Sig. Alferi,
    Mi scusi se le faccio questa richiesta, ma… ci ho provato ma per me è troppo!!!

    Da questo codice ( con un bellissmo effetto sorgere del sole, mediante una striscia LED DIGITALE):
    [[ link rimosso in automatico ]]

    codice fatto però per NodeMCU +WebAccess ed MQTT,… vorrei estrapolare SOLO IL CODICE dell’effetto ALBA ed adattarlo per ARDUINO UNO, per fare partire subito l’effetto alba appena acceso arduino, per aggiungerlo ad un Presepe della Parrocchia.!

    Ho già una striscia Led WS2811, da 5mt con 300 LED (cioè 100 IC), Arduino UNO, alimentatori 12Vcc ecc. La striscia con altri programmi trovati in rete funziona… quindi è solo il mio codice estrapolato che non va!
    Capisco che richiede molto tempo questa cosa, la ringrazio comunque del suo tempo dedicato alla divulgazione.
    saluti,
    Grazie1000 in anticipo.

    1. Ciao Fabio,
      da regolamento non è concesso inserire link a portali e codice.
      Io ti consiglio come regola di rivolgerti sempre all’autore del codice per capire se ti può aiutare.
      Io posso suggerirti di leggere e comprendere i miei articoli sull’alba e tramonto con Arduino e adattarli al codice per WS2812 che non dovrebbe essere molto complesso dopo che avrai compreso le particolarità di questa tipologia di led.

      Se hai bisogno di aiuto puoi usare i commenti ai miei articoli per approfondire le parti che desideri.

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.