Taula de continguts:

Llanterna d’Advent amb animació POV: 7 passos
Llanterna d’Advent amb animació POV: 7 passos

Vídeo: Llanterna d’Advent amb animació POV: 7 passos

Vídeo: Llanterna d’Advent amb animació POV: 7 passos
Vídeo: Manualitat dibuix esgrafiat 2024, Juliol
Anonim
Image
Image

Els projectes de persistència de la visió (POV) existeixen des de fa força temps, fins i tot els kits de bricolatge senzills i econòmics estan disponibles per a la compra en línia. POV es basa en una il·lusió òptica on veiem objectes il·luminats després que l’objecte ja no estigui il·luminat, encara que sigui només per un temps curt. Els projectes POV tradicionals inclouen imatges fixes basades en aquest principi o com a màxim rellotges en funcionament. Tanmateix, res impedeix projectar animacions mitjançant microcontroladors de velocitat de rellotge suficient i LED RGB intel·ligents. Aquesta animació en concret consisteix en un joc de Nadal arrossegat per rens per a la decoració de l’advent que es pot controlar remotament mitjançant qualsevol dispositiu mòbil habilitat per WiFi amb navegador web. El fanal funciona amb el microcontrolador Wemos ESP8266 D1 Mini de la família Arduino. El crèdit dels marcs animats de 8 bits de rens per a renos recau en un talentós artista gràfic Richard Fenyo.

Pas 1: llista de peces

Passos de l'Assemblea
Passos de l'Assemblea

Necessitareu una funda per a aquest projecte que sigui prou pesada per mantenir la unitat giratòria al seu lloc sense capgirar-se. Una carcassa antiga de la PSU és perfecta, només cal que deixeu descarregar els condensadors abans de desmuntar-los. També necessiteu qualsevol tipus d’adaptador d’alimentació de 5V-12V per alimentar el motor de corrent continu. Realment, qualsevol amperatge de 500 mA o més ho farà.

A continuació es detallen les peces necessàries amb enllaços de botiga web i preus actuals.

  • 2 unitats de bateria 18650, 4, 78 USD
  • Suport de bateria per a 2x18650, 0,63 USD
  • Wemos D1 Mini, 2, 14 USD
  • Palla Negra, 0, 10 USD
  • Sensor reflectant d'infrarojos, 0 USD, 38 USD
  • Interruptor basculant de 250 V, 0 USD, 10 USD
  • Commuta el commutador de diapositives, 0 USD, 02 USD
  • Motor DC de 6-900 rpm, 3 USD, 99
  • Adafruit Neopixel WS2812 de 8 bits, USD 1, 01

El cost global és inferior a 15 dòlars, però també necessitareu algunes eines manuals, perforació, cola en calent, juntament amb equips de soldadura i habilitats.

Pas 2: Passos de l'assemblea

La unitat es pot muntar completament seguint aquests passos.

  1. La base estacionària està construïda amb un motor de corrent continu i un interruptor.
  2. Els neopíxels es solden i s’uneixen a l’eix de palla.
  3. La plataforma giratòria està construïda amb microcontrolador, interruptor lliscant, sensor d'infrars i eix de palla.
  4. El cablejat es solda als connectors de les peces elèctriques
  5. El codi Arduino es penja al microcontrolador Wemos.

Pas 3: 1. Base estacionària amb motor de corrent continu

1. Base estacionària amb motor de corrent continu
1. Base estacionària amb motor de corrent continu
1. Base estacionària amb motor de corrent continu
1. Base estacionària amb motor de corrent continu
1. Base estacionària amb motor de corrent continu
1. Base estacionària amb motor de corrent continu
  1. Practicar un forat a la caixa i fixar el motor de corrent continu de manera que l’eix apunti cap amunt.
  2. Soldeu l’interruptor d’alimentació basculant i un adaptador de font d’alimentació normal de 5V-12V seguint el diagrama de cablejat següent.
  3. El motor de CC referit gira a uns 800 RPM (rotacions per minut) a 12V, resultant al voltant de 10 FPS (fotogrames per segon) en la configuració final en funció de la resistència real del vent de l’eix de palla.
  4. Connecteu l'adaptador de la font d'alimentació a la presa de corrent (110 o 220V).
  5. Engegueu el balancí i comproveu el funcionament del motor de corrent continu.

A continuació, es muntarà la plataforma giratòria i es fixarà a l’eix del motor de corrent continu de la base.

Pas 4: 2. Adjunt de Neopixel

2. Adjunt de Neopixel
2. Adjunt de Neopixel
2. Adjunt de Neopixel
2. Adjunt de Neopixel
  1. Talleu l'extrem de la palla en dos costats oposats en un extrem en aproximadament 1,5 cm, tal com es mostra a la imatge.
  2. Encaixa tres cables més llargs cap amunt de la palla. Aquests connectaran els pins Neopixel als ports Wemos de la plataforma.
  3. Soldeu els tres cables als pins Neopixel GND, 5V i D-IN.
  4. Cola calenta que els cables de Neopixels, nets i endreçats, acaben soldats fins a la meitat exacta de la barra LED.
  5. Estireu les ales tallades de la palla i enganxeu-les en calent amb una simetria exacta al centre de la barra LED (a la part superior dels cables d’un costat).
  6. Els cables passen per l'interior de la palla fins a la plataforma per arribar als ports Wemos corresponents.

Pas 5: 3. Muntatge de la plataforma giratòria

3. Muntatge de plataforma giratòria
3. Muntatge de plataforma giratòria

Cal instal·lar tota la plataforma abans de fixar-la a l’eix del motor de corrent continu. Això es deu al fet que el punt de fixació s’ha d’equilibrar de manera que la rotació quedi perfectament centrada sense cap vacil·lació.

  1. Enganxeu el microcontrolador Wemos D1 Mini i el commutador lliscant cap a un costat del suport de la bateria, tal com es mostra a la imatge.
  2. Enganxeu en calent el sensor de reflexió d'infrarojos a l'altre costat del suport de la bateria.
  3. Col·loqueu les piles al suport.
  4. Col·loqueu i fixeu l’altre extrem de la palla a sobre de les piles. Ho farà un cargol petit o un anell de goma. Assegureu-vos que no es perdi una vegada que la plataforma comença a girar a 10 RPM.
  5. Localitzeu tot el centre de gravetat de les plataformes a la part inferior. Equilibrar-lo a la punta del dit ho farà.
  6. Feu un petit forat al punt exacte de la part inferior del suport de la bateria.
  7. Apliqueu una mica de cola calenta i fixeu l'eix del motor en aquest forat. Assegureu-vos que la cola calenta no entra al cos del motor. Mantingueu-lo constant fins que s’assequi la cola.
  8. Talleu un petit tros de paper blanc i enganxeu-lo a la base fixa de manera que el sensor reflectant d'infrarojos giri exactament a prop d'aquest paper. Això activarà el dibuix dels marcs de l'animació al lloc exacte de cada rotació. La imatge mostra aquesta peça de reflexió a l’angle inferior esquerre de la base.

Pas 6: 4. Cablatge de components elèctrics

4. Cablatge de components elèctrics
4. Cablatge de components elèctrics

Seguint l'esquema de cablejat, soldeu els components elèctrics en els passos següents. Tingueu en compte que el mateix port del microcontrolador Wemos D1 Mini es soldarà diverses vegades amb diversos cables diferents. Això requereix una mica de pràctica o connecteu aquests cables en preparació abans de soldar-los al port de Wemos.

  1. Tres cables (GND, 5V i D-IN) es solden als ports Wemos G, 5V i D3 respectivament.
  2. Dos cables del sensor reflectant d'infrarojos (VCC, GND, OUT) es solden als ports Wemos 5V, G i D2 respectivament.
  3. El cable de terra (negre) del suport de la bateria es solda al port G. de Wemos
  4. El cable positiu (vermell) del suport de la bateria es solda al pin més proper de l’interruptor lliscant.
  5. El port de 5V de Wemos es solda a l’altre pin del commutador lliscant.

Pas 7: 5. Codi Arduino

5. Codi Arduino
5. Codi Arduino

Aquest codi en particular és per a la versió de 24 bits de POV Lantern, pot ser controlat remotament per qualsevol dispositiu mòbil amb navegadors web i compta amb efectes visuals com World Map, Matrix Animation Effect i l’animació Reindeer Sleight. No dubteu a ajustar el nombre de píxels, paràmetres d’efecte o interfície remota WiFi a les vostres necessitats al codi font.

// Llanterna POV de 24 bits - Peter Csurgay del 2019

#include ESP8266WiFiMulti.h

#include WiFiClient.h #include ESP8266WebServer.h #include WebSocketsServer.h #include Adafruit_NeoPixel.h

#define DEBUG 1

Text de la cadena [3] = {"INSTRUCTABLES", "ARDUINO", "CONCURS"};

paleta const uint8_t [8] [3] = {

{0, 0, 0}, // 0 - Transparent {0, 0, 127}, // 1 - Blau {127, 0, 0}, // 2 - Vermell {127, 127, 0}, // 3 - Groc {0, 127, 0}, // 4 - Verd {127, 24, 0}, // 5 - Taronja {127, 0, 127}, // 6 - Magenta {127, 127, 127} // 7 - Blanc};

const unsigned char world [24] [42] PROGMEM =

{ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }, { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 }, { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };

const unsigned char pepper [24] [8 + 31] PROGMEM =

{ { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 0, 0, 4, 4, 4, 0, 0, 4, 4, 4, 4, 0, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0, 4, 4, 4, 4, 0, 4, 4, 4, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 0, 4, 0 }, { 1, 1, 0, 1, 1, 0, 1, 1, 0, 4, 0, 0, 4, 0, 4, 4, 4, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 4, 4, 0, 0, 4, 0, 0, 4, 0 }, { 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 4, 4, 0, 0, 4, 0, 0, 0, 0, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0, 4, 0, 0, 0, 0, 4, 4, 4, 0, 0 }, { 0, 1, 1, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 0, 4, 4, 4, 4, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 4, 4, 4, 0, 4, 0, 0, 4, 0 }, { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, { 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, { 0, 4, 4, 4, 4, 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 4, 4, 0, 0, 4, 4, 4, 4, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0 }, { 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 4, 4, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, { 0, 4, 0, 0, 4, 0, 0, 4, 4, 0, 0, 4, 0, 0, 4, 0, 4, 4, 4, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 0, 0, 4, 4, 4, 0, 0, 4, 4, 4, 4, 0, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0, 4, 4, 4, 4, 0, 4, 4, 4, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4, 0, 0, 4, 0 }, { 1, 1, 0, 1, 1, 0, 1, 1, 0, 4, 0, 0, 4, 0, 4, 4, 4, 0, 0, 4, 0, 0, 4, 0, 4, 0, 0, 4, 0, 4, 4, 4, 0, 0, 4, 0, 0, 4, 0 }, { 1, 1, 1, 1, 1, 1, 1, 1, 0, 4, 4, 4, 0, 0, 4, 0, 0, 0, 0, 4, 4, 4, 0, 0, 4, 4, 4, 0, 0, 4, 0, 0, 0, 0, 4, 4, 4, 0, 0 }, { 0, 1, 1, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 0, 4, 4, 4, 4, 0, 4, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 4, 4, 4, 0, 4, 0, 0, 4, 0 }, { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };

const unsigned char abc [8] [27 * 5] PROGMEM = {

{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };

const unsigned char santa [4] [8] [41] PROGMEM = {

{ { 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0 }, { 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 2, 0, 1, 0, 0, 0, 0, 0, 1, 1, 2, 0 }, { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0 }, { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 } }, { { 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0 }, { 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 2, 0, 1, 0, 0, 0, 0, 0, 1, 1, 2, 0 }, { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 } }, { { 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0 }, { 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0 }, { 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0 }, { 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 }, { 0, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 1, 0, 0, 0, 0, 0, 1, 1, 2, 0 }, { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0 }, { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0 } } };

#define INFRATRIGGER_PIN D2

#define NEOPIXELS_PIN D3 #define NEO_NUMPIXELS 24

Adafruit_NeoPixel pixels = Adafruit_NeoPixel (NEO_NUMPIXELS, NEOPIXELS_PIN, NEO_GRB + NEO_KHZ800);

IPAddress localIPaddress;

IPAddress apIPaddress; Servidor WiFiServer (80); WebSocketsServer webSocket = WebSocketsServer (81); uint8_t canvas [24] [65]; uint8_t co = 0; uint8_t escena = 0; uint8_t numScenes = 5; Escenes de corda [6] = {"WORLD", "SANTA", "PEPPER", "TEXT", "MATRIX"}; uint8_t rotate = 1; uint8_t numGreens = 0; // MATRIX nombre de línies descendents uint8_t greens [64] [2]; // MATRIX pos x aleatòria de línies que cauen

configuració nul·la () {

if (DEBUG) {Serial.begin (9600); Serial.println ("Inici …"); } retard (3000);

ESP8266WiFiMulti wifiMulti;

wifiMulti.addAP ("wifissid", "pwd"); wifiMulti.addAP ("mobilessid", "pwd"); wifiMulti.addAP ("laptopssid", "pwd"); if (DEBUG) Serial.print ("Estació de connexió a"); while (wifiMulti.run ()! = WL_CONNECTED) {demora (1000); if (DEBUG) Serial.print ("."); } if (DEBUG) Serial.println (""); if (DEBUG) Serial.print ("WiFi connectat: SSID ="); if (DEBUG) Serial.println (WiFi. SSID ()); localIPaddress = WiFi.localIP (); if (DEBUG) Serial.print ("Adreça IP de l'estació local:"); if (DEBUG) Serial.println (localIPaddress);

server.begin ();

if (DEBUG) Serial.println ("S'ha iniciat el servidor (80)"); webSocket.begin (); webSocket.onEvent (webSocketEvent); if (DEBUG) Serial.println ("WebSocket (81) iniciat"); uint8_t coli = 0; for (int i = 0; i <24; i ++) {for (int j = 0; j <64; j ++) {canvas [j] = coli ++; coli = coli% 7; } tela [64] = 0; } pinMode (INFRATRIGGER_PIN, INPUT); attachInterrupt (digitalPinToInterrupt (INFRATRIGGER_PIN), paint, RISING); pixels.begin (); pixels.show (); if (DEBUG) {Serial.print ("Neopixel va començar, NUMPIXELS:"); Serial.println (pixels.numPixels ()); }}

void webSocketEvent (uint8_t num, tipus WStype_t, uint8_t * càrrega útil, mida_t longitud) {

if (escriviu == WStype_TEXT) {String req = String ((const char *) càrrega útil); if (DEBUG) {Serial.print ("81 Req:"); Serial.println (req); } processReq (req); }}

String rip2 (String s) {

Res de cadena; int i = 0; while (s ! = '/') i ++; i ++; while (s ! = '/') i ++; i ++; while (s ! = '/' && s ! = '' && s ! = '\ r' && s ! = '\ n') res + = s [i ++]; tornar res; }

void processReq (String req) {

if (req.indexOf ("/ rotate")! = -1) {rotate = 1; } else if (req.indexOf ("/ scene")! = -1) {rotate = 0; Cadena sc = rip2 (req); if (isDigit (sc [0])) scene = sc.toInt (); else {escena = 0; per a (int i = 0; i

bucle buit () {

webSocket.loop (); Client WiFiClient = servidor.available (); if (! client) {return; } Cadena req = client.readStringUntil ('\ r'); if (DEBUG) {Serial.print ("80 Req:"); Serial.println (req); } processReq (req);

client.flush ();

String s = "HTTP / 1.1 200 OK / r / nContent-Type: text / html; charset = UTF-8 / r / nAccess-Control-Allow-Headers: Content-Type / r / nAccess-Control-Allow-Origin: * / r / nConnexió: tanca / r / n / r / n "; s + = "localIP:" + ipToString (localIPaddress) + ""; s + = "apIP:" + ipToString (apIPaddress) + ""; client.print (s); retard (100); client.stop (); }

pintura buida () {

for (int i = 0; i <65; i ++) {for (int j = 0; j <24; j ++) {unsigned char ind = canvas [j] ; pixels.setPixelColor (j, pixels. Color (paleta [ind] [0], paleta [ind] [1], paleta [ind] [2])); } pixels.show (); delayMicroseconds (10); } co = (co + 1)% 40; if (rotar) {if (co == 0) {scene = (scene + 1)% numScenes; if (DEBUG) {Serial.print ("Escena:"); Serial.println (escena); }} if (co == 0) loadCanvas (escenes [escena]); } if (escenes [escena].indexOf ("SANTA")! = -1) {for (int i = 0; i <8; i ++) for (int j = 0; j = co && j

void loadCanvas (cadena què) {

clearCanvas (); if (DEBUG) {Serial.print ("loadCanvas:"); Serial.println (què); } if (what.indexOf ("TEXT")! = -1) {for (int l = 0; l <3; l ++) for (int n = 0; n = 12 && j <51) canvas [j] = pgm_read_byte_near (pepper + j-12); } else if (what.indexOf ("WORLD")! = -1) {for (int i = 0; i <24; i ++) for (int j = 0; j = 11 && j <53) canvas [j] = pgm_read_byte_near (world + j-11); }}

void clearCanvas () {

if (DEBUG) Serial.println ("clearCanvas"); for (int i = 0; i <24; i ++) per a (int j = 0; j <65; j ++) canvas [j] = 0; }

String ipToString (IPAddress ip) {

Cadena s = ""; per a (int i = 0; i <4; i ++) s + = i? "." + String (ip ): String (ip ); retorn s; }

Recomanat: