// Definición de pines y constantes
#define DCHA_PIN 3  // Pin 3 de Arduino como entrada PWM (derecha)
#define IZDA_PIN 5  // Pin 5 de Arduino como entrada inversa PWM (izquierda)
#define POT_FinalC1 6   // Entrada analógica del primer final de carrera
#define POT_FinalC2 7   // Entrada analógica del segundo final de carrera
#define Btn_Star 10     // Pin 10 de Arduino para el botón de inicio

// Variables para control
bool motorMoviendo = false;         // Estado del motor (movimiento o no)
bool finalDerActivado = false;      // Estado del final de carrera derecho
bool finalIzqActivado = false;      // Estado del final de carrera izquierdo

void setup() { 
  Serial.begin(9600); 
  pinMode(POT_FinalC1, INPUT_PULLUP);  // Configura el pin del primer final de carrera como entrada con resistencia pull-up
  pinMode(POT_FinalC2, INPUT_PULLUP);  // Configura el pin del segundo final de carrera como entrada con resistencia pull-up
  pinMode(Btn_Star, INPUT_PULLUP);     // Configura el pin del botón como entrada con resistencia pull-up
  pinMode(DCHA_PIN, OUTPUT);           // Configura el pin de dirección derecha como salida
  pinMode(IZDA_PIN, OUTPUT);           // Configura el pin de dirección izquierda como salida
  Para();                              // Llama a la función Para() para asegurar que el motor esté detenido al inicio
}

void loop() {
  // Si se pulsa el botón y el motor no está en movimiento
  if (digitalRead(Btn_Star) == LOW && !motorMoviendo) {
    Serial.println("Botón presionado");
    
    // Verificar el estado de los finales de carrera
    finalDerActivado = digitalRead(POT_FinalC1); // Lee el estado del primer final de carrera
    finalIzqActivado = digitalRead(POT_FinalC2); // Lee el estado del segundo final de carrera

    // Si se alcanza el final de carrera derecho, detener el motor
    if (!finalDerActivado) {
      Serial.println("Final de carrera izquierda alcanzado");
      Izquierda();  // Llama a la función Izquierda()
    }

    // Si se alcanza el final de carrera izquierdo, detener el motor
    if (!finalIzqActivado) {
      Serial.println("Final de carrera derecha alcanzado");
      Derecha();  // Llama a la función Derecha()
    }
  } else {
    // Si el motor está en movimiento
    if (motorMoviendo) {
      // Espera hasta que ambos finales de carrera se desactiven para detener el motor
      while (digitalRead(POT_FinalC1) and digitalRead(POT_FinalC2)) {
      }
      Para();  // Llama a la función Para() para detener el motor
    }
  }
}

// Función para mover el motor hacia la derecha
void Derecha() {
  motorMoviendo = true;
  digitalWrite(DCHA_PIN, HIGH);  // Activa el pin de dirección derecha
  digitalWrite(IZDA_PIN, LOW);   // Desactiva el pin de dirección izquierda
  delay(200);  // Espera 200 milisegundos
}

// Función para mover el motor hacia la izquierda
void Izquierda() {
  motorMoviendo = true;
  digitalWrite(DCHA_PIN, LOW);   // Desactiva el pin de dirección derecha
  digitalWrite(IZDA_PIN, HIGH);  // Activa el pin de dirección izquierda
  delay(200);  // Espera 200 milisegundos
}

// Función para detener el motor
void Para() {
  motorMoviendo = false;
  digitalWrite(DCHA_PIN, LOW);   // Desactiva el pin de dirección derecha
  digitalWrite(IZDA_PIN, LOW);   // Desactiva el pin de dirección izquierda
  delay(200);  // Espera 200 milisegundos
}
