#include "Arduino.h"

// Definir pines
const int servoPin1 = 18;  // Servo 1
const int servoPin2 = 19;  // Servo 2

const int potPin1 = 34;  // Potenciómetro 1
const int potPin2 = 35;  // Potenciómetro 2

const int motorPin1 = 32;  // Pin para el motor (H-Bridge A)
const int motorPin2 = 33;  // Pin para el motor (H-Bridge B)
const int buttonPin = 25;  // Pin del botón para controlar la dirección del motor (cambia el pin del botón)

// Dirección del motor (false = adelante, true = atrás)
bool motorDirection = false;

void setup() {
  Serial.begin(115200);

  // Configurar pines de servos, motor y botón
  pinMode(servoPin1, OUTPUT);
  pinMode(servoPin2, OUTPUT);
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);  // Configurar el botón con resistencia pull-up interna
}

void loop() {
  // Leer valores de los potenciómetros
  int potValue1 = analogRead(potPin1);
  int potValue2 = analogRead(potPin2);

  // Definir el valor central del joystick y el umbral para considerar apagado
  int middleValue = 2047;  // Valor en el centro de 0-4095
  int threshold = 500;      // Rango alrededor del centro considerado como apagado

  // Convertir valores de los potenciómetros a ángulos (0° a 180°)
  int angle1 = map(potValue1, 0, 4095, 0, 180);
  int angle2 = map(potValue2, 0, 4095, 0, 180);

  // Definir la señal PWM para el servo 1
  int pulseWidth1 = 0;
  if (potValue1 < (middleValue - threshold) || potValue1 > (middleValue + threshold)) {
    // Si el potenciómetro está fuera del rango central, encender el servo
    pulseWidth1 = map(angle1, 0, 180, 500, 2400);
  } else {
    // Si está en el centro, apagar el servo
    pulseWidth1 = 0;
  }

  // Definir la señal PWM para el servo 2
  int pulseWidth2 = 0;
  if (potValue2 < (middleValue - threshold) || potValue2 > (middleValue + threshold)) {
    // Si el potenciómetro está fuera del rango central, encender el servo
    pulseWidth2 = map(angle2, 0, 180, 500, 2400);
  } else {
    // Si está en el centro, apagar el servo
    pulseWidth2 = 0;
  }

  // Enviar señal PWM manualmente a los servos
  moveServo(servoPin1, pulseWidth1);
  moveServo(servoPin2, pulseWidth2);

  // Leer el estado del botón
  static bool lastButtonState = HIGH;
  bool currentButtonState = digitalRead(buttonPin);

  // Detectar el cambio de estado del botón
  if (lastButtonState == HIGH && currentButtonState == LOW) {
    motorDirection = !motorDirection;  // Cambiar dirección del motor
    delay(200);  // Debounce del botón (evitar múltiples lecturas por un solo toque)
  }
  lastButtonState = currentButtonState;

  // Controlar la dirección del motor y velocidad
  int motorSpeed = map(potValue1, 0, 4095, 0, 255);  // Ajustar velocidad según potenciómetro 1 (0 a 255)

  if (motorDirection) {
    // Motor en dirección contraria
    analogWrite(motorPin1, 0);
    analogWrite(motorPin2, motorSpeed);
  } else {
    // Motor en dirección hacia adelante
    analogWrite(motorPin1, motorSpeed);
    analogWrite(motorPin2, 0);
  }

  delay(20);
}

// Generar señal PWM manualmente para los servos
void moveServo(int pin, int pulseWidth) {
  digitalWrite(pin, HIGH);
  delayMicroseconds(pulseWidth);
  digitalWrite(pin, LOW);
  delayMicroseconds(20000 - pulseWidth); // Periodo de 20ms
}
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
servo1:GND
servo1:V+
servo1:PWM
servo2:GND
servo2:V+
servo2:PWM
joystick1:VCC
joystick1:VERT
joystick1:HORZ
joystick1:SEL
joystick1:GND
led1:A
led1:C
r1:1
r1:2
r2:1
r2:2
led2:A
led2:C