#include <Servo.h>

Servo myServo;  // Création d'un objet Servo
const int buttonPin = 6;  // Pin du bouton poussoir
int buttonState = 0;      // Variable pour lire l'état du bouton
int lastButtonState = 0;  // Variable pour enregistrer le dernier état du bouton
int servoPosition = 0;    // Position actuelle du servomoteur, initialement à 0°

void setup() {
  myServo.attach(9);  // Attachement du servomoteur à la broche D9
  pinMode(buttonPin, INPUT_PULLUP);  // Définir le bouton comme entrée avec résistance pull-up interne
  myServo.write(servoPosition);  // Position initiale du servomoteur
}

void loop() {
  buttonState = digitalRead(buttonPin);  // Lire l'état du bouton

  // Vérifier si le bouton a été pressé (passage de HIGH à LOW)
  if (buttonState != lastButtonState && buttonState == LOW) {
    // Changer la position du servomoteur selon la position actuelle
    if (servoPosition == 0) {
      moveServo(0, 90, 5000);  // Mouvement aller de 0° à 90° en 5 secondes
      servoPosition = 90;      // Mettre à jour la position actuelle
    } else {
      moveServo(90, 0, 5000);  // Mouvement retour de 90° à 0° en 5 secondes
      servoPosition = 0;       // Mettre à jour la position actuelle
    }
    delay(50);  // Débouncing
  }

  lastButtonState = buttonState;  // Enregistrer l'état du bouton
}

void moveServo(int startPos, int endPos, int duration) {
  int steps = abs(endPos - startPos);      // Nombre de pas (1 degré par pas)
  int stepDelay = duration / steps;        // Délai entre chaque pas

  if (startPos < endPos) {
    for (int pos = startPos; pos <= endPos; pos++) {
      myServo.write(pos);  // Déplacer le servomoteur à la position actuelle
      delay(stepDelay);    // Attendre avant de passer à la position suivante
    }
  } else {
    for (int pos = startPos; pos >= endPos; pos--) {
      myServo.write(pos);  // Déplacer le servomoteur à la position actuelle
      delay(stepDelay);    // Attendre avant de passer à la position suivante
    }
  }
}