// put #include <Adafruit_NeoPixel.h>

#define PIN D5 // Pin de salida para NeoPixel
#define NUMPIXELS 8  // Número de NeoPixels
#define BUTTON_PIN D7 // Pin del botón

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

#define DELAYVAL 100 // Tiempo (en milisegundos) para pausar entre actualizaciones

bool reverse = false; // Variable para almacenar el estado de dirección del patrón

void setup() {
  Serial.begin(9600); // Inicializa la comunicación serial
  pinMode(BUTTON_PIN, INPUT_PULLUP); // Configura el pin del botón como entrada con pull-up

  pixels.begin(); // Inicializa el objeto de la tira de NeoPixel
}

void loop() {
  int buttonState = digitalRead(BUTTON_PIN); // Lee el estado del botón

  // Detecta si el botón está presionado
  if (buttonState == LOW) {
    reverse = !reverse; // Cambia la dirección del patrón
    Serial.println("Botón presionado - Cambiando dirección del patrón arcoíris");
    delay(500); // Pequeña pausa para evitar múltiples cambios rápidos de dirección
  }

  // Muestra el patrón arcoíris en la dirección adecuada
  showRainbowPattern(DELAYVAL, reverse);
}

void showRainbowPattern(int wait, bool reverse) {
  static long firstPixelHue = 0; // Static para mantener el estado entre llamadas
  for (int i = 0; i < NUMPIXELS; i++) {
    int pixelHue = reverse ? firstPixelHue - (i * 65536L / NUMPIXELS) : firstPixelHue + (i * 65536L / NUMPIXELS);
    pixels.setPixelColor(i, pixels.gamma32(pixels.ColorHSV(pixelHue)));
  }
  pixels.show();
  firstPixelHue += reverse ? -256 : 256;
  delay(wait);
}