#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 GREEN_DURATION 3000 // Duración en milisegundos para el verde
#define YELLOW_DURATION 3000 // Duración en milisegundos para el amarillo
#define RED_DURATION 3000 // Duración en milisegundos para el rojo

bool startSequence = false; // Variable para almacenar si se debe iniciar la secuencia
bool lastButtonState = HIGH; // Estado anterior del botó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
  pixels.show(); // Inicializa todos los píxeles a apagado
}

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

  // Detecta cambios en el estado del botón
  if (buttonState == LOW && lastButtonState == HIGH) {
    startSequence = true; // Inicia la secuencia
    Serial.println("Botón presionado - Iniciando secuencia de semáforo");
    delay(500); // Pequeña pausa para evitar múltiples detecciones rápidas
  }

  lastButtonState = buttonState; // Actualiza el estado anterior del botón

  // Si se ha iniciado la secuencia, ejecutar la secuencia del semáforo
  if (startSequence) {
    // Encender verde
    setColor(0, 255, 0); // Verde
    delay(GREEN_DURATION);

    // Encender amarillo
    setColor(255, 255, 0); // Amarillo
    delay(YELLOW_DURATION);

    // Encender rojo
    setColor(255, 0, 0); // Rojo
    delay(RED_DURATION);
    
    // Reinicia la secuencia
    startSequence = false;
  }
}

void setColor(int red, int green, int blue) {
  for (int i = 0; i < NUMPIXELS; i++) {
    pixels.setPixelColor(i, pixels.Color(red, green, blue));
  }
  pixels.show();
}