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 ?
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 !