const byte pinBouton = 2;
const byte pinMoteur = 3; // prendre une pin capable de faire un PWM
enum : byte {A_FOND, FREINAGE, STOP} etat;

const uint32_t deltaT = 250;
const int deltaV = -5;

int vitesse; // pwm entre 0 et 255

void reglerVitesse(int v) {
  vitesse = constrain(v, 0, 255);
  analogWrite(pinMoteur, vitesse);
  Serial.print(F("Vitesse = ")); Serial.println(vitesse);
}

void gestionArretMoteur() {
  static uint32_t chrono;

  switch (etat) {
    case A_FOND:
      if (digitalRead(pinBouton) == LOW) { // appui
        etat = FREINAGE;
        chrono = millis() - deltaT;
        Serial.println(F("Freinage demandé."));
      }
      break;

    case FREINAGE:
      if (millis() - chrono >= deltaT) {
        chrono += deltaT;
        vitesse += deltaV;
        if (vitesse <= 0) {
          etat = STOP;
          vitesse = 0;
          Serial.print(F("Arrêt moteur -> "));
        }
        reglerVitesse(vitesse);
      }
      break;

    case STOP:
      break;
  }
}

void setup() {
  pinMode(pinBouton, INPUT_PULLUP);
  pinMode(pinMoteur, OUTPUT);
  Serial.begin(115200); Serial.println();

  etat = A_FOND;
  reglerVitesse(255); // on met le moteur à fond

}

void loop() {
  gestionArretMoteur();
}