#include <FastLED_NeoPixel.h>
#include <FastLED.h>
#include <IRremote.h> // importa libreria IRremote
int SENSOR = 11; // sensor KY-022 a pin digital 11
// Which pin on the Arduino is connected to the LEDs?
#define DATA_PIN 6
// How many LEDs are attached to the Arduino?
#define NUM_LEDS 103
// LED brightness, 0 (min) to 255 (max)
#define BRIGHTNESS 150
// Define los Codigos IR Asignados
#define Boton_A 0xB24D4040
#define Boton_B 0xBC434040
#define Boton_1 0xFE014040
#define Boton_2 0xFD024040
#define Boton_3 0xFC034040
#define Boton_4 0xFB044040
#define Boton_5 0xFA054040
#define Boton_6 0xF9064040
#define Boton_7 0xF8074040
#define Boton_8 0xF7084040
#define Boton_9 0xF6094040
#define Boton_10 0xF00F4040
#define Boton_11 0xFF004040
#define Boton_12 0xF30C4040
#define Boton_13 0xF40B4040
#define Boton_14 0xEE114040
#define Boton_15 0xF10E4040
#define Boton_16 0xEF104040
#define Boton_17 0xF20D4040
#define Boton_18 0xAC534040
#define Boton_19 0xA45B4040
#define Boton_20 0xA8574040
#define Boton_21 0xAB544040
#define Boton_22 0xE31C4040
#define Boton_23 0xE11E4040
#define Boton_24 0xE01F4040
#define Boton_25 0xEA154040
// Adafruit_NeoPixel strip(NUM_LEDS, DATA_PIN, NEO_GRB); // <- Adafruit NeoPixel version
FastLED_NeoPixel<NUM_LEDS, DATA_PIN, NEO_GRB> strip; // <- FastLED NeoPixel version
void setup()
{
Serial.begin(9600); // inicializa comunicacion serie a 9600 bps
IrReceiver.begin(SENSOR, DISABLE_LED_FEEDBACK); // inicializa recepcion de datos
strip.begin(); // Inicializa la Tira LEd (required!)
strip.setBrightness(BRIGHTNESS); // Incicializa el brillo para la Tira Led
}
void loop()
{
if (IrReceiver.decode())
{
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
if (IrReceiver.decodedIRData.decodedRawData == Boton_A) // si codigo recibido es igual a Boton_0
{
blank(1000); // Apaga todos los Leds en espera del siguiente comando
colorWipe(strip.Color(0, 0, 0), 10);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_B) // si codigo recibido es igual a Boton_5
{
//blank(50); // espera de 0.2 segundo antes de iniciar el efecto
rainbow(7, 8); // (15 Velocidad circulacion colores, 10 Cantidas de vueltas o duracion)
theaterChase(strip.Color(255, 0, 255), 100, 3, 5);
theaterChase(strip.Color(0, 155, 250), 100, 3, 5);
theaterChase(strip.Color(255, 0, 30), 100, 3, 5);
blank(1000); // Apaga los Leds despues de ejecutar el efecto anterior
colorWipe(strip.Color(15, 255, 45), 25);
blank(1000);
colorWipe(strip.Color(15, 255, 45), 25);
blank(1000);
colorWipe(strip.Color(255, 0, 30), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_1){ // si codigo recibido es igual a Boton_1
blank(250); // espera de 0.2 segundo antes de iniciar el efecto
colorWipe(strip.Color(0, 145, 250), 25); // CYAN (Color, Color, Color), 25 Velocidad del efecto
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_2){ // si codigo recibido es igual a Boton_2
blank(250); // espera de 0.2 segundo antes de iniciar el efecto
colorWipe(strip.Color(15, 255, 45), 25); // AZUL (Color, Color, Color), 25 Velocidad del efecto
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_3){ // si codigo recibido es igual a Boton_3
blank(250); // espera de 0.2 segundo antes de iniciar el efecto
colorWipe(strip.Color(255, 0, 255), 25); // LIMON (Color, Color, Color), 25 Velocidad del efecto
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_4){ // si codigo recibido es igual a Boton_4
blank(250); // espera de 0.2 segundo antes de iniciar el efecto
colorWipe(strip.Color(250, 25, 0), 25); // ROSA (Color, Color, Color), 25 Velocidad del efecto
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_5){ // si codigo recibido es igual a Boton_4
blank(250); // espera de 0.2 segundo antes de iniciar el efecto
colorWipe(strip.Color(255, 0, 30), 25); // NARANJA (Color, Color, Color), 25 Velocidad del efecto
}
// Naranja
if (IrReceiver.decodedIRData.decodedRawData == Boton_6){ //sector A Escritorio
SectorA(strip.Color(255, 0, 30), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_7){ //sector B Marcadores y Reglas
SectorB(strip.Color(255, 0, 30), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_8){ //sector C Impresora 3D
SectorC(strip.Color(255, 0, 30), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_9){ //sector D Estante Libros
SectorD(strip.Color(255, 0, 30), 25);
}
// Rosado
if (IrReceiver.decodedIRData.decodedRawData == Boton_10){ //sector A Escritorio
SectorA(strip.Color(250, 25, 0), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_11){ //sector B Marcadores y Reglas
SectorB(strip.Color(250, 25, 0), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_12){ //sector C Impresora 3D
SectorC(strip.Color(250, 25, 0), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_13){ //sector D Estante Libros
SectorD(strip.Color(250, 25, 0), 25);
}
// Limon
if (IrReceiver.decodedIRData.decodedRawData == Boton_14){ //sector A Escritorio
SectorA(strip.Color(255, 0, 255), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_15){ //sector B Marcadores y Reglas
SectorB(strip.Color(255, 0, 255), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_16){ //sector C Impresora 3D
SectorC(strip.Color(255, 0, 255), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_17){ //sector D Estante Libros
SectorD(strip.Color(255, 0, 255), 25);
}
// Azul
if (IrReceiver.decodedIRData.decodedRawData == Boton_18){ //sector A Escritorio
SectorA(strip.Color(15, 255, 45), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_19){ //sector B Marcadores y Reglas
SectorB(strip.Color(15, 255, 45), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_20){ //sector C Impresora 3D
SectorC(strip.Color(15, 255, 45), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_21){ //sector D Estante Libros
SectorD(strip.Color(15, 255, 45), 25);
}
// Cyan
if (IrReceiver.decodedIRData.decodedRawData == Boton_22){ //sector A Escritorio
SectorA(strip.Color(0, 145, 250), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_23){ //sector B Marcadores y Reglas
SectorB(strip.Color(0, 145, 250), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_24){ //sector C Impresora 3D
SectorC(strip.Color(0, 145, 250), 25);
}
if (IrReceiver.decodedIRData.decodedRawData == Boton_25){ //sector D Estante Libros
SectorD(strip.Color(0, 145, 250), 25);
}
IrReceiver.resume();
}
delay(100);
}
// theaterChase(strip.Color(0, 255, 255), 100, 3, 5); // cyan
// theaterChase(strip.Color(255, 0, 255), 100, 3, 5); // magenta
// theaterChase(strip.Color(255, 255, 0), 100, 3, 5); // yellow
/*Efecto 1
* Rellena una tira con un color específico, comenzando en 0 y continuando
* hasta llenar toda la tira. Toma dos argumentos:
*
* 1. el color a utilizar en el relleno
* 2. la cantidad de tiempo de espera después de escribir cada LED
*/
void colorWipe(uint32_t color, unsigned long wait)
{
for (unsigned int i = 0; i < strip.numPixels(); i++)
{
strip.setPixelColor(i, color);
strip.show();
delay(wait);
}
}
/*Efecto 1A
* Sector A
*/
void SectorA(uint32_t color, unsigned long wait)
{
for (unsigned int i = 0; i < 39; i++)
{
strip.setPixelColor(i, color);
strip.show();
delay(wait);
}
}
/*Efecto 1B
* Sector B
*/
void SectorB(uint32_t color, unsigned long wait)
{
for (unsigned int i = 39; i < 63; i++)
{
strip.setPixelColor(i, color);
strip.show();
delay(wait);
}
}
/*Efecto 1C
* Sector C
*/
void SectorC(uint32_t color, unsigned long wait)
{
for (unsigned int i = 63; i < 79; i++)
{
strip.setPixelColor(i, color);
strip.show();
delay(wait);
}
}
/*Efecto 1D
* Sector D
*/
void SectorD(uint32_t color, unsigned long wait)
{
for (unsigned int i = 79; i < 103; i++)
{
strip.setPixelColor(i, color);
strip.show();
delay(wait);
}
}
/*Efecto 2
* Ejecuta una secuencia de "Chase - Persecución" estilo marquesina. Toma tres argumentos:
*
* 1. el color a usar en la persecución (chase)
* 2. la cantidad de tiempo de espera entre fotogramas
* 3. el número de LED en cada grupo de 'persecución' ('chase')
* 3. el número de secuencias de persecución a realizar
*/
void theaterChase(uint32_t color, unsigned long wait, unsigned int groupSize, unsigned int numChases)
{
for (unsigned int chase = 0; chase < numChases; chase++) {
for (unsigned int pos = 0; pos < groupSize; pos++) {
strip.clear(); // turn off all LEDs
for (unsigned int i = pos; i < strip.numPixels(); i += groupSize) {
strip.setPixelColor(i, color); // turn on the current group
}
strip.show();
delay(wait);
}
}
}
/*Efecto 3
* Animación de arco iris simple, iteractuando a través de todos los tonos de 8 bits. Cambios de color de LED
* basado en la posición de la tira. Toma dos argumentos:
*
* 1. la cantidad de tiempo de espera entre fotogramas
* 2. el número de bucles arcoíris para recorrer
*/
void rainbow(unsigned long wait, unsigned int numLoops)
{
for (unsigned int count = 0; count < numLoops; count++) {
// iterate through all 8-bit hues, using 16-bit values for granularity
for (unsigned long firstPixelHue = 0; firstPixelHue < 65536; firstPixelHue += 256) {
IrReceiver.resume();
for (unsigned int i = 0; i < strip.numPixels(); i++) {
unsigned long pixelHue = firstPixelHue + (i * 65536UL / strip.numPixels()); // vary LED hue based on position
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue))); // assign color, using gamma curve for a more natural look
}
strip.show();
delay(wait);
}
}
IrReceiver.resume();
}
/*Apagado
* Deja en blanco los LED y espera un momento.
*/
void blank(unsigned long wait)
{
strip.clear();
strip.show();
delay(wait);
}