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();
}