#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
}
}
}