Fonction Avance / Stop / Recule

Bonjour à tous,

Dans le cadre d'un projet motorisé j'aimerais réaliser une fonction Avance / Stop / Recule.

En gros j'ai un moteur DC piloté par deux relais (Sens horaire et antihoraire), et un bouton poussoir pour la commande.
Je souhaiterais lors de l'appui sur le bouton que le moteur tourne dans un sens, lors du second appui que le moteur s’arrête, et lors du troisième appui le moteur tourne dans l'autre sens et ainsi de suite....
J'ai réussi à faire un code pour faire un sens puis stop mais je ne parviens pas à trouver le code pour relancer le moteur dans l'autre sens ... Je pense qu'il faut que j'utilise une variable pour stocker le sens du moteur ?

Bonjour,
Je pense que vous devez utiliser une machine à état :
https://forum.arduino.cc/t/programmation-automate-fini-machine-a-etat/452532

Bonne jounrée.

exactement + utiliser une bibliothèque pour le bouton vous simplifiera énormément la vie

la machine à états est toute simple:

Ah super ton post d'explication que philippe86220 à proposé. Très clair.
Effectivement c'est typiquement ce que je veux faire.
J'ai fais un petit programme de test, est ce la bonne logique ?

// la liste des états possible de notre système
// ainsi qu'une variable etatCourant prenant une de ces valeurs
enum {DEBUT, , OUVRE, REPOS, FERME} etatCourant;

// ------------------------------------------------------
// Cette fonction installe l'état initial
// ------------------------------------------------------
void mettreAuRepos()
{
  digitalWrite(relais_ouvert,  LOW);
  digitalWrite(relais_ferme,  LOW);
  etatCourant = DEBUT;
}

// ------------------------------------------------------
// La fonction de call back, appellée automatiquement quand on clique
// ------------------------------------------------------
void simpleclick()
{
  switch (etatCourant) {
    case DEBUT:                             // on était au repos à l'ouverture et on a un appui, on ouvre
      digitalWrite(relais_ouvert, HIGH);    // Relais ouverture ON
      etatCourant = OUVRE;                  // on note le nouvel état de notre système
      break;

    case OUVRE:                             // on était en ouverture et on a un appui, on arrete le moteur
      digitalWrite(relais_ouvert, LOW);     // Relais ouverture OFF
      etatCourant = REPOS;                  // on note le nouvel état de notre système
      break;

    case REPOS:                             // on est à l'arret en ouverture, on a un appui, on ferme
      digitalWrite(relais_ferme, HIGH);     // Relais fermeture ON
      etatCourant = FERME;                  // on note le nouvel état de notre système
      break;

    case FERME:                             // on etait en fermeture, on a un appui, on retourne au repos
      mettreAuRepos();                      // on retourne à l'état initial
      break;
  }
}

Super ton sujet d'explication sur les machine d'état.
J'ai fais une petite esquisse du programme est ce que je suis sur la bonne voie ?

// la liste des états possible de notre système
// ainsi qu'une variable etatCourant prenant une de ces valeurs
enum {DEBUT, , OUVRE, REPOS, FERME} etatCourant;

// ------------------------------------------------------
// Cette fonction installe l'état initial
// ------------------------------------------------------
void mettreAuRepos()
{
  digitalWrite(relais_ouvert,  LOW);
  digitalWrite(relais_ferme,  LOW);
  etatCourant = DEBUT;
}

// ------------------------------------------------------
// La fonction de call back, appellée automatiquement quand on clique
// ------------------------------------------------------
void simpleclick()
{
  switch (etatCourant) {
    case DEBUT:                             // on était au repos à l'ouverture et on a un appui, on ouvre
      digitalWrite(relais_ouvert, HIGH);    // Relais ouverture ON
      etatCourant = OUVRE;                  // on note le nouvel état de notre système
      break;

    case OUVRE:                             // on était en ouverture et on a un appui, on arrete le moteur
      digitalWrite(relais_ouvert, LOW);     // Relais ouverture OFF
      etatCourant = REPOS;                  // on note le nouvel état de notre système
      break;

    case REPOS:                             // on est à l'arret en ouverture, on a un appui, on ferme
      digitalWrite(relais_ferme, HIGH);     // Relais fermeture ON
      etatCourant = FERME;                  // on note le nouvel état de notre système
      break;

    case FERME:                             // on etait en fermeture, on a un appui, on retourne au repos
      mettreAuRepos();                      // on retourne à l'état initial
      break;
  }
}

EDIT: Est il possible/logique d'utiliser des fonctions pour chaque cas plutôt que des digitalWrite ?

Il vous manque la librairie OneButton,
Vous devez définir la pin du BP,
Vous devez initialiser le BP par rapport à la librairie...
Il y a une virgule en trop dans votre enum.
Faites des essais, vous allez y arriver !

C’est sur la bonne voie

Oui créez une fonction void avancer() {…} et appelez la idem pour reculer() et stop()

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.