En este tutorial utilizaremos el Beetle BLE ATmega328 + Bluetooth 4.0 dispositivo de la familia DF Robot para poder controlar por vía Bluetooth la configuración de luces Neopixel tipo RGB e integrarlos en una mascara y poder te puedas lucir en las festividades de Halloween o Día de los Muertos.
Para esto requeriremos:
- Beetle BLE ATmega328 + Bluetooth 4.0
- Dos Neopixeles circulares CJMCU 16 Bit WS2812 5050 RGB LED
- Cables Caimán
- Cables Dupont Macho-Macho
- Carcasa para Power Bank 5V
- Batería 3.7V 2200mAh
- Tu mascara favorita
Diagrama de Conexión
Como puedes revisar usaremos 2 Neopixel circulares para que se utilicen en el contorno de los ojos de la mascara. El dispositivo Beetle es muy parecido al Arduino UNO, pero contando con 2 ventajas: ser mas pequeño y contar con conexión Bluetooth. Finalmente utilizaremos una Power Bank (5V a 2200mA) para poder alimentar de forma independiente a nuestro sistema.
Instalación Basica Bluno
El control del Beetle Ble via Bluetooth para lo cual se requerirá instalar el siguiente archivo APK en su dispositivo Android:
- Archivo APK : BlunoBasicDemo
- Ejecute la aplicación y siga los siguientes pasos para realizar la conexión entre dispositivos.
Ahora si contamos con nuestro sistema para poder proceder a programar los modos de encendido en los Led RGB Neopixel.
Código de control de Neopixeles
El siguiente programa tiene la siguiente estructura:
- Definición de librería para el uso de Neopixel, pin del Beetle Ble y variables.
- Inicialización
- Dentro de la función loop, tendremos que se captara el dato enviado desde nuestro dispositivo Android y se guardara en la variable “opcion”
- Dependiendo la “opcion” que sea se realizara una secuencia de encendido de los led RGB
- Los valores que el usuario tendrá que mandar serán del 0 al 3
#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> //16 MHz Adafruit Trinket #endif #define led 5 //Definimos Pin Digital 5 para datos de salida para la Neopixel Circular #define NUMPIXELS 32 //Se declara el uso de los 32 pixeles de Neopixel Circular(16x2) Adafruit_NeoPixel pixel(NUMPIXELS, led, NEO_GRB + NEO_KHZ800); int b; byte opcion; void setup() { Serial.begin (115200); //Velocidad del Serial en 115200 bauds #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000) //Se definen los parámetros para que los leds de la Neopixel funcionen a 16 MHZ clock_prescale_set(clock_div_1); #endif pixel.begin(); //se inicializa Neopixel } void loop() { if (Serial.available()) { //Condición para saber si se ha habilitado la comunicación opcion = Serial.read(); //La variable opción, guardara la información que recibe vía bluetooth Serial.println(opcion); //Imprime el dato recibido if (opcion == 48) { // si el dato recibido fue 0 , data=48 Serial.println("OFF"); // Instrucción para apagar todos los led de la Neopixel for (int b = 0; b < NUMPIXELS; b++) { //Se ejecuta una instrucción FOR para apagar uno a uno de los leds pixel.setPixelColor(b, pixel.Color(0, 0, 0)); //cada led tendrá un valor RGB (0,0,0) pixel.show(); //se mostrara dichos valores en la iluminación de los leds } } else if (opcion == 49) { //en caso de que sea 1 , data =49 Serial.println("Arcoiris"); //realizara la secuencia de iluminación tipo arcoíris pixel.setBrightness(10); //con un valor para el brillo de 10 (max 50) //función que realizara una repetición de 500 veces for (int a = 0; a < 500; a++) { //instrucción FOR para proyectar todos los colores en Neopixel, 65536 es el numero total de pixeles por 16 bits for (long firstPixelHue = 0; firstPixelHue < 5 * 65536; firstPixelHue += 256) { //instrucción para encender led por led en incremento con toda la gama de colores posibles dentro de 16 bits for (int i = 0; i < pixel.numPixels(); i++) { int pixelHue = firstPixelHue + (i * 65536L / pixel.numPixels()); pixel.setPixelColor(i, pixel.gamma32(pixel.ColorHSV(pixelHue))); } pixel.show(); //se encenderá la Neopixel delay(5); //pausa de 5 milisegundos para repetir rutina } } } else if (opcion == 50) { //en caso de que reciba 2, data=50 Serial.println("Orange Blink"); //realizara la secuencia llamada "Orange Blink" pixel.setBrightness(10); //en un brillo con valor a 10 //función que realizara una repetición de 500 veces for (int a = 0; a < 500; a++) { //función que nos ayudara a que el avance de encendido sea cada 2 leds for (int b = 0; b < 2; b++) { pixel.clear(); //se limpia la RAM de la matriz , para obtener el apagado del le for (int c = b; c < pixel.numPixels(); c += 2) { pixel.setPixelColor(c, 255, 128, 0); // los led tendrán un valor RGB(255,128,0)~Naranja~ } pixel.show(); // mostrara la iluminación de los led con la información dada delay(120); // Pausa de 120 milisegundos } } } else if (opcion == 51) { //en caso de que el valor obtenido sea 3, data 51 Serial.println("Orange Blinkx2"); //Se realizara la secuencia Orange Blinkx2 for (int a = 0; a < 50; a++) { for (int i = 0; i < pixel.numPixels(); i++) { // Cada led del Neopixel. pixel.clear(); //...se encenderá pixel.setPixelColor(i, pixel.Color(255, 128, 0)); // color RGB(255,128,0)~NARANJA~ pixel.show(); //...se mostrara delay(50); //espera de 50 milisegundos } } } else { Serial.println("None"); for (int b = 0; b < NUMPIXELS; b++) { //Se ejecuta una instrucción FOR para apagar uno a uno de los leds pixel.setPixelColor(b, pixel.Color(0, 0, 0)); //cada led tendrá un valor RGB (0,0,0) pixel.show(); } } } }
Debido a que la variable “opcion” es tipo byte, cuando se coloquen los valores de 0 al 3, sus homólogos en byte serán del 48 al 51.
Como se puede apreciar en el video, cada vez que se cambia el modo en la aplicación de BlunoBasicDemo, la iluminación de los leds será dinámica.