//************PRÁCTICA 13***************
//Funcionamiento de un Servomotor
//girar 0 y 180 grados
//importar libreria para servomotor

#include <Servo.h>

Servo miServo;  // Crea un objeto servo
const int pinServo = 9;  // El pin al que está conectado el servo
const int pinRele = 7;   // El pin al que está conectado el relé

void setup() {
  miServo.attach(pinServo);  // Asigna el pin al objeto servo
  pinMode(pinRele, OUTPUT);  // Configura el pin del relé como salida
  randomSeed(analogRead(0)); // Inicializa el generador de números aleatorios
  Serial.begin(9600);
}

void loop() {
  // Hacer una rampa de 0 a 100 grados en 3 segundos
  int inicio    = 94;
  int fin       = 104;
  int duracion  = 3000; // Duración total en milisegundos
  int pasos     = 100;     // Número de pasos para la rampa
  int intervalo = duracion / pasos; // Intervalo de tiempo entre cada paso
  
  // Encender el relé antes de la función de valores aleatorios
  digitalWrite(pinRele, HIGH);

  // Enviar 400 valores aleatorios al servo
  for (int i = 0; i < 40; i++) {
    int angulo = random(94, 106); // Genera un ángulo aleatorio entre 0 y 180 grados
    int delayAleatorio = random(100, 150); // Genera un delay aleatorio entre 50 y 70 ms
    Serial.print  ("   i: " + String(i));
    accionoMuestro(angulo, delayAleatorio);
  }

  // Apagar el relé y esperar 2 segundos
  digitalWrite(pinRele, LOW);
  delay(1000);

  // Encender el relé antes de la función de valores fijos
  digitalWrite(pinRele, HIGH);

  // Mantenerse en los valores 20, 50 y 100 grados por 3 segundos cada uno
  // miServo.write(94);  // Mueve el servo a 20 grados
  // delay(1000);        // Espera 3 segundos
  accionoMuestro(94, 1000);
  
  // miServo.write(96);  // Mueve el servo a 50 grados
  // delay(1000);        // Espera 3 segundos
  accionoMuestro(96, 1000);
  
  // miServo.write(98); // Mueve el servo a 100 grados
  // delay(1000);        // Espera 3 segundos
  accionoMuestro(98, 1000);

  // miServo.write(100); // Mueve el servo a 100 grados
  // delay(1000);        // Espera 3 segundos
  accionoMuestro(100, 1000);

  // miServo.write(102); // Mueve el servo a 100 grados
  // delay(1000);        // Espera 3 segundos
 accionoMuestro(102, 1000);

  // miServo.write(104); // Mueve el servo a 100 grados
  // delay(1000);        // Espera 3 segundos
  accionoMuestro(104, 1000);

  // Apagar el relé y esperar 2 segundos
  digitalWrite(pinRele, LOW);
  delay(6000);

  // Encender el relé antes de las rampas
  digitalWrite(pinRele, HIGH);
 

  for (int i = 0; i <= pasos; i++) {
    int angulo = map(i, 0, pasos, inicio, fin); // Mapea el paso actual al ángulo
    // miServo.write(angulo); // Mueve el servo al ángulo mapeado
    // delay(intervalo); // Espera el intervalo calculado
    accionoMuestro(angulo, intervalo);
  }

  // Pausa de 3 segundos después de la primera rampa
  delay(3000);

  // Hacer una rampa inversa de 100 a 0 grados en 3 segundos
  for (int i = pasos; i >= 0; i--) {
    int angulo = map(i, 0, pasos, fin, inicio); // Mapea el paso inverso al ángulo
    // miServo.write(angulo); // Mueve el servo al ángulo mapeado
    // delay(intervalo); // Espera el intervalo calculado
    Serial.print  ("   i: " + String(i));
    accionoMuestro(angulo, intervalo);
  }

  // Apagar el relé y esperar 2 segundos al final
  digitalWrite(pinRele, LOW);
  delay(1000);
}

void accionoMuestro(int ang, int del){
   Serial.print  (" ang: " + String(ang));
   Serial.println(" del: " + String(del));
   miServo.write(ang); // Mueve el servo al ángulo aleatorio
   delay(del); // Espera un tiempo aleatorio
}