#include <DabbleESP32.h>
#include <ESP32Servo.h>

Servo myServo;

// Définir les broches de l'ESP32 connectées au module L298N
#define ENA 21  // Broche pour le PWM du moteur A
#define IN1 4  // Broche pour la direction du moteur A
#define IN2 5 // Broche pour la direction du moteur A
#define ENB 23  // Broche pour le PWM du moteur B
#define IN3 12  // Broche pour la direction du moteur B
#define IN4 13  // Broche pour la direction du moteur B

const int servoPin = 32;

// Angles pour le contrôle du servo
const int angleCentre = 133;  // Position centrale (neutre)
const int angleDroite = 180; 
const int angleGauche = 90;  
void setup() {
  // Initialiser les broches comme sorties
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  
  // Initialiser la communication série pour le débogage
  Serial.begin(115200);
  myServo.attach(servoPin);
  
  // Mettre le servo en position neutre
  myServo.write(angleCentre);
  // Initialiser Dabble
  Dabble.begin("Nom_Bluetooth");  
  }

void loop() {

  Dabble.processInput();
  

  if (GamePad.isUpPressed()) {
    avancer();
  } else if (GamePad.isDownPressed()) {
    reculer();

 
  } else {
    arreter();
  }
  if (GamePad.isTrianglePressed()) {
    tournerDroite();
  } 
  
  // Vérifier si le bouton Y est pressé
  if (GamePad.isCirclePressed()	) {
    tournerGauche();
  }
  
  // Vérifier si aucun bouton n'est pressé
  if (!GamePad.isTrianglePressed() && !GamePad.isCirclePressed()) {
    arreterservo();
  }
}

void avancer() {
  // Avancer le moteur A
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 155);  // Vitesse maximale pour le moteur A

  // Avancer le moteur B
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, 155);  // Vitesse maximale pour le moteur B

  Serial.println("Les moteurs avancent.");
}

void reculer() {
  // Reculer le moteur A
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  analogWrite(ENA, 155);  // Vitesse maximale pour le moteur A

  // Reculer le moteur B
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENB, 155);  // Vitesse maximale pour le moteur B

  Serial.println("Les moteurs reculent.");
}
void arreter() {
  // Arrêter le moteur A
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  analogWrite(ENA, 0);  // Arrêter le moteur A

  // Arrêter le moteur B
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  analogWrite(ENB, 0);  // Arrêter le moteur B

  Serial.println("Les moteurs sont arrêtés.");
}
void tournerDroite() {
  myServo.write(angleDroite);
  Serial.println("Tourner à droite");
}

// Fonction pour tourner à gauche
void tournerGauche() {
  myServo.write(angleGauche);
  Serial.println("Tourner à gauche");
}

// Fonction pour arrêter le servo (revenir au centre)
void arreterservo() {
  myServo.write(angleCentre);
  Serial.println("Arrêté (centre)");
}