/*
 * Ejemplo de control de Neopixels con botones para la placa Neofan de FANIOT.
 * Este programa enciende una tira de Neopixels conectada al pin 27 y cambia los colores entre rojo, verde y azul
 * según el botón presionado (izquierdo, central o derecho).
 * 
 * Para usar este código, debes instalar la librería Adafruit NeoPixel:
 * En el Arduino IDE, ve a Sketch -> Incluir Librería -> Administrar Bibliotecas...
 * Busca "Adafruit NeoPixel" y haz clic en instalar.
 */

#define NEO 27     // Definimos el pin del Neopixel, en este caso es el 27.
#define NUM 4      // Definimos el número de Neopixels, en este caso es 4.
#define B_IZQ 0    // Definimos el Pin del botón Izquierdo, en este caso es el 0.
#define B_ENTER 15 // Definimos el Pin del botón Central, en este caso es el 15.
#define B_DER 13   // Definimos el Pin del botón Derecho, en este caso es el 13.

#include <Adafruit_NeoPixel.h> // Incluimos la librería Neopixel

int B_IZQ_EST = 0;    // Variable para leer el estado del botón Izquierdo
int B_ENTER_EST = 0;  // Variable para leer el estado del botón Central
int B_DER_EST = 0;    // Variable para leer el estado del botón Derecho

// Creamos un objeto de tipo Adafruit_NeoPixel
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM, NEO, NEO_GRB + NEO_KHZ800);

/*
 * La función setup() se ejecuta una vez al encender o resetear la placa.
 */
void setup() {
    // Inicializamos la librería Neopixel
    pixels.begin();
    // Ajustamos el nivel de brillo en un 20% (0-64)
    pixels.setBrightness(5);
    // Inicializamos los pines digitales de los tres botones como entrada.
    pinMode(B_IZQ, INPUT);
    pinMode(B_ENTER, INPUT);
    pinMode(B_DER, INPUT);
}

/*
 * La función loop() se ejecuta continuamente en un ciclo.
 */
void loop() {
    // Leemos el estado de los botones
    B_IZQ_EST = digitalRead(B_IZQ);     // Estado del botón Izquierdo
    B_ENTER_EST = digitalRead(B_ENTER); // Estado del botón Central
    B_DER_EST = digitalRead(B_DER);     // Estado del botón Derecho

    // Comprobamos si se presiona el botón Izquierdo
    if (B_IZQ_EST == LOW) {
        // Cambiamos el color de los Neopixels a rojo
        setColor(255, 0, 0); // Rojo
    }

    // Comprobamos si se presiona el botón Central
    else if (B_ENTER_EST == LOW) {
        // Cambiamos el color de los Neopixels a verde
        setColor(0, 255, 0); // Verde
    }

    // Comprobamos si se presiona el botón Derecho
    else if (B_DER_EST == LOW) {
        // Cambiamos el color de los Neopixels a azul
        setColor(0, 0, 255); // Azul
    }
}

/*
 * Función para establecer el color de todos los Neopixels
 * 
 * Parámetros:
 * - int r: valor de rojo (0-255)
 * - int g: valor de verde (0-255)
 * - int b: valor de azul (0-255)
 */
void setColor(int r, int g, int b) {
    // Iteramos sobre cada Neopixel
    for (int i = 0; i < NUM; i++) {
        // Establecemos el color RGB en el Neopixel actual
        pixels.setPixelColor(i, pixels.Color(r, g, b));
    }
    // Enviamos la actualización de color a todos los Neopixels
    pixels.show();
}