ouverture/fermeture de porte

Bonsoir,
J’essaie de programmer une ouverture /fermeture de porte avec la nuit/jour
J’ai écris un petit programme qui semble fonctionné, mais l’instruction de fermeture ou d’ouverture de la porte boucle sans arrêt, je n’arrive pas à faire en sorte que ça ouvre le matin , et que ça ferme le soir qu’une seule fois.
J’ai prévu des butées interrupteur en haut et en bas , mais je verrai cela quand mon problème sera résolu.
j’ai utilisé un pont en H fait avec 4 relais couplés 2 par 2 .

J’ai bien essayer d’utiliser les while/break , do while , le système de la machine à états en regardant le tuto de JML, mais je ne m’en sors pas …

Voilà mon petit programme ( j’ai essayer de documenter un maximum )
Merci à ceux qui me donneront leurs conseils

//MARCHE BIEN  MAIS RECOMENCE A OUVRIR OU FERMER LA PORTE A  CHAQUE TOUR ( car se base sur nouvelle mesur )  MEME SI DEJA FAIT = ON FERME UNE PORTE FERMEE OU ON OUVRE UNE PORTE OUVERTE = VA PAS

 Constantes
 RELAIS DU PONT EN H

const int relais1 = 2;
const int relais2 = 4;
const int relais3 = 7;
const int relais4 = 8;

// déclation interrupteur  haut et bas de course

int n=0;

// /INTERRUPTEUR ARRET FERMETURE ( en BAS )

int pinInterrupteurBAS = 11;
int etatInterrupteurBAS ;

// INTERRUPTEUR ARRET OUVERTURE ( en HAUT )

int pinInterrupteurHAUT = 12;
int etatInterrupteurHAUT ;

//le PULLUP fait que c'est 1 quand il n'y a contact ( vérifié .)
// -LE 1 ET LE 4 MARCHENT ENSEMBLE  +  ON DIT  JOUR
//   //LE 2 ET LE 3 MARCHENT ENSEMBLE  +   ON DIT  NUIT
//    HIGH = PAS DE COURANT
//    LOW =  COURANT

//PHOTORESISTANCE

int photoresistancePin = 0; // la photorésistance et le pulldown 10Kohms sont connectés à A0
int photoresistanceReading; //  lecture  de résistance analogique


// BRANCHEMENTS =    ( CHOIX DES PINS DIGITAL SANS PWM )
//     relais1  sur DIGITAL 2   FIL VIOLET
//     relais2  sur DIGITAL 4   FIL JAUNE
//     relais3  sur DIGITAL 7   FIL ORANGE
//     relais4  sur DIGITAL 8   FIL BLEU
// /     PHOTORESISTANCE ( 5549  ) sur A0 NE PAS OUBLIER LA RESISTANCE DE 10 KILO-OHMS  !!

void setup() {

  Serial.begin(9600);

  //declaration des pins pour les relais en sortie=

  pinMode (relais1, OUTPUT);
  pinMode (relais2, OUTPUT);
  pinMode (relais3, OUTPUT);
  pinMode (relais4, OUTPUT);

  //declaration de la pin pour la photoresistance en entrée=

  pinMode (photoresistancePin, INPUT);

  //declaration de la pin pour les interrupteurs en entrée PULLUP ( evite rebonds)=

  pinMode (pinInterrupteurBAS, INPUT_PULLUP);

  pinMode (pinInterrupteurHAUT, INPUT_PULLUP);

//  ETAT DE DEPART (pas de courant )
  digitalWrite(relais1,  HIGH);
  digitalWrite(relais2,  HIGH);
  digitalWrite(relais3, HIGH);
  digitalWrite(relais4,  HIGH);
}
void loop() 
{

//  ETAT DE DEPART (pas de courant )
  digitalWrite(relais1,  HIGH);
  digitalWrite(relais2,  HIGH);
  digitalWrite(relais3, HIGH);
  digitalWrite(relais4,  HIGH);

  Serial.println(" - debut = eteint");
  delay (2000);


  // INTERRUPTEURS

 etatInterrupteurBAS = digitalRead (pinInterrupteurBAS);
  etatInterrupteurHAUT = digitalRead (pinInterrupteurHAUT);

//PHOTORESISTANCE

  Serial.println(" LECTURE LUMIERE");

  photoresistanceReading = analogRead(photoresistancePin);
  Serial.print("Analog reading = ");
  Serial.print(photoresistanceReading); // la lecture analogique
  // Nous aurons quelques seuils,à déterminer qualitativement par des essais
  if (photoresistanceReading < 150) {    //  SEUIL A DETERMINER
    Serial.println(" - NUIT");
  } else if (photoresistanceReading < 200 && photoresistanceReading > 150) {  //  SEUILS A DETERMINER
    Serial.println(" - Sombre  ATTENDRE");
  } else if (photoresistanceReading > 200) {  // SEUIL A DETERMINER
    Serial.println(" - JOUR");

  }
  Serial.println(" FIN LECTURE LUMIERE");
  delay(1000);  // DUREE DU DELAI  A DETERMINER POUR EVITER VA ET VIENT INTEMPESTIFS  !!

  // ACTIVATION OU DESACTIVATION DES RELAIS 2 PAR 2 POUR ACTIONNER LE MOTEUR
  
 
  //cas 1)      JOUR   :  CONDITION POUR FAIRE DECLENCHER LE MOTEUR DANS UN SENS ( ouverture )=

  if (photoresistanceReading > 200) {  //LE JOUR SE LEVE (ou une lumiére se promène : phare ....)
    Serial.println(" - JOUR ET  attente par securité");
    delay (2000);  //  permet de ne pas ouvrir si lumiere intempestive passe (10 minutes d'attente par securité)
  }

  if (photoresistanceReading < 200) {    // là , c'est encore la nuit , la porte reste fermée

    digitalWrite(relais1, HIGH);
    digitalWrite(relais2,  HIGH);
    digitalWrite(relais3,  HIGH);
    digitalWrite(relais4,  HIGH);
    Serial.println("  c'est encore la nuit , la porte reste fermée RIEN");
  }
  else  {

    // là , c'est bien le jour , la porte s'ouvre

    digitalWrite(relais1,  LOW);
    digitalWrite(relais2,  HIGH);
    digitalWrite(relais3,  HIGH);
    digitalWrite(relais4,  LOW);

    Serial.println(" - JOUR 0  =1/4 allumés");

    delay(5000);

  // là le Moteur tourne 1 seconde DONC A DETERMINER EN MESURANT LE TEMPS QU'IL FAUT AU MOTEUR POUR LEVER LA PORTE
    // PUIS ARRET COMPLET DU MOTEUR , LA PORTE RESTE OUVERTE

    digitalWrite(relais1, HIGH);
    digitalWrite(relais2, HIGH);
    digitalWrite(relais3, HIGH);
    digitalWrite(relais4,  HIGH);

    Serial.println(" - JOUR 1 ARRET DU MOTEUR = eteint");
    delay(2000);
  }
  Serial.print(etatInterrupteurHAUT);
  Serial.print(446);

  // le moteur ne reçoit plus de courant, il reste comme cà

  // cas 2       AUBE / CREPUSCULE
  if (photoresistanceReading > 100 && photoresistanceReading < 200) { //PERIODE INCERTAINE , PERMET QUE LA PORTE NE FASSE PAS DES ALLER-RETOUR SANS ARRET
    digitalWrite(relais1,  HIGH);
    digitalWrite(relais2, HIGH);
    digitalWrite(relais3,  HIGH);
    digitalWrite(relais4, HIGH);

    Serial.println(" - JOUR -nuit --- RIEN NE BOUGE = eteint");

   delay (2000);   //  permet de ne pas fermer si un gros nuage noir passe (10 minutes d'attente par securité)
  }
 // RIEN NE BOUGE
  // cas 3  // la  nuit arrive    NUIT

  if (photoresistanceReading < 100 ) {
    delay (2000);                //  permet de ne pas fermer si un gros nuage noir passe (10 minutes d'attente par securité)
    Serial.println(" -ARRIVEE DE LA NUIT -ATTENTE SECURITE ");
  }

  if (photoresistanceReading > 200) {   // là , c'est encore le jour , la porte reste ouverte
    digitalWrite(relais1, HIGH);
    digitalWrite(relais2,  HIGH);
    digitalWrite(relais3, HIGH);
    digitalWrite(relais4,  HIGH);

    Serial.println(" - JOUR 2  --  attente que la nuit soit bien tombée  = eteint");

    delay (2000);
  }
  else  {                         // là , c'est bien la nuit , la porte se ferme

    digitalWrite(relais1,  HIGH);
    digitalWrite(relais2,  LOW);//------------------------
    digitalWrite(relais3,  LOW);//-----------------
    digitalWrite(relais4,  HIGH);

    Serial.println(" - NUIT1 = 2/3 allumés");

    delay (5000);              // là le Moteur tourne 5 seconde DONC A DETERMINER EN MESURANT LE TEMPS QU'IL FAUT AU MOTEUR POUR baisser LA PORTE
    // PUIS ARRET COMPLET DU MOTEUR , LA PORTE RESTE FERMEE

    digitalWrite(relais1, HIGH);
    digitalWrite(relais2,  HIGH);
    digitalWrite(relais3, HIGH);
    digitalWrite(relais4,  HIGH);

    Serial.println(" - NUIT2 ARRET COMPLET DU MOTEUR , LA PORTE RESTE FERMEE  = eteint");
    delay (1000);

    Serial.print(etatInterrupteurBAS);
    Serial.print(22);
    }
  }
// le moteur ne reçoit plus de courant, il reste comme cà, et attend

on dirait que vous avez 4 états

  • OUVERT
  • ATTENTE CONFIRMATION FERMETURE
  • FERME
  • ATTENTE CONFIRMATION OUVERTURE

expliquez en français concrètement le fonctionnement que vous souhaitez puis dessinez la machine à état avec des flèches comme dans mon tuto.

je vous conseille de faire des fonctions ouvrir(), fermer() et stop() pour piloter le moteur, ce sera plus lisible

Bonjour

J’avoue que pour moi aussi des fonctions ouvrir et fermer seraient bienvenues, pour faciliter la lecture du code.

D’autre part il y a pas mal de confusion sur les if, c’est sans doute ce qui cause le va et vient. Quelques pistes d’ameliorations :

  1. remplacer les valeurs limites pour la photoresistance par des variables. Elles seront plus faciles à ajuster par la suite.

  2. virer la première partie avec les if dans “lecture lumière”, au debut de loop. Si je comprends bien, il ne
    servent qu’à faire de l’affichage.

  3. utiliser une seule structure if/else if /else, bien propre. Schématiquement, ça pourrait donner :

if (photoresistanceReading > valJour) {  //c'est le jour
     Serial.println("c'est le jour");
     ouvrir();
}
else if (photoresistanceReading > valNuit && photoresistanceReading < valJour){ // valeur intermediaire
     Serial.println("c'est entre le jour et la nuit");    
     blablabla
}
else{ // c'est la nuit
    Serial.println("c'est entre le jour et la nuit");    
    fermer() ;
}
  1. Que se passe t il si quelqu’un veut entrer s’il fait nuit ? Il éclaire la photorésistance avec son téléphone portable ?

  2. Le fonctionnement des relais doit-il être continu (durant toute la journée) ou uniquement quand on passe de jour a nuit ou de nuit a jour ? Autrement dit, est-il nécessaire de continuer à ouvrir une porte déjà ouverte ? ou peut elle rester ouverte toute seule ?

  3. Prendre une mesure moyenne de la valeur de la photorésistance sur un certain temps (pourquoi pas plusieurs minutes, pour limiter l’effet des phares de voitures par ex). Je me demande si la photoresistance est si stable que ça, ou si elle est varie. Ca supprimerait une grande partie des delays.

Que se passe t il si quelqu'un veut entrer s'il fait nuit ? Il éclaire la photorésistance avec son téléphone portable ?

Je suppose qu’il s’agit du 100 millionième projet de gestion de porte du poulailler..

Ça a été fait tellement de fois y compris sur ce forum...

@Cavoc cherchez à comprendre le code de ces autres projets et si c’est bien pour un poulailler, une RTC sera plus fiable qu’une tentative de détection de passage de nuage ou feuille qui tombe sur le capteur