#include <Servo.h> // Incluye la librería para controlar servomotores

// Pines del LED RGB
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;

// Pin del pulsador
const int buttonPin = 13;

// Pin del servomotor (puedes cambiarlo si es necesario)
const int servoPin = 9; // El pin 9 es comúnmente usado para PWM y servomotores

// Objeto Servo
Servo myServo;

// Estados anteriores del pulsador
int lastButtonState = LOW;

// Estructura para definir los colores
struct Color {
  int r;
  int g;
  int b;
};

// Definición de los colores
// Puedes ajustar estos valores para obtener los tonos exactos que buscas
Color colors[] = {
  {255, 120, 0},   // Naranja
  {144, 238, 144}, // Verde Claro (valores más cercanos al verde "lima")
  {0, 100, 0},    // Verde Oscuro
  {0, 0, 255},    // Azul
  {128, 0, 128},  // Violeta
  {0, 191, 255},  // Celeste
  {255, 255, 0}   // Amarillo
};

// Número total de colores
const int numColors = sizeof(colors) / sizeof(colors[0]);

// Variables para controlar el tiempo de giro del servo
unsigned long servoStartTime = 0;
const unsigned long servoDuration = 10000; // 10 segundos en milisegundos

// Variable para almacenar la dirección aleatoria del servo
int servoDirection = 0; // 0 para izquierda, 1 para derecha

void setup() {
  // Configurar los pines del LED RGB como salida
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);

  // Configurar el pin del pulsador como entrada (pull-up externo)
  pinMode(buttonPin, INPUT);

  // Adjuntar el servomotor al pin
  myServo.attach(servoPin);
  myServo.write(89); // Detener el servomotor al inicio con el valor que lo detiene

  // Inicializar el generador de números aleatorios
  randomSeed(analogRead(A0)); // Usa el ruido del pin analógico para una mejor aleatoriedad
}

void loop() {
  // Leer el estado actual del pulsador
  int currentButtonState = digitalRead(buttonPin);

  // Verificar si el pulsador ha sido presionado (transición de HIGH a LOW debido al pull-up)
  if (currentButtonState == LOW && lastButtonState == HIGH) {
    // 1. Cambiar color del LED RGB
    int randomIndex = random(numColors);
    Color selectedColor = colors[randomIndex];
    analogWrite(redPin, selectedColor.r);
    analogWrite(greenPin, selectedColor.g);
    analogWrite(bluePin, selectedColor.b);

    // 2. Elegir aleatoriamente la dirección del servomotor
    servoDirection = random(2); // 0 o 1 (izquierda o derecha)

    // 3. Iniciar el giro del servomotor
    servoStartTime = millis(); // Guarda el tiempo actual para el inicio del giro

    // Establecer una velocidad inicial muy lenta basada en la dirección elegida
    if (servoDirection == 0) { // Izquierda
      myServo.write(85); // Valor cercano a 89, pero menor
    } else { // Derecha
      myServo.write(95); // Valor cercano a 89, pero mayor
    }

    // Pequeño retardo para evitar múltiples lecturas del pulsador
    delay(200);
  }

  // Actualizar el estado anterior del pulsador
  lastButtonState = currentButtonState;

  // Controlar el giro y la aceleración/desaceleración del servomotor
  if (servoStartTime > 0) { // Si el servo ha sido activado
    unsigned long elapsedTime = millis() - servoStartTime;

    if (elapsedTime < servoDuration) {
      int servoSpeed = 0;

      // Fase de aceleración (por ejemplo, los primeros 5 segundos)
      if (elapsedTime < servoDuration / 2) {
        if (servoDirection == 0) { // Acelerar hacia la izquierda
          // De un valor lento (85) a uno más rápido (e.g., 50)
          servoSpeed = map(elapsedTime, 0, servoDuration / 2, 85, 50);
        } else { // Acelerar hacia la derecha
          // De un valor lento (95) a uno más rápido (e.g., 140)
          servoSpeed = map(elapsedTime, 0, servoDuration / 2, 95, 140);
        }
      }
      // Fase de desaceleración (los últimos 5 segundos)
      else {
        if (servoDirection == 0) { // Desacelerar hacia la izquierda (hacia 89)
          // De un valor rápido (50) a detenerse (89)
          servoSpeed = map(elapsedTime, servoDuration / 2, servoDuration, 50, 89);
        } else { // Desacelerar hacia la derecha (hacia 89)
          // De un valor rápido (140) a detenerse (89)
          servoSpeed = map(elapsedTime, servoDuration / 2, servoDuration, 140, 89);
        }
      }
      myServo.write(servoSpeed);
    } else {
      // Han pasado 10 segundos, detener el servomotor
      myServo.write(89); // Detener el servo con el valor que lo detiene
      servoStartTime = 0; // Reiniciar la variable para indicar que el servo está detenido
    }
  }
}
$abcdeabcde151015202530fghijfghij