Paso 7: Arduino
El código de Arduino de la carga desde el archivo ZIP en la GEMMA. Necesita la biblioteca de Neopixel de Adafruit instalado así que siga las instrucciones en el enlace.
Usted puede abrir el código de Arduino completo desde el archivo ZIP en el IDE de Arduino, por lo que no simplemente pegar el archivo de código entero aquí. En cambio, voy a explicar todo en secciones. Perdona por favor el formato de pegar el código aquí. Prometo que es mucho mejor en el archivo de código real.
#include < Adafruit_NeoPixel.h >
#define LED 1
#define BTN1 0
#define BTN2 2
int lastButton1State = bajo;
int lastButton2State = bajo;
Esta sección incluye la biblioteca de Neopixel que proporciona los métodos de control para las luces. El pin del LED en el Gemma es 1, y los botones están en 0 y 2. Si está utilizando un Arduino diferente o un esquema de cableado, cambiarlas aquí. Por último, guardamos el último estado de cada uno de los botones para que nos no activar continuamente el comportamiento del botón si mantenemos pulsado el botón. Sólo queremos que esto ocurra una vez por clic.
int ledCount = 56;
Parámetro 1 = número de píxeles en tira
Parámetro 2 = número de pin (la mayoría son válidos)
Parámetro 3 = píxeles tipo banderas, sumar como sea necesario:
NEO_KHZ800 800 KHz bitstream (mayoría NeoPixel productos w/WS2812 LED)
NEO_KHZ400 400 KHz (clásico 'v1' (no el v2) FLORA pixeles, conductores WS2811)
NEO_GRB píxeles están cableados para GRB bitstream (más productos de NeoPixel)
NEO_RGB píxeles están cableados para RGB bitstream (v1 FLORA pixeles, no v2)
Tira de Adafruit_NeoPixel = Adafruit_NeoPixel (ledCount, LED, NEO_GRB + NEO_KHZ800);
He utilizado 56 LEDs en mi build, asi puse como variable. Se inicializa el objeto tira 56 LEDs, el pin LED definido y los valores para Gemma y WS2812b tipo LED.
colores de uint32_t [5] = {tira. Color (255, 255, 0) / / amarillo
de la tira. Color (127, 0, 255), / / púrpura
de la tira. Color (0, 255, 0) / / verde
de la tira. Color (255, 0, 0) / / rojo
de la tira. Color (0, 0, 255);} azul
int currentColor = 0;
maxColor de int = 5;
int defaultBrightness = 50;
Decidí usar 5 colores en el ciclo. Amarillo es el color estándar, Zelda lleva morado, y el resto sólo parecía fresco. Los valores currentColor y maxColor nos permiten recorrer los 5 colores. El brillo máximo es 255, así que me puse a 50 a permite mucho espacio para crecer en el modo de fuego.
void setup() {}
inicializar el perno pulsador como entrada:
pinMode (BTN1, INPUT_PULLUP);
pinMode (BTN2, INPUT_PULLUP);
Strip.Begin();
para (int i = 0; i < ledCount; i ++)
{
strip.setPixelColor (i, colors[currentColor]);
}
Haz más brillante
para (int i = 5; i < defaultBrightness; i += 2).
{
strip.setBrightness(i);
Strip.Show();
Delay(50);
}
}
Este es el método llamado cuando el arco se enciende. Inicializa los botones y las luces, establece el color amarillo y poco a poco aumenta el brillo de 0 a 50.
void loop() {}
para (int i = 0; i < 2000; i ++)
{
int button1State = digitalRead(BTN1);
Si (button1State! = lastButton1State)
{
lastButton1State = button1State;
Si (button1State == LOW)
changeColor();
}
int button2State = digitalRead(BTN2);
Si (button2State! = lastButton2State)
{
lastButton2State = button2State;
Si (button2State == LOW)
fireArrow();
}
Delay(5);
}
Pulse();
}
Esto es donde el Arduino se bucle la mayoría del tiempo, a la espera de una pulsación. Quería los botones a ser sensible, así que comprueba para haga clic en botón durante unos 10 segundos (tiempos de 2000 iteraciones un 5ms retardo) antes de que muestra el efecto de pulso ocioso. Si se pulsa un botón, muestra ese efecto antes de regresar a este método y continuar el bucle.
void pulse()
{
Haz ligeramente dimmer
para (int i = defaultBrightness; i > defaultBrightness / 2; i-= 5)
{
strip.setBrightness(i);
Strip.Show();
Delay(50);
}
Haz más brillante
para (int i = defaultBrightness / 2; i < defaultBrightness; i += 5)
{
strip.setBrightness(i);
Strip.Show();
Delay(50);
}
}
Este es el efecto de la inactividad. Queremos que ser rápido para que no pierda un clic de botón. Camina el brillo hacia abajo por 5 cada 50ms hasta que llega a la mitad del brillo de la inactividad, entonces vuelve a la normalidad.
void changeColor()
{
currentColor ++;
Si (currentColor == maxColor)
{
currentColor = 0;
}
int i1 = 2;
int i2 = 27;
int i3 = 28;
int i4 = 55;
Bucle y cambian de color
para (int i = 0; i < 14; i ++)
{
Sets colores
strip.setPixelColor (i1, colors[currentColor]);
strip.setPixelColor (i2, colors[currentColor]);
strip.setPixelColor (i3, colors[currentColor]);
strip.setPixelColor (i4, colors[currentColor]);
Iteradores de actualización
Si (i == 3)
I1 = 1;
else if (i == 4)
I1 = 6;
else if (== 5)
I1 = 0;
else if (i == 6)
I1 = 7;
otra cosa
I1 ++;
I2--;
i3 ++;
I4;
Actualizar y esperar un poco
Strip.Show();
Delay(50);
}
}
Cuando se hace clic en el botón de cambiar de color, los LEDs se cambian al siguiente color en el lazo. Hice las luces desde el centro del arco y cambiar rápidamente el color en un efecto dominó que va hacia el exterior. Esta pieza de código es rara porque las luces están en una larga cadena, pero nosotros los hemos dividido en 4 secciones. La primera sección es atado con alambre diferentemente de las otras secciones de 3, entonces el iterador i1 necesita una manipulación especial para seguir el orden correcto.
void fireArrow()
{
Haz ligeramente dimmer
para (int i = defaultBrightness; i > 20; i-= 5)
{
strip.setBrightness(i);
Strip.Show();
Delay(20);
}
Haz más brillante
para (int i = 20; i < 250; i += 5)
{
strip.setBrightness(i);
Strip.Show();
Delay(30);
}
Alojarte brillante un poco
Delay(800);
Haz dimmer
para (int i = 250; i > defaultBrightness; i-= 10)
{
strip.setBrightness(i);
Strip.Show();
Delay(30);
}
}
Finalmente, el efecto de fuego el arco establece en brillo máximo para apenas tímido de un segundo, entonces se atenúa a ralentí.
Esperemos que todo esto tiene sentido. Si desea modificar los colores o efectos, debe ser bastante fácil de ajustar.