Porte automatique pour poule

Bonjour, je réalise une porte pour un poulailler mais j'ai un soucis dans mon code lorsque j'alimente mon arduino et que j'appuie pour ouvrir la porte, elle s'ouvre mais impossible de la refermer. Voici mon code.
Merci d'avance pour votre aide.

int MotorPin1 = 8; // Déclaration broche commande Bobine 1 moteur
int MotorPin2 = 9; // Déclaration broche commande Bobine 2 moteur
int MotorPin3 = 10; // Déclaration broche commande Bobine 3 moteur
int MotorPin4 = 11; // Déclaration broche commande Bobine 4 moteur
int delayTime = 9; // Vitesse d'ouverture et fermeture de la porte
int commande_haut = 4; // Bouton haut
int commande_bas = 5; // Bouton bas
boolean etat_bp_h = false, etat_bp_b = false; // Déclaration des variables bas et haut
boolean mem_h = true, mem_b = false; // Déclaration des mémoires haut et bas

void setup() {
  Serial.begin(9600); // Ouverture du port série et debit de communication fixé à 9600 bauds
  pinMode(commande_haut, INPUT_PULLUP); // Inverse de la lecture sur entrée BP haut
  pinMode(commande_bas, INPUT_PULLUP); // Inverse de la lecture sur entrée BP bas
  pinMode(MotorPin1, OUTPUT); // Pin 8 de l'arduino en sortie digitale
  pinMode(MotorPin2, OUTPUT); // Pin 9 de l'arduino en sortie digitale
  pinMode(MotorPin3, OUTPUT); // Pin 10 de l'arduino en sortie digitale
  pinMode(MotorPin4, OUTPUT); // Pin 11 de l'arduino en sortie digitale
}

void loop() {

  etat_bp_h = !digitalRead(commande_haut); // Inverse de la lecture sur entrée BP haut
  etat_bp_b = !digitalRead(commande_bas); // Inverse de la lecture sur entrée BP bas

  if (etat_bp_h != mem_h) // Changement d'état du bouton poussoir haut (front montant ou descendant)
  {
    if (etat_bp_h) // Appui sur BP haut mais pas sur le bas
    {
      Fermer_porte(); // Lancer la fonction fermeture de la porte du poulailler
      mem_h = etat_bp_h; // Mémorisation du nouvel état du bouton haut
      mem_b = false;
    }
  }
  if (etat_bp_b != mem_b) // Changement d'état du bouton poussoir bas (front montant ou descendant)
  {
    if (etat_bp_b) // Appui sur BP bas mais pas sur le haut
    {
      Ouvrir_porte(); // Lancer la fonction ouverture de la porte du poulailler
      mem_b = etat_bp_b; // Mémorisation du nouvel état du bouton bas
      mem_h = false;
    }
  }
}
// Séquence d'alimentation normale des bobines du moteur en Full Step
void Fermer_porte() {
  int Tour = 0;
  // Il faut 306 * 4 = 1224 pas pour fermer la porte
  for (Tour = 0; Tour < 306; Tour++) {
    digitalWrite(MotorPin1, HIGH); // Alimentation A de la Bobine 1 du moteur pas à pas
    digitalWrite(MotorPin2, LOW); // Alimentation B de la Bobine 2 du moteur pas à pas
    digitalWrite(MotorPin3, LOW); // Bobine 3 du moteur pas à pas au repos
    digitalWrite(MotorPin4, LOW); // Bobine 4 du moteur pas à pas au repos
    delay(delayTime);
    digitalWrite(MotorPin1, LOW); // Bobine 1 du moteur pas à pas au repos
    digitalWrite(MotorPin2, HIGH); // Alimentation B de la Bobine 2 du moteur pas à pas
    digitalWrite(MotorPin3, LOW); // Alimentation C de la Bobine 3 du moteur pas à pas
    digitalWrite(MotorPin4, LOW); // Bobine 4 du moteur pas à pas au repos
    delay(delayTime);
    digitalWrite(MotorPin1, LOW); // Bobine 1 du moteur pas à pas au repos
    digitalWrite(MotorPin2, LOW); // Bobine 2 du moteur pas à pas au repos
    digitalWrite(MotorPin3, HIGH); // Alimentation C de la Bobine 3 du moteur pas à pas
    digitalWrite(MotorPin4, LOW); // Alimentation D de la Bobine 4 du moteur pas à pas
    delay(delayTime);

    digitalWrite(MotorPin1, LOW); // Alimentation A de la Bobine 1 du moteur pas à pas
    digitalWrite(MotorPin2, LOW); // Bobine 2 du moteur pas à pas au repos
    digitalWrite(MotorPin3, LOW); // Bobine 3 du moteur pas à pas au repos
    digitalWrite(MotorPin4, HIGH); // Alimentation D de la Bobine 4 du moteur pas à pas
    delay(delayTime);
    Serial.println("Fermer porte"); // Affichage sur le moniteur série
  }
  Serial.println("Porte Fermée"); // Affichage sur le moniteur série
  Arret();
}
// Séquence d'alimentation inverse des bobines du moteur en Full Step
void Ouvrir_porte() {
  int Tour = 0;
  for (Tour = 0; Tour < 306; Tour++) {
    // Il faut 306 * 4 = 1224 pas pour ouvrir la porte
    digitalWrite(MotorPin1, LOW); // Bobine 1 du moteur pas à pas au repos
    digitalWrite(MotorPin2, LOW); // Bobine 2 du moteur pas à pas au repos
    digitalWrite(MotorPin3, LOW); // Alimentation C de la Bobine 3 du moteur pas à pas
    digitalWrite(MotorPin4, HIGH); // Alimentation D de la Bobine 4 du moteur pas à pas
    delay(delayTime);

    digitalWrite(MotorPin1, LOW); // Bobine 1 du moteur pas à pas au repos
    digitalWrite(MotorPin2, LOW); // Alimentation B de la Bobine 2 du moteur pas à pas
    digitalWrite(MotorPin3, HIGH); // Alimentation C de la Bobine 3 du moteur pas à pas
    digitalWrite(MotorPin4, LOW); // Bobine 4 du moteur pas à pas au repos
    delay(delayTime);

    digitalWrite(MotorPin1, LOW); // Alimentation A de la Bobine 1 du moteur pas à pas
    digitalWrite(MotorPin2, HIGH); // Alimentation B de la Bobine 2 du moteur pas à pas
    digitalWrite(MotorPin3, LOW); // Bobine 3 du moteur pas à pas au repos
    digitalWrite(MotorPin4, LOW); // Bobine 4 du moteur pas à pas au repos
    delay(delayTime);

    digitalWrite(MotorPin1, HIGH); // Alimentation A de la Bobine 1 du moteur pas à pas
    digitalWrite(MotorPin2, LOW); // Bobine 2 du moteur pas à pas au repos
    digitalWrite(MotorPin3, LOW); // Bobine 3 du moteur pas à pas au repos
    digitalWrite(MotorPin4, LOW); // Alimentation D de la Bobine 4 du moteur pas à pas
    delay(delayTime);
    Serial.println("Ouvrir porte"); /// Affichage sur le moniteur série du texte
  }
  Serial.println("Porte Ouverte"); // Affichage sur le moniteur série
  Arret();
}

// Fonction arrêt du moteur
void Arret() {
  digitalWrite(MotorPin1, LOW); // Bobine 1 du moteur pas à pas au repos
  digitalWrite(MotorPin2, LOW); // Bobine 2 du moteur pas à pas au repos
  digitalWrite(MotorPin3, LOW); // Bobine 3 du moteur pas à pas au repos
  digitalWrite(MotorPin4, LOW); // Bobine 4 du moteur pas à pas au repos
}

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

As-tu testé la fonction Fermer_porte toute seule, pour voir si elle fonctionne ?

Bonjour sterben462

J'ai essayé ton programme, il fonctionne très bien, regardes du côté du contact du bouton de fermeture.
Pour te faciliter la vie, pour commander ton moteur, regardes du côté de la bibliothèque Stepper.h et pour les boutons Button.h.

Cordialement
jpbbricole

Un autre programme le même genre de projet de porte de poulailler : MattMonc's Web . _______________________________________________________________________