Luces de Navidad de Arduino (14 / 14 paso)

Paso 14: Software

Diré que obtuve mi comienzo de este tiempo de alguna otra página. No puedo encontrar donde lo conseguí, y tuvo que hacer muchos cambios de todos modos, así que yo soy carga aquí. Una vez que tengas esto es muy fácil de crear un programa para cualquier canción... pero si eres como yo es mejor en el cableado técnico y programación que están emparejando los baile luces música... para tener un punto de partida es una gran ayuda.

Así que aquí está el código. Otra vez es el código para la alegría en el archivo del mundo. La versión que subí es MP3, pero si se utiliza el protector de la onda tendrá que convertir a WAV.

También, me cansé de lidiar con el código muy largo para las luces en el lazo, así que hice una función, llamada "joy()".
Aquí está el código de Arduino:

Por: Tre' Landrum
#include
#include
#include
#include "WaveUtil.h"
#include "WaveHC.h"

Tarjeta SdReader; Este objeto contiene la información de la tarjeta
FatVolume vol; Contiene la información de la partición en la tarjeta
FatReader raíz; Esto contiene la información para el sistema de archivos en la tarjeta
FatReader f; Esto contiene la información del archivo estamos jugamos

Ola WaveHC; Este es el único objeto (audio) de la onda, puesto que sólo jugaremos uno a la vez

#define DEBOUNCE 5 / botón debouncer

Esto es para la alegría de durante las luces bailar al mundo
Si usas el Uno en lugar de la Mega, necesitará cambiar estos pines. Si utilizas el WaveShield sólo tienes unos pocos pins avaialbe... 6 a 9 de la parte superior de mi cabeza.
light1 int = 22;
light2 int = 24;
light3 int = 26;
light4 de int = 28;
int light5 = 30;
int light6 = 32;
int light7 = 34;
int light8 = 36;
int s = 150;
int ds = 225;
int e = 300;
de int = 450;
int q = 600; 600
int dq = 900;
int h = 0; 1200
int dh = 1800;
int comienzo;
int fin;
int tiempo;
int

Va a cambiar las variables:

Aquí es donde definimos los botones que vamos a utilizar. botón "1" es la primera, botón "6" es el 6, etc.
botones de Byte [] = {14, 15, 16, 17, 18, 19};
Esta macro útil nos permite determinar cuán grande es la matriz hasta arriba, comprobando el tamaño
#define NUMBUTTONS sizeof(buttons)
haremos el seguimiento si un botón se presiona sólo, sólo lanzado o 'presionado' (el estado actual
byte volátil presiona [NUMBUTTONS], justpressed [NUMBUTTONS], justreleased [NUMBUTTONS];

Esta práctica función devolverá el número de bytes actualmente libres en RAM, ideal para depuración!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
Si ((int) __brkval == 0) {}
free_memory = ((int) & free_memory)-((int) & __bss_end);
}
Else {}
free_memory = ((int) & free_memory)-((int) __brkval);
}
volver free_memory;
}

void sdErrorCheck(void)
{
Si (! card.errorCode()) retorno;
putstring ("\n\rSD I/O error:");
Serial.Print(Card.ErrorCode(), hexagonal);
putstring (",");
Serial.println(Card.errorData(), hexagonal);
while(1);
}

void setup() {}
byte me;

Configurar puerto serie
Serial.Begin(9600);
putstring_nl ("WaveHC con");
Serial.Print (NUMBUTTONS, DEC);
putstring_nl("buttons");

putstring ("memoria RAM libre:"); Esto puede ayudar con la depuración, es malo quedarse sin RAM
Serial.println(freeRam()); Si es menor de 150 bytes escribe con problemas!

Configurar los pines de salida para el control de la DAC. Este los pernos se definen en la biblioteca
pinMode (2, salida);
pinMode (3, salida);
pinMode (4, salida);
pinMode (5, salida);

pin13 LED
pinMode (13, salida);

Hacer entrada y habilitar las resistencias pull-up en las patillas del interruptor
para (i = 0; i < NUMBUTTONS; i ++) {}
pinMode (botones [i], entrada);
digitalWrite (botones [i], HIGH);
}

Si (! card.init(true)) {//play con spi de 4 MHz si 8MHz no funciona para usted
Si (! card.init()) {//play con spi de 8 MHz (por defecto más rápido!)
putstring_nl ("tarjeta init. no se pudo!"); Algo salió mal, permite imprimir por qué
sdErrorCheck();
while(1); entonces 'detener': ¡ no!
}

permiten optimizar la lectura - algunas tarjetas pueden tiempo de espera. Desactivar si tienes problemas
card.partialBlockRead(true);

Ahora buscaremos una partición FAT!
parte de uint8_t;
para (parte = 0; parte < 5; parte ++) {/ / tenemos hasta 5 ranuras en
Si (vol.init (tarjeta, parte))
rotura; encontró uno, permite la libertad bajo fianza
}
Si (parte == 5) {/ / si terminamos por no encontrar uno :(
putstring_nl ("No válida partición FAT!");
sdErrorCheck(); Algo salió mal, permite imprimir por qué
while(1); entonces 'detener': ¡ no!
}

Permite decir que el usuario lo que encontramos
putstring ("partición de uso");
Serial.Print (parte, DEC);
putstring (", el tipo es grasa");
Serial.println(Vol.fatType(),DEC); ¿FAT16 o FAT32?

Intente abrir el directorio raíz
Si (! {root.openRoot(vol))}
putstring_nl ("no se puede abrir raíz dir!"); Algo salió mal,
while(1); entonces 'detener': ¡ no!
}

¡ UF! Llegamos pasado las partes difíciles.
putstring_nl("Ready!");

TCCR2A = 0;
TCCR2B = 1 <
Permiten interrumpir el desbordamiento del TIMER2
TIMSK2 | = 1 <
pinMode (light1, salida);
pinMode (light2, salida);
pinMode (light3, salida);
pinMode (light4, salida);
pinMode (light5, salida);
pinMode (light6, salida);
pinMode (light7, salida);
pinMode (light8, salida);

el relé de SainSmart son de alta
digitalWrite(light1,HIGH);
digitalWrite(light2,HIGH);
digitalWrite(light3,HIGH);
digitalWrite(light4,HIGH);
digitalWrite(light5,HIGH);
digitalWrite(light6,HIGH);
digitalWrite(light7,HIGH);
digitalWrite(light8,HIGH);
Serial.Begin(9600);

} //void setup()

{Signal(TIMER2_OVF_vect)}
check_switches();
}

void check_switches()
{
Static byte previousstate [NUMBUTTONS];
currentstate static byte [NUMBUTTONS];
Índice de bytes;

para (índice = 0; índice < NUMBUTTONS; índice ++) {}
CurrentState [índice] = digitalRead(buttons[index]); leer el botón

/*
Serial.Print (índice, DEC);
Serial.Print (": cstate =");
Serial.Print (currentstate [índice], DEC);
Serial.Print (", pstate =");
Serial.Print (previousstate [index], DEC);
Serial.Print (", presione =");
*/

Si (currentstate [índice] == {} previousstate[index])
Si ((presiona [índice] == LOW) & & (currentstate [índice] == LOW)) {}
solo presiona
justpressed [index] = 1;
}
else if ((presiona [índice] == HIGH) & & (currentstate [índice] == HIGH)) {}
acaba de publicar
justreleased [index] = 1;
}
presiona [índice] =! currentstate [índice]; Recuerde, medios digitales de alta no
}
Serial.println (prensada [índice], DEC);
previousstate [index] = currentstate [índice]; mantener una cuenta corriente de los botones
}
}

//**********************************************************************************************************
//**********************************************************************************************************

void loop() {}
byte me;

Asegúrese de que cambiar el nombre del archivo que usted desee
playfile ("alegría. WAV");

Joy(); Esta es la función que desempeña la alegría al mundo

} //void loop() {}

//**********************************************************************************************************
//**********************************************************************************************************

Reproduce un archivo completo de principio a fin sin pausa.
void playcomplete(char *name) {}
llamar a nuestro ayudante para buscar y reproducir este nombre
playfile(Name);
mientras (wave.isplaying) {}
no hacer nada durante la reproducción de su
}
su hecho reproduciendo
}

void playfile(char *name) {}
ver si el objeto ola está haciendo algo
Si (wave.isplaying) {/ / así que ya está reproduciendo algo, stop!
Wave.STOP(); Basta
}
Buscar en el directorio raíz y abre el archivo
Si (! f.open (raíz, nombre)) {}
putstring ("no puede abrir archivo"); Serial.Print(Name); retorno;
}
Leer bien el archivo y convertirlo en un objeto de onda
Si (! {wave.create(f))}
putstring_nl ("no un válido WAV"); retorno;
}

OK el tiempo para jugar! iniciar la reproducción
Wave.Play();
}

Función para hacer los diferentes filamentos de luz diferentes
void joy() {}

putstring_nl ("comienzo de la alegría al mundo");

Start = millis();
digitalWrite (light1, LOW);
digitalWrite (light8, bajo);
Delay(q);
digitalWrite (light1, HIGH);
digitalWrite (light8, HIGH);

digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
Delay(de);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);

digitalWrite (light3, LOW);
digitalWrite (light6, bajo);
Delay(s);
digitalWrite (light3, HIGH);
digitalWrite (light6, HIGH);

digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
Delay(1050);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);

digitalWrite (light1, LOW);
digitalWrite (light8, bajo);
Delay(s);
digitalWrite (light1, HIGH);
digitalWrite (light8, HIGH);

digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
Delay(q);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);

digitalWrite (light3, LOW);
digitalWrite (light6, bajo);
Delay(q);
digitalWrite (light3, HIGH);
digitalWrite (light6, HIGH);

digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
Delay(DQ);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);

digitalWrite (light1, LOW);
digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
digitalWrite (light8, bajo);
Delay(e);
digitalWrite (light1, HIGH);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);
digitalWrite (light8, HIGH);

digitalWrite (light2, LOW);
digitalWrite (light3, LOW);
digitalWrite (light6, bajo);
digitalWrite (light7, bajo);
Delay(DQ);
digitalWrite (light2, HIGH);
digitalWrite (light3, HIGH);
digitalWrite (light6, HIGH);
digitalWrite (light7, HIGH);

digitalWrite (light1, LOW);
digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
digitalWrite (light8, bajo);
Delay(e);
digitalWrite (light1, HIGH);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);
digitalWrite (light8, HIGH);

digitalWrite (light3, LOW);
digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
digitalWrite (light6, bajo);
Delay(DQ);
digitalWrite (light3, HIGH);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);
digitalWrite (light6, HIGH);

digitalWrite (light1, LOW);
digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
digitalWrite (light8, bajo);
Delay(e);
digitalWrite (light1, HIGH);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);
digitalWrite (light8, HIGH);

digitalWrite (light1, LOW);
digitalWrite (light2, LOW);
digitalWrite (light3, LOW);
digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
digitalWrite (light6, bajo);
digitalWrite (light7, bajo);
digitalWrite (light8, bajo);
Delay(DQ);
digitalWrite (light1, HIGH);
digitalWrite (light2, HIGH);
digitalWrite (light3, HIGH);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);
digitalWrite (light6, HIGH);
digitalWrite (light7, HIGH);
digitalWrite (light8, HIGH);
8100

digitalWrite (light8, bajo);
Delay(e);
digitalWrite (light8, HIGH);

digitalWrite (light1, LOW);
Delay(e);
digitalWrite (light1, HIGH);

digitalWrite (light7, bajo);
Delay(e);
digitalWrite (light7, HIGH);

digitalWrite (light2, LOW);
Delay(e);
digitalWrite (light2, HIGH);

digitalWrite (light6, bajo);
Delay(e);
digitalWrite (light6, HIGH);

digitalWrite (light3, LOW);
Delay(de);
digitalWrite (light3, HIGH);

digitalWrite (light5, bajo);
Delay(s);
digitalWrite (light5, HIGH);

digitalWrite (light4, LOW);
Delay(e);
digitalWrite (light4, HIGH);

digitalWrite (light8, bajo);
Delay(e);
digitalWrite (light8, HIGH);

digitalWrite (light1, LOW);
Delay(e);
digitalWrite (light1, HIGH);

digitalWrite (light7, bajo);
Delay(e);
digitalWrite (light7, HIGH);

digitalWrite (light2, LOW);
Delay(e);
digitalWrite (light2, HIGH);

digitalWrite (light6, bajo);
Delay(e);
digitalWrite (light6, HIGH);

digitalWrite (light3, LOW);
Delay(de);
digitalWrite (light3, HIGH);

digitalWrite (light5, bajo);
Delay(s);
digitalWrite (light5, HIGH);

digitalWrite (light4, LOW);
Delay(e);
digitalWrite (light4, HIGH);

digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
Delay(e);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);

digitalWrite (light1, LOW);
digitalWrite (light8, bajo);
Delay(e);
digitalWrite (light1, HIGH);
digitalWrite (light8, HIGH);

digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
Delay(e);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);

13806

digitalWrite (light1, LOW);
digitalWrite (light8, bajo);
Delay(e);
digitalWrite (light1, HIGH);
digitalWrite (light8, HIGH);

digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
Delay(75);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);

digitalWrite (light3, LOW);
digitalWrite (light6, bajo);
Delay(75);
digitalWrite (light3, HIGH);
digitalWrite (light6, HIGH);

digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
Delay(DQ);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);

digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
Delay(75);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);
15235

digitalWrite (light3, LOW);
digitalWrite (light6, bajo);
Delay(75);
digitalWrite (light3, HIGH);
digitalWrite (light6, HIGH);

digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
Delay(e);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);

digitalWrite (light3, LOW);
digitalWrite (light6, bajo);
Delay(e);
digitalWrite (light3, HIGH);
digitalWrite (light6, HIGH);

digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
Delay(e);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);

digitalWrite (light3, LOW);
digitalWrite (light6, bajo);
Delay(75);
digitalWrite (light3, HIGH);
digitalWrite (light6, HIGH);

digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
Delay(75);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);

digitalWrite (light1, LOW);
digitalWrite (light8, bajo);
Delay(DQ);
digitalWrite (light1, HIGH);
digitalWrite (light8, HIGH);

digitalWrite (light1, LOW);
digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
digitalWrite (light8, bajo);
Delay(75);
digitalWrite (light1, HIGH);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);
digitalWrite (light8, HIGH);

17339

digitalWrite (light2, LOW);
digitalWrite (light3, LOW);
digitalWrite (light6, bajo);
digitalWrite (light7, bajo);
Delay(75);
digitalWrite (light2, HIGH);
digitalWrite (light3, HIGH);
digitalWrite (light6, HIGH);
digitalWrite (light7, HIGH);

digitalWrite (light3, LOW);
digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
digitalWrite (light6, bajo);
Delay(e);
digitalWrite (light3, HIGH);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);
digitalWrite (light6, HIGH);

digitalWrite (light1, LOW);
digitalWrite (light2, LOW);
digitalWrite (light3, LOW);
digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
digitalWrite (light6, bajo);
digitalWrite (light7, bajo);
digitalWrite (light8, bajo);
Delay(q);
digitalWrite (light1, HIGH);
digitalWrite (light2, HIGH);
digitalWrite (light3, HIGH);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);
digitalWrite (light6, HIGH);
digitalWrite (light7, HIGH);
digitalWrite (light8, HIGH);

18315

digitalWrite (light1, LOW);
digitalWrite (light8, bajo);
Delay(e);
digitalWrite (light1, HIGH);
digitalWrite (light8, HIGH);

digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
Delay(de);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);

digitalWrite (light3, LOW);
digitalWrite (light6, bajo);
Delay(s);
digitalWrite (light3, HIGH);
digitalWrite (light6, HIGH);

digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
Delay(e);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);

digitalWrite (light3, LOW);
digitalWrite (light6, bajo);
Delay(e);
digitalWrite (light3, HIGH);
digitalWrite (light6, HIGH);

putstring_nl(""); 19817

digitalWrite (light2, LOW);
digitalWrite (light7, bajo);
Delay(300);//DELAY(q);
digitalWrite (light2, HIGH);
digitalWrite (light7, HIGH);

ahora = millis();
tiempo = empezar ahora -;
Serial.println(Time); 20117

digitalWrite (light1, LOW);
digitalWrite (light8, bajo);
Delay(300);//DELAY(q);
digitalWrite (light1, HIGH);
digitalWrite (light8, HIGH);

putstring_nl ("último bit");
21018

digitalWrite (light1, LOW);
digitalWrite (light2, LOW);
digitalWrite (light3, LOW);
digitalWrite (light4, LOW);
digitalWrite (light5, bajo);
digitalWrite (light6, bajo);
digitalWrite (light7, bajo);
digitalWrite (light8, bajo);
Delay(h);
digitalWrite (light1, HIGH);
digitalWrite (light2, HIGH);
digitalWrite (light3, HIGH);
digitalWrite (light4, HIGH);
digitalWrite (light5, HIGH);
digitalWrite (light6, HIGH);
digitalWrite (light7, HIGH);
digitalWrite (light8, HIGH);
Delay(000);

putstring_nl ("final de la canción");
final = millis();
tiempo = final - inicio;
Serial.println(Time);
Serial.println(Start);
Serial.println(end);
}

Artículos Relacionados

Programa de una cadena de luces de Navidad a parpadear el código morse con Arduino y Snap circuitos

Programa de una cadena de luces de Navidad a parpadear el código morse con Arduino y Snap circuitos

esto es un proyecto de mi hijo Dylan (9) y pongo usando una placa de circuito de Arduino, un conjunto de broche de presión del circuito y una cadena de luces de Navidad.Lo que usted necesita:Un Arduino: Un Arduino es un equipo en una sola placa de ci
Luces de Navidad Musical accionado Arduino

Luces de Navidad Musical accionado Arduino

después de explorar la Web de Instructables he encontrado unos pocos proyectos que enarboló mi interés y los que me llevan a pensar, podría hacer algunas luces de Navidad musical. Mayoría de lo que gasté mi tiempo en vino de Instructable de Amanda Gh
3 canal arduino Powered controlador de luces de Navidad!

3 canal arduino Powered controlador de luces de Navidad!

Para Navidad este año, quise hacer un proyecto genial pero bastante no sabía qué hacer. Como me estaba poniendo la salida de luces de Navidad para decorar, había un viejo temporizador de luz de Navidad roto. Tomé distancia y miró a su alrededor en el
Arduino controla intermitente hadas luces de Navidad con Jingle Bells

Arduino controla intermitente hadas luces de Navidad con Jingle Bells

como mi primer proyecto de Arduino que quería hacer algo impresionante pero no demasiado difíciles. Entré en un Hack de Navidad con este proyecto y lo ganó! La gente le encanta las luces de Navidad.Al final de este tienes un juego de luces de hadas d
Luces de Navidad de música usando Arduino

Luces de Navidad de música usando Arduino

mi esposa y yo hemos querido crear nuestro propio show de luces-conjunto de música de las últimas temporadas de vacaciones.  Inspirado en los dos siguientes de Instructables, se decidió finalmente comenzar este año y decorar nuestro RV  Quería un con
Caja de Navidad: Arduino/ioBridge internet controla luces de Navidad y show musical

Caja de Navidad: Arduino/ioBridge internet controla luces de Navidad y show musical

mi proyecto de Navidad de la caja consiste en un internet controlado por luces de Navidad y show musical. Una canción de Navidad se puede solicitar on-line que se ponen en una cola y jugó en el orden que se pidió. La música es transmitida en una emis
Musicalmente sincronizada las luces de Navidad

Musicalmente sincronizada las luces de Navidad

Durante la temporada de Navidad, que es obligados a ver casas que se engalana con luces de Navidad que se sincronizan a la música. Puedes estar pensando que tu casa nunca será capaz de tener luces de Navidad musical porque los sistemas de control son
Controlador de luz de Navidad de Arduino

Controlador de luz de Navidad de Arduino

si te gustó este instructable, considerar revisar mi nProbablemente has visto todos esos videos donde la gente hace hay luces de Navidad danzan a la música, crees que tu wow del uno mismo que se ve realmente fresco... nunca pude hacerlo. BUENO... pue
Luces de Navidad Musical controlado por ordenador

Luces de Navidad Musical controlado por ordenador

en este Instructable, voy a enseñar todos los pasos básicos de cómo construir tu propio ordenador controlado musical luces de Navidad. Esta configuración es muy simple y común. Dentro de unas horas, también puede crear su propia exhibición ligera par
Luces de Navidad musicales de frambuesa Pi

Luces de Navidad musicales de frambuesa Pi

Instrucciones para un conjunto de estrellas que se iluminan según una melodía musical. El concepto es que cada estrella representa una nota y conforme avanza la canción se enciende la estrella asociada a la nota actual. El programa de instalación uti
Controlar las luces de Navidad con mensajes de texto

Controlar las luces de Navidad con mensajes de texto

Realmente quería ser capaz de controlar mis luces de Navidad de forma remota, con un Arduino.Con esta solución usted puede controlar mis luces remotamente, vía mensajes de texto!Conocimientos necesarios:De soldaduraCableadoCopiar y pegarPaso 1: Compo
Controlador de luces de Navidad DIY simple

Controlador de luces de Navidad DIY simple

Feliz Navidad y ' All! Sé que es raro que hago un ' ible, pero a hacer una Navidad instructable para usted hoy. Durante un tiempo quieren hacer una configuración de luz de Navidad de controlado por ordenador pero no las piezas a construir uno o el di
Control luces de Navidad con el Edison Intel + Grove Smart Relay

Control luces de Navidad con el Edison Intel + Grove Smart Relay

Este Instructable le guiará por el proceso de usar el tablero de Edison de Intel y el relé inteligente de Grove para controlar las luces de Navidad (o cualquier otro elemento electrónico para esa materia).Al final de este Instructable, tendrás un enc
Luces de Navidad al aire libre (en forma bola)

Luces de Navidad al aire libre (en forma bola)

Luces de Navidad generalmente son un poco aburrido, así que he decidido crear más sofisticadas. Soy capaz de controlar cada LED y fijar la intensidad luminosa de 0 a 100% de permitido actual.Paso 1: Materiales, herramientas y habilidadesTendrá que co