[Résolu] code porte de poulailler qui ne fait pas ce qui est prévu

Salut à tous

Je suis en train de faire une porte de poulailler automatique à base de Arduino Nano (clone chinois), de L298, de cellule photo électrique, deux capteurs à effet hall (fin de course) et deux potentiomètres pour régler les seuils d'ouverture/fermeture... Plus un peu de récup (moteur de perceuse)... Le tout alimenté par une batterie de voiture et un petit panneau solaire.

Le fonctionnement souhaité est le suivant :
Au lever du jour la porte s'ouvre, au coucher elle se ferme... Et si le moteur est alimenté pendant plus de 5 secondes sans que le stade ouvert ou fermé ne soit atteint c'est que la porte est coincée et le système se met en sécurité.
Mon montage est à priori OK, sauf problème Hardware non décelé...

Voici mon code :

/**
 * Controle de la porte automatique de poulailler :
 * Un potentiomètre détermine le seuil d'ouverture, un autre le seuil de fermeture.
 * La cellule photoéléctrique déclenche le moteur dans un sens ou dans l'autre en fonction de ces seuils.
 * Le mouvement de la porte s'arrète dès que 1 des capteurs fin de course est activé (1 haut, 1 bas).
 * Une sécurité arrète tout si le moteur reste en tension plus de 5 secondes.
 **/

// déclaration des pins utilisés sur la carte :
  const int pinPotarJour = A3;
  const int pinPotarNuit = A4;
  const int pinCel = A1;
  const int pinMoteur1 = 3;
  const int pinMoteur2 = 4;
  const int pinCapteurHaut = 8;
  const int pinCapteurBas = 9;
  const int pinControleVitesse = 6;

// déclaration des différentes variables liées aux composants :
int valeurCel, seuilPotarJour, seuilPotarNuit, vitesse;

// déclaration des variables de timer
unsigned long timerSecu, timer;

//flags porte ouverte/fermée et sécurité :
boolean porteOuverte, porteFermee, moteurOn, secu;


//---------------------------------------------------------------------------------------------------------//
// INITIALISATION DES VARIABLES, DES MODES ET DES ETATS //

void setup()
{
  seuilPotarJour = 0;  // Initialisation des variables
  seuilPotarNuit = 0;
  valeurCel = 0;
  vitesse = 170;
  

  porteOuverte = HIGH;                       // les flags sont mis à 0 par sureté (HIGH = pas d'aimant devant le capteur effet Hall)
  porteFermee = HIGH;
  moteurOn = 0;
  timerSecu = 0;
  timer = 0;
  secu = 0;

  pinMode(pinMoteur1, OUTPUT);             //pin 3 et 4 en mode output, moteur à l'arrét par sureté
  digitalWrite(pinMoteur1, LOW);
  pinMode(pinMoteur2, OUTPUT);
  digitalWrite(pinMoteur2, LOW);

  pinMode(pinCapteurHaut, INPUT);         // pin 8 et 9 en mode input (fin de course)
  pinMode(pinCapteurBas, INPUT);

  pinMode(pinControleVitesse, OUTPUT);      // Le pin 6 active/desactive le pont H qui contrôle le moteur et controle la vitesse de rotation (presentement 170 sur 255)
  digitalWrite(pinControleVitesse, LOW);

  delay(100);
  
}

//-----------------------------------------------------------------------------------------------------------//

void loop() {

  seuilPotarJour = analogRead(pinPotarJour);            //lecture du seuil d'ouverture de la porte
  seuilPotarNuit = analogRead(pinPotarNuit);            //lecture du seuil de fermeture de la porte

  valeurCel = analogRead(pinCel);                       //lecture de la valeur renvoyée par la cellule

  porteOuverte = digitalRead(pinCapteurHaut);           //vérifie si la porte est ouverte
  porteFermee = digitalRead(pinCapteurBas);             //verifie si la porte est fermée




  //*********************************************************************************************************//
  // OUVERTURE DE LA PORTE //

if (!porteFermee && !secu)                      // Si la porte est fermée et n'est pas en sécurité...
{
  if (valeurCel >= seuilPotarJour)     // et qu'il fait jour...
  {
      digitalWrite(pinMoteur1, LOW);                    //le moteur tourne et ouvre la porte
      digitalWrite(pinMoteur2, HIGH);
      analogWrite(pinControleVitesse, vitesse);
      moteurOn = 1;
      timerSecu = millis();

  }

  else if (valeurCel <= seuilPotarNuit)    //Sinon, s'il fait nuit...
  {
      analogWrite(pinControleVitesse, 0);      // le moteur est désactivé
      moteurOn = 0;

  }
}



  //********************************************************************************************************//
  // FERMETURE DE LA PORTE //
  
if (!porteOuverte && !secu)                   // Si la porte est ouverte et n'est pas en sécurité...
{
  if (valeurCel <= seuilPotarNuit)  // et qu'il fait nuit...
  {
      digitalWrite(pinMoteur1, HIGH);                  //le moteur tourne dans l'autre sens et ferme la porte
      digitalWrite(pinMoteur2, LOW);
      analogWrite(pinControleVitesse, vitesse);
      moteurOn = 1;
      timerSecu = millis();
  }

  else if (valeurCel >= seuilPotarJour)  // Sinon, s'il fait jour...
  {
     analogWrite(pinControleVitesse, 0);             // le moteur est désactivé
     moteurOn = 0;

  }
}

  //*********************************************************************************************************//
  // SÉCURITÉ //
  
if (moteurOn)
{
  timer = millis();
  if (timer - timerSecu >= 5000)                    // Si le moteur est sous tension depuis plus de 5 secondes et que la porte n'est ni ouverte ni fermée
  {                                                 // c'est qu'elle est probablement coincée...
    analogWrite(pinControleVitesse, 0);             // le moteur est désactivé quel que soit l'état de la porte
     moteurOn = 0; 
     secu = 1;                                      // Le système se met en sécurité, un appui sur reset est nécessaire.
  }

}
  
  //*********************************************************************************************************//
  // ATTENTE AVANT DE RECOMMENCER LES TESTS //

  delay(50);                                     // La boucle recommence toutes les  0,05 secondes

}

C'est mon premier code (hors exercices pour apprendre un peu comment ça marche ce bazar) et il n'a pas le comportement attendu :

  • La porte s'ouvre et se ferme bien en fonction de la luminosité mais la sécurité ne fonctionne pas.
  • De temps en temps au lieu de se fermer la porte se ferme puis se ré-ouvre trois fois avant de se fermer pour de bon :o

J'ai beau relire mon code je ne pige pas ce qui ne vas pas, du coup je suis preneur de tout avis sur la question.
Merci d'avance :slight_smile:

Bon, je vais m'auto-répondre vu que j'a trouvé...

Apparemment le problème n’étais pas au niveau du code mais au niveau des seuils sélectionné par les potars ceux ci étant trop proches lors des tests, avec les petites fluctuations de mesures de la photorésistance le système faisait refermer la porte dès qu'elle s'ouvrait et vice-versa...

Pour ce qui est de la sécu qui ne fonctionnait pas c'est parce-que lors des test le moteur tournait librement sans actionner la porte (ficelle détachée). Le système détectant la porte comme fermée il donnait l'ordre de l'ouvrir et le timer de sécu évoluait à chaque boucle... et le seuil de 5 secondes de fonctionnement n'étais jamais atteint.
Il me reste à trouver comment coder cette sécu de manière à ce qu'elle se déclenche après 5 secondes quel que soit l'état de la porte (ouverte/fermée/ni l'un ni l'autre)

Ben voila c'etais pas sorcier...

J'ai rajouté un flag booléen et avec ce bout de code ça devrais le faire :

 if (!timerOn)
{
 timerSecu = millis();
 timerOn = 1;
}

Comme ça mon timer n'évolue plus à chaque loop et m'enregistre bien l'instant ou le moteur démare...