porte de poulailler encore

erreur sur le post du code

  /* script epuré avec les etapes  du code d'achess */
  
  /* la cellule photo*/
const int analogInPin = A0; // cellule photoelectrique sur broche A0


/*la porte*/
const int moteurA = 6; // moteur porte 
const int moteurB = 7; // moteur porte
int ENA = 10; // broche PWM moteur

/* les fin de courses haut et bas */
const int hallhaut = 4; // broche D4 fin de course haut
const int hallbas = 5; // Broche D5 fin de course bas 
int sensorValuehaut = 0 ; // variable de stockage FDC haut
int sensorValuebas = 0 ; // variable de stockage FDC bas

// les variables :
unsigned long chrono = 0;// variable contenant un temps mémorisé en millisecondes.
unsigned long retard = 10000; // 10sec
bool ouvert;
bool clos;
bool tourne = 0; // indique que le moteur tourne

/*les leds pour verifier l'etat de la porte */
const int LedVerte =9; // LedVerte connectée sur broche D9
const int LedRouge =8; // LedRouge connectée sur broche D8


void setup() {
  Serial.begin(9600); // port com
  pinMode (LedVerte, OUTPUT); // declare la broche LedVerte comme une sortie
  pinMode (LedRouge, OUTPUT); // declare la broche LedRouge comme une sortie
  pinMode (moteurA, OUTPUT); // declare la broche comme sortie
  pinMode (moteurB, OUTPUT); // declare la broche comme sortie
  pinMode (ENA, OUTPUT); // declare la broche PWM comme une sortie 
  pinMode( hallhaut, INPUT); // declare la broche comme une entrée
  pinMode( hallbas, INPUT); // declare la broche  comme une entrée
  }

  /* parametre de d'ouverture et fermeture de la porte */
  
void ouverture(){ // enclenche l'ouverture de la porte 
 digitalWrite (ENA, HIGH); // active le L298
 digitalWrite (LedVerte, HIGH); // on allume la Led verte
 digitalWrite (LedRouge, LOW); // on eteind la Led rouge
 digitalWrite (moteurA, HIGH); // ouverture porte
 digitalWrite (moteurB, LOW); // ouverture porte
 analogWrite (ENA,160); // PWM moteur a l'ouverture (0.255)
 tourne = true; // le moteur tourne et l'etat de la cellule n'est pas pris en compte
}

void fermeture(){
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, LOW); // on eteint la Led verte
  digitalWrite (LedRouge, HIGH); // on allume la led rouge
  digitalWrite (moteurA, LOW); // fermeture porte
  digitalWrite (moteurB, HIGH); // fermeture porte
  analogWrite (ENA, 100); //PWM moteur a la fermeture (0.255)
  tourne = true; // le moteur tourne et l'etat de la cellule n'est pas pris en compte
}

 void stop()// arret du moteur 
{
  digitalWrite (moteurA, LOW); // arret porte
  digitalWrite (moteurB, LOW); // arret porte
  digitalWrite (ENA, LOW); // desactive le l298
  tourne = false;
}

void loop() {
  
  /* partie affichage sur le moniteur serie*/
  Serial.print("cellule = ");
  Serial.print(analogRead(analogInPin)); // on imprime la valeur de la cellule sur le moniteur serie
  Serial.print(" moteurA = ");
  Serial.print(digitalRead (moteurA) );
  Serial.print(" moteurB = ");
  Serial.print(digitalRead (moteurB));
  Serial.print ("  FDC haut =");
  Serial.print(digitalRead( hallhaut )); // on affiche sur le port serie
  Serial.print("  FDC bas =");
  Serial.println(digitalRead( hallbas )); // on affiche sur le port serie
  
  /*partie lancement du d'ouverture ou fermeture en fonction de la cellule*/
 
 if (!ouvert) // si la valeur lue est correspondante au jour
  { // et fdc non atteint
    if (analogRead(analogInPin) > 300)// jour
    {
      if (!tourne && ((millis() - chrono) > retard)) ouverture();
    }
    else chrono = millis();// RAZ si jour pas maintenu

    if (!sensorValuehaut)//fdc haut atteint
    {
      stop(); // si fin de course haut activé
      ouvert = true; // c'est ouvert
      clos = false; // c'est fermée
    }
  }

  if (!clos)
  {
    if (analogRead(analogInPin) < 100) // si la valeur lue est correspondante a la nuit
    {
      if (!tourne && ((millis() - chrono) > retard))fermeture();
    }
    else chrono = millis();

    if (sensorValuebas == LOW && analogRead(analogInPin) < 100) // si fin de course bas activé et (cellule <100 sinon empeche l'ouverture de la porte)
    {
      stop();
      ouvert = false;
      clos = true;
    }
  }
}

j'ai remarqué que sur le code d'Achess qu'il y avait un conflit lorsque l'on charge le code
si la porte est fermé et qu'il fait jour rien se passe il faut cacher la cellule et la on repart sur le fonctionnement normal ce n'est absolument pas bloquant
et si comprend bien c'est liée a la condition de la cellule et du capteur

Bonjour, je vois que tu as compris le principe des balises "CODE" pour insérer un code.

yanosh31:
j'ai remarqué que sur le code d'Achess qu'il y avait un conflit lorsque l'on charge le code

Il faut comprendre aussi que la fonction loop() est lue à chaque cycle d'horloge.

Le but des "booleans" est de dire au µp qu'une action est enclenchée et que ce n'est pas la peine de l'éxécuter à chaque cycle, lui laissant la place pour exécuter d'autres taches.

Donc avec les variables "ouvert" et "clos" (je voulais mettre fermé mais sans l'accent cela aurait été incompréhensible et "close" est un mot réservé)

Pour que le programme sache si la porte est ouverte, il faut ajouter ceci dans le setup

  sensorValuehaut = digitalRead( hallhaut ); // lecture du capteur a Effet Hall
  if (!sensorValuehaut)ouvert = true;//ouvert
  else ouvert = false; // fermé

Tu dois pouvoir supprimer "clos" qui fait double emploi puisque c'est l'inverse de "ouvert" et le remplacer par "!ouvert".

le code complet

/* la cellule photo*/
const int analogInPin = A0; // cellule photoelectrique sur broche A7
int sensorValue = 0; // variable ou est stocké la valeur de la cellule

/*la porte*/
const int moteurA = 6; // moteur porte
const int moteurB = 7; // moteur porte
int ENA = 10; // broche PWM moteur

/* les fin de courses haut et bas */
const int hallhaut = 4; // broche D6 fin de course haut
const int hallbas = 5; // Broche D7 fin de course bas
int sensorValuehaut = 0 ; // variable de stockage FDC haut
int sensorValuebas = 0 ; // variable de stockage FDC bas

/*bouton poussoir*/
const int bouton = 2; // bouton poussoir sur broche D2
int etatbouton = 0; // variable de stockage du bouton

const int LedVerte = 9; // LedVerte connectée sur broche D9

// les variables :
unsigned long chrono = 0;// variable contenant un temps mémorisé en millisecondes.
unsigned long retard = 120000; // 2 mn
bool ouvert;
bool tourne = 0; // indique que le moteur tourne

void setup()
{
  Serial.begin(9600); // port com
  pinMode (LedVerte, OUTPUT); // declare la broche LedVerte comme une sortie
  pinMode (moteurA, OUTPUT); // declare la broche comme sortie
  pinMode (moteurB, OUTPUT); // declare la broche comme sortie
  pinMode (ENA, OUTPUT); // declare la broche PWM comme une sortie
  pinMode( hallhaut, INPUT); // declare la broche comme une entrée
  pinMode( hallbas, INPUT); // declare la broche  comme une entrée
  pinMode( bouton, INPUT); // declare la broche omme une entree
  pinMode (13, OUTPUT); // declare la broche 13 comme une sortie BUZZER

  sensorValuehaut = digitalRead( hallhaut ); // lecture du capteur a Effet Hall
  if (!sensorValuehaut)ouvert = true;//ouvert
  else ouvert = false; // fermé
}

/* parametre de d'ouverture et fermeture de la porte */

void ouverture()
{ // enclenche l'ouverture de la porte
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, HIGH); // on allume la Led
  digitalWrite (moteurA, HIGH); // ouverture porte
  digitalWrite (moteurB, LOW); // ouverture porte
  analogWrite (ENA, 160); // PWM moteur a l'ouverture (0.255)
  tourne = true;
}

void fermeture()
{
  //delay(1000); MARCHE PAS !!!!!!!!!!!!!
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, LOW); // on eteint la Led
  digitalWrite (moteurA, LOW); // fermeture porte
  digitalWrite (moteurB, HIGH); // fermeture porte
  analogWrite (ENA, 100); //PWM moteur a la fermeture (0.255)
  tourne = true;
}

void stop()
{
  digitalWrite (moteurA, LOW); // arret porte
  digitalWrite (moteurB, LOW); // arret porte
  digitalWrite (ENA, LOW); // desactive le l298
  tourne = false;
}

void loop()
{
  /* partie affichage sur le moniteur serie*/
  Serial.print("cellule = ");
  Serial.print(sensorValue); // on imprime la valeur sur le moniteur serie
  Serial.print ("  FDC haut =");
  Serial.print(sensorValuehaut); // on affiche sur le port serie
  Serial.print("  FDC bas =");
  Serial.print(sensorValuebas); // on affiche sur le port serie
  Serial.print("  bouton =");
  Serial.println(etatbouton);

  sensorValue = analogRead(analogInPin); // lecture valeur cellule photoelectrique
  sensorValuehaut = digitalRead( hallhaut ); // lecture du capteur a Effet Hall
  sensorValuebas = digitalRead( hallbas ); // lecture du capteur a Effet Hall
  etatbouton = digitalRead(bouton );// lecture de l'etat du bouton

  /*partie lancement du d'ouverture ou fermeture en fonction de la cellule*/


  if (!ouvert) // si la valeur lue est correspondante au jour
  { // et fdc non atteint
    if (sensorValue > 300)// jour
    {
      if (!tourne && ((millis() - chrono) > retard)) ouverture();
    }
    else chrono = millis();// RAZ si jour pas maintenu

    if (!sensorValuehaut)//fdc haut atteint
    {
      stop(); // si fin de course haut activé
      ouvert = true;
    }
  }

  if (ouvert)
  {
    if (sensorValue < 100) // si la valeur lue est correspondante a la nuit
    {
      if (!tourne && ((millis() - chrono) > retard))fermeture();
    }
    else chrono = millis();

    if (!sensorValuebas) // si fin de course bas activé et (cellule <100 sinon empeche l'ouverture de la porte)
    {
      stop();
      // delay(1000); // ???
      ouvert = false;
    }
  }
}

je n'ai pas ajouté const uint8_t volontairement car je ne comprend pas le principe
c'est trop compliqué a ce stade je préfère laisser comme tel

Pareil c'est utile pour ceux qui font des gros programmes, ça optimise le type de variable en fonction du volume mémoire maximal que peut prendre cette variable

Il faut comprendre aussi que la fonction loop() est lue à chaque cycle d'horloge.

Heu ... attention, loop() est simplement exécutée dans une boucle while() :

hbachetti:
Heu ... attention, loop() est simplement exécutée dans une boucle while() :

ArduinoCore-avr/cores/arduino/main.cpp at master · arduino/ArduinoCore-avr · GitHub

trop compliqué pour moi.
Tu peux expliquer ?

dit moi si j'ai bien compris pour bool tourne; par exemple

c'est un état que l'on donne dans le void ouverture(); si la demande d'ouverture est appelé le programme dit le moteur tourne, cette variable n'est pas assigné a une broche mais elle est seulement prise en compte dans le void ou elle est écrite

dans ce code

sensorValuehaut = digitalRead( hallhaut ); // lecture du capteur a Effet Hall

  if (!sensorValuehaut)ouvert = true;//ouvert
  else ouvert = false;// fermé

je doit comprendre :
a l'initialisation
on lit le capteur haut
si le capteurhaut est a LOW( en position haute) on est ouvert
sinon on est fermée
et dans ce cas
on lance dans le loop ce code

if (!ouvert) // si la valeur lue est correspondante au jour
  { // et fdc non atteint
    if (sensorValue > 300)// jour
    {
      if (!tourne && ((millis() - chrono) > retard)) ouverture();
    }
    else chrono = millis();// RAZ si jour pas maintenu

    if (!sensorValuehaut)//fdc haut atteint
    {
      stop(); // si fin de course haut activé
      ouvert = true;
      clos = false;
    }

Tu peux expliquer ?

int main(void)
{
 init();
 initVariant();
#if defined(USBCON)
 USBDevice.attach();
#endif
 setup();
 for (;;) {
 loop();                                // ICI OK ce n'est pas while() c'est for().
 if (serialEventRun) serialEventRun();
 }
 return 0;
}

main() est le point d'entrée classique d'un prog C.

main() appelle setup() puis loop() en boucle.

hbachetti:
main() est le point d'entrée classique d'un prog C.
main() appelle setup() puis loop() en boucle.

Je ne connaissais pas. Je pensais que tu critiquais le fait que j'évite l'utilisation de "while".

yanosh31:
je doit comprendre :
a l'initialisation
on lit le capteur haut
si le capteurhaut est a LOW( en position haute) on est ouvert
sinon on est fermée

Oui, je suppose que ça marche, même avec le delay(1000) supprimé.

On peut encore simplifier sans avoir besoin d'initialisation, on a juste besoin des variables monte et descend pour ne pas répéter inutilement l'ordre :

  • Porte fermée, on attends le jour, on patiente le temps de la variable "retard" que le jour soit bien aquit pour ouvrir.
  • dès que le fin de course haut est atteint, on arrête le moteur.
  • Porte ouverte, on attends le seuil de luminosité du coucher, on patiente aussi avant d'envoyer l'ordre de fermer.
  • Arrêt du moteur dès fin de course bas ouvert.

Je te remets le code complet à essayer et me dire si c'est OK :

/* la cellule photo*/
const int analogInPin = A0; // cellule photoelectrique sur broche A7
int sensorValue = 0; // variable ou est stocké la valeur de la cellule

/*la porte*/
const int moteurA = 6; // moteur porte
const int moteurB = 7; // moteur porte
int ENA = 10; // broche PWM moteur

/* les fin de courses haut et bas */
const int hallhaut = 4; // broche D6 fin de course haut
const int hallbas = 5; // Broche D7 fin de course bas
int sensorValuehaut = 0 ; // variable de stockage FDC haut
int sensorValuebas = 0 ; // variable de stockage FDC bas

/*bouton poussoir*/
const int bouton = 2; // bouton poussoir sur broche D2
int etatbouton = 0; // variable de stockage du bouton

const int LedVerte = 9; // LedVerte connectée sur broche D9

// les variables :
unsigned long chrono = 0;// variable contenant un temps mémorisé en millisecondes.
unsigned long retard = 120000; // 2 mn
bool monte = 0; // pendant l'ouverture
bool descend = 0; // pendant la fermeture

void setup()
{
  Serial.begin(9600); // port com
  pinMode (LedVerte, OUTPUT); // declare la broche LedVerte comme une sortie
  pinMode (moteurA, OUTPUT); // declare la broche comme sortie
  pinMode (moteurB, OUTPUT); // declare la broche comme sortie
  pinMode (ENA, OUTPUT); // declare la broche PWM comme une sortie
  pinMode( hallhaut, INPUT); // declare la broche comme une entrée
  pinMode( hallbas, INPUT); // declare la broche  comme une entrée
  pinMode( bouton, INPUT); // declare la broche omme une entree
  pinMode (13, OUTPUT); // declare la broche 13 comme une sortie BUZZER
}

/* parametre de d'ouverture et fermeture de la porte */

void ouverture()
{ // enclenche l'ouverture de la porte
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, HIGH); // on allume la Led
  digitalWrite (moteurA, HIGH); // ouverture porte
  digitalWrite (moteurB, LOW); // ouverture porte
  analogWrite (ENA, 160); // PWM moteur a l'ouverture (0.255)
  monte = true;
}

void fermeture()
{
  //delay(1000); MARCHE PAS !!!!!!!!!!!!!
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, LOW); // on eteint la Led
  digitalWrite (moteurA, LOW); // fermeture porte
  digitalWrite (moteurB, HIGH); // fermeture porte
  analogWrite (ENA, 100); //PWM moteur a la fermeture (0.255)
  descend = true;
}

void stop()
{
  digitalWrite (moteurA, LOW); // arret porte
  digitalWrite (moteurB, LOW); // arret porte
  digitalWrite (ENA, LOW); // desactive le l298
  monte = false; descend = false;
}

void loop()
{
  /* partie affichage sur le moniteur serie*/
  Serial.print("cellule = ");
  Serial.print(sensorValue); // on imprime la valeur sur le moniteur serie
  Serial.print ("  FDC haut =");
  Serial.print(sensorValuehaut); // on affiche sur le port serie
  Serial.print("  FDC bas =");
  Serial.print(sensorValuebas); // on affiche sur le port serie
  Serial.print("  bouton =");
  Serial.println(etatbouton);

  sensorValue = analogRead(analogInPin); // lecture valeur cellule photoelectrique
  sensorValuehaut = digitalRead( hallhaut ); // lecture du capteur a Effet Hall
  sensorValuebas = digitalRead( hallbas ); // lecture du capteur a Effet Hall
  etatbouton = digitalRead(bouton );// lecture de l'etat du bouton

  /*partie lancement du d'ouverture ou fermeture en fonction de la cellule*/

  if (!sensorValuebas) // fermé
  {
    if (sensorValue > 300)// jour
    {
      /* On envoi l'ordre qu'une fois quand le jour est maintenu pendant
        la durée du retard, sinon on remets le compteur à zéro*/
      if (!monte && ((millis() - chrono) > retard)) ouverture();
    }
    else chrono = millis();// RAZ si < jour
  }

  if (monte && !sensorValuehaut)stop();//ouvert

  if (!sensorValuehaut) // ouvert
  {
    if (sensorValue < 100) // nuit
    {
      if (!descend && ((millis() - chrono) > retard))fermeture();
    }
    else chrono = millis();
  }

  if (descend && !sensorValuebas)stop(); // fermé
}

Ca fonctionne vraiment très bien de plus même lorsque je bouge la porte et et que le capteur est déplacé rien ne s'active de façon intempestive.
j'ai rajouté un poussoir pour fermer la porte juste pour au cas ou la nuit soit déjà tombé et que ma tempo de fermeture soit trop grande et aussi un retard nuit et jour ça permet de régler la tempo a l'ouverture et a la fermeture,
j'ai quand même un peu d'inertie avec le moteur mais avec ton script le capteur une fois détecté tout s’arrête
je vais aussi peut être me servir du poussoir pour avoir une LED ou 2 pour me donner un état de la batterie et je crois que l'on peut mettre l’Arduino en mode sommeil histoire économiser la batterie
en tout cas un grand MERCI a tout les deux j’étais loin d'arriver a ce résultats et j'ai appris pas mal de chose
demain je fini de le mettre au propre la j'ai les yeux qui pique :slight_smile:
encore Merci

Bonjour,

même lorsque je bouge la porte et et que le capteur est déplacé rien ne s'active de façon intempestive.

Le principe est d'interroger le capteur seulement la nuit et pendant l'ouverture, mais on n'en tiens plus compte dès que la trappe est ouverte.
Ayant eu des problèmes aux débuts, j'ai carrément viré les fins de course. Il suffit d'intercaler une résistance de faible valeur en série avec le moteur, pour détecter la fin de course. Je l'ai fait aussi dans mon automatisme de porte cochère, dans ce cas les fin de course sont utilisés pour info, mais l'arrêt est commandé par la détection du courant moteur quand il force.

j'ai rajouté un poussoir pour fermer la porte juste pour au cas ou la nuit soit déjà tombé et que ma tempo de fermeture soit trop grande

Mon système tourne depuis début 2016 sans tempo de fermeture et n'ai jamais eu de problèmes. Je l'ai réglé une fois pour toute de façon à ce que ça ferme environ 20 à 30 mn après que la dernière poule soit entrée et elle se ferme toujours avant nuit noire et jamais eu de soucis avec le passage d'un nuage noir.
Ça se traduit par une variation imperceptible au niveau de la cellule, rapport au délais .

J'ai juste mis une tempo à l'ouverture pour éviter l'ouverture intempestive du à une lampe de poche ou un phare de voiture.

je crois que l'on peut mettre l'Arduino en mode sommeil histoire économiser la batterie

Pour ça va faire un tour sur le blog de l'excellent HBachetti
Voir aussi ce sujet Alimentation Arduino, pont en H et moteur 12V avec batterie - Français - Arduino Forum

ça y est j'ai installé ma porte tout fonctionne a merveille a voir dans le temps pour le moment je vais surveiller le voltage de la batterie en attendant de me pencher sur la mise en veille.
j'en ai profité pour precablé quelques entrée sortie supplémentaire au cas ou il y aurait besoin d'autres rajout de matériel

j'ai visité le blog de HBachetti et finalement j'y ai passé 1 heure c'est une mine d'or ce site, c'est parti directement en favoris sur mon navigateur

bluffant la porte cochère la technologie allié au rustique j'adore, l’arrêt des moteurs fait penser au motorisation de portail sans FDC je pense que c'est le même principe mais le coup du servo en guise de verrouillage je dit chapeau.

je voudrais acheter un livre qui ne traite que du langage Arduino quelques chose de simple et je ne sais pas si les livres qui parle de C++ sont vraiment identique ,une idée peut être?

porte.jpg

photo

Tu ne trouveras pas de poulailler sur mon blog malheureusement.
Mais ça viendra ...

En voyant la photo, je comprends ton problème d'inertie moteur. C'est parce que tu utilise une ficelle et en fermeture le moteur n'est pas freiné en fin de course. j'avais résolu ce problème avec une ficelle toujours tendue par un ressort, faisant un aller retour en passant autour d'une poulie Voir

Tu peux le résoudre en mesurant le temps de fermeture en vitesse maxi puis réduire la vitesse dans la dernière seconde du trajet.

Tu peux le résoudre en mesurant le temps de fermeture en vitesse maxi puis réduire la vitesse dans la dernière seconde du trajet.

j'essaye de le faire avec la fonction millis() mais bien évidement ça ne marche pas !!!

si j'ai bien compris la fonction millis() est un temps qui s’écoule dans l'arduino
on crée une variable

unsigned long chrono = 0;

elle donne un moment dans le temps qui s’écoule dans l'arduino

if (!tourne && ((millis() - chrono) > retardjour)) ouverture();

la on compare (le temps écoulé de l'arduino - le temps de référence départ) des qu'il est supérieur a retardjour on lance l'ouverture

j'ai essayé de résonner de cette facon
si mon moteur tourne je compare millis() a chrono et des qu'il est supérieur a freinbas je modifie la vitsesse

void fermeture()
{ 
  if (tourne && ((millis() - chrono) > freinbas)) {analogWrite (ENA = 100)};
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, LOW); // on eteint la Led
  digitalWrite (moteurA, LOW); // fermeture porte
  digitalWrite (moteurB, HIGH); // fermeture porte
  analogWrite (ENA, 160); //PWM moteur a la fermeture (0.255)
  tourne = true;
}

mais il y a une erreur de syntaxe sur la ligne if

j'ai essayé d'autre méthodes une consiste a cree

void freinferme(){analogWrite (ENA, 100);}

et de rajouter le code dans le if de la fermeture

if (ouvert)
  {
    if (sensorValue < 100) // si la valeur lue est correspondante a la nuit
    {
      if (!tourne && ((millis() - chrono) > retardnuit))fermeture();
    }
    else chrono = millis();
    
/*frein a la fermeture */
   if (tourne && ((millis() - chrono) > freinbas))freinferme();
   
   
    if (!sensorValuebas) // si fin de course bas activé et (cellule <100 sinon empeche l'ouverture de la porte)
    {
      stop();
      ouvert = false;
    }

mais la est ce que le fait d’être rentrée dans le void de fermeture empêche le code de lancer le void frein ?

if (tourne && ((millis() - chrono) > freinbas)) {analogWrite (ENA = 100)};

if (tourne && ((millis() - chrono) > freinbas)) {analogWrite (ENA , 100);}

; à la fin de l'instruction analogWrite. Pas besoin de ; après un }
Il n'y a pas de =

On peut aussi écrire

if (tourne && ((millis() - chrono) > freinbas)) analogWrite (ENA, 100);

Bonjour,
Pourquoi ne reprends-tu pas le dernier code donné ici

j'ai essayé de résonner de cette facon
si mon moteur tourne je compare millis() a chrono et des qu'il est supérieur a freinbas je modifie la vitsesse

Oui bonne réflexion, mais chrono est déjà utilisé, il a en mémoire la dernière fois qu'il faisait jour et il faut d'abord lui donner le temps du début de la fermeture comme ceci :

void fermeture()
{
  chrono = millis(); //enregistre le départ
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, LOW); // on eteint la Led
  digitalWrite (moteurA, LOW); // fermeture porte
  digitalWrite (moteurB, HIGH); // fermeture porte
  analogWrite (ENA, 100); //PWM moteur a la fermeture (0.255)
  descend = true;
}
  // fermeture :

  if (!sensorValuehaut) // ouvert
  {
    if (sensorValue < 100) // nuit
    {
      if (!descend && ((millis() - chrono) > retard))fermeture();
    }
    else chrono = millis();
  }

  if (descend && (millis - chrono > freinbas ))analogWrite (ENA, 100);

  if (descend && !sensorValuebas)
  {
    stop(); // fermé
    Serial.print("Durée de fermeture = ");
    Serial.print(millis() - chrono); // on imprime la valeur sur le moniteur serie
  }

j'était parti sur le dernier code ou tu avais supprimé les étapes clos et descente

/* PROGRAMME COMMANDE CELLULE COMPLET */

/* la cellule photo*/
const int analogInPin = A0; // cellule photoelectrique sur broche A7
int sensorValue = 0; // variable ou est stocké la valeur de la cellule

/*la porte*/
const int moteurA = 6; // moteur porte
const int moteurB = 7; // moteur porte
int ENA = 10; // broche PWM moteur

/* les fin de courses haut et bas */
const int hallhaut = 4; // broche D6 fin de course haut
const int hallbas = 5; // Broche D7 fin de course bas
int sensorValuehaut = 0 ; // variable de stockage FDC haut
int sensorValuebas = 0 ; // variable de stockage FDC bas

/*bouton poussoir*/
const int bouton = 2; // bouton poussoir sur broche D2
int etatbouton = 0; // variable de stockage du bouton

const int LedVerte = 9; // LedVerte connectée sur broche D9

// les variables :
unsigned long chrono = 0;// variable contenant un temps mémorisé en millisecondes.
unsigned long retardnuit = 10000; //temps avant la fermeture 
unsigned long retardjour = 5000; // temps avant l'ouverture 
bool ouvert;
bool tourne = 0; // indique que le moteur tourne

void setup()
{
  Serial.begin(9600); // port com
  pinMode (LedVerte, OUTPUT); // declare la broche LedVerte comme une sortie
  pinMode (moteurA, OUTPUT); // declare la broche comme sortie
  pinMode (moteurB, OUTPUT); // declare la broche comme sortie
  pinMode (ENA, OUTPUT); // declare la broche PWM comme une sortie
  pinMode( hallhaut, INPUT); // declare la broche comme une entrée
  pinMode( hallbas, INPUT); // declare la broche  comme une entrée
  pinMode( bouton, INPUT); // declare la broche omme une entree
  pinMode (13, OUTPUT); // declare la broche 13 comme une sortie BUZZER

  sensorValuehaut = digitalRead( hallhaut ); // lecture du capteur a Effet Hall
  if (!sensorValuehaut)ouvert = true;//ouvert
  else ouvert = false; // fermé
}

/* parametre de d'ouverture et fermeture de la porte */

void ouverture()
{ // enclenche l'ouverture de la porte
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, HIGH); // on allume la Led
  digitalWrite (moteurA, HIGH); // ouverture porte
  digitalWrite (moteurB, LOW); // ouverture porte
  analogWrite (ENA, 160); // PWM moteur a l'ouverture (0.255)
  tourne = true;
}

void fermeture()
{
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, LOW); // on eteint la Led
  digitalWrite (moteurA, LOW); // fermeture porte
  digitalWrite (moteurB, HIGH); // fermeture porte
  analogWrite (ENA, 100); //PWM moteur a la fermeture (0.255)
  tourne = true;
}

void stop()
{
  digitalWrite (moteurA, LOW); // arret porte
  digitalWrite (moteurB, LOW); // arret porte
  digitalWrite (ENA, LOW); // desactive le l298
  tourne = false;
}

void loop()
{
  /* partie affichage sur le moniteur serie*/
  Serial.print("cellule = ");
  Serial.print(sensorValue); // on imprime la valeur sur le moniteur serie
  Serial.print ("  FDC haut =");
  Serial.print(sensorValuehaut); // on affiche sur le port serie
  Serial.print("  FDC bas =");
  Serial.print(sensorValuebas); // on affiche sur le port serie
  Serial.print("  bouton =");
  Serial.println(etatbouton);

  sensorValue = analogRead(analogInPin); // lecture valeur cellule photoelectrique
  sensorValuehaut = digitalRead( hallhaut ); // lecture du capteur a Effet Hall
  sensorValuebas = digitalRead( hallbas ); // lecture du capteur a Effet Hall
  etatbouton = digitalRead(bouton );// lecture de l'etat du bouton

  /*partie lancement du d'ouverture ou fermeture en fonction de la cellule*/


  if (!ouvert) // si la valeur lue est correspondante au jour
  { // et fdc non atteint
    if (sensorValue > 300)// jour
    {
      if (!tourne && ((millis() - chrono) > retardjour)) ouverture();
    }
    else chrono = millis();// RAZ si jour pas maintenu

    if (!sensorValuehaut)//fdc haut atteint
    {
      stop(); // si fin de course haut activé
      ouvert = true;
    }
  }

  if (ouvert)
  {
    if (sensorValue < 100) // si la valeur lue est correspondante a la nuit
    {
      if (!tourne && ((millis() - chrono) > retardnuit))fermeture();
    }
    else chrono = millis();

    if (!sensorValuebas) // si fin de course bas activé et (cellule <100 sinon empeche l'ouverture de la porte)
    {
      stop();
      ouvert = false;
    }
    /*Partie ouverture avec le bouton poussoir pour fermeture*/
    
   if (etatbouton == HIGH )
   { 
  if (ouvert)fermeture();
 
    if (!sensorValuebas) // si fin de course bas activé et (cellule <100 sinon empeche l'ouverture de la porte)
    {
      stop();
      ouvert = false;
    }
  }
  
}
}

Oui bonne réflexion, mais chrono est déjà utilisé, il a en mémoire la dernière fois qu'il faisait jour

on moment j'ai inséré un chronofrein dans le code mais impossible de savoir si il était pris en compte ou pas et si oui a quel moment
mais avec la commande serial que tu m'a donner ça va me simplifier ça

je regarde en detail ce soir

Bonsoir,

On peut faire simple pour la fermeture ou l'ouverture forcée, en vérifiant que le moteur ne tourne pas avant l'appui et que la porte soit fermé avant de l'ouvrir ou ouverte avant de la fermée.
Il ne devrait pas y avoir de problème avec le rebond

if (etatbouton == TRUE) peut être simplifié par if(etatbouton)

Voir si cette nouvelle modif avec appui bouton fonctionne :

/* la cellule photo*/
const int analogInPin = A0; // cellule photoelectrique sur broche A7
int sensorValue = 0; // variable ou est stocké la valeur de la cellule

/*la porte*/
const int moteurA = 6; // moteur porte
const int moteurB = 7; // moteur porte
int ENA = 10; // broche PWM moteur

/* les fin de courses haut et bas */
const int hallhaut = 4; // broche D6 fin de course haut
const int hallbas = 5; // Broche D7 fin de course bas
int sensorValuehaut = 0 ; // variable de stockage FDC haut
int sensorValuebas = 0 ; // variable de stockage FDC bas

/*bouton poussoir*/
const int bouton = 2; // bouton poussoir sur broche D2
int etatbouton = 0; // variable de stockage du bouton

const int LedVerte = 9; // LedVerte connectée sur broche D9

// les variables :
unsigned long chrono = 0;// variable contenant un temps mémorisé en millisecondes.
unsigned long retardnuit = 10000; //temps avant la fermeture
unsigned long retardjour = 5000; // temps avant l'ouverture
unsigned long freinbas = 5000; // 5 secondes
bool tourne = 0; // indique que le moteur tourne
//bool monte = 0; // pendant l'ouverture
//bool descend = 0; // pendant la fermeture

void setup()
{
  Serial.begin(9600); // port com
  pinMode (LedVerte, OUTPUT); // declare la broche LedVerte comme une sortie
  pinMode (moteurA, OUTPUT); // declare la broche comme sortie
  pinMode (moteurB, OUTPUT); // declare la broche comme sortie
  pinMode (ENA, OUTPUT); // declare la broche PWM comme une sortie
  pinMode( hallhaut, INPUT); // declare la broche comme une entrée
  pinMode( hallbas, INPUT); // declare la broche  comme une entrée
  pinMode( bouton, INPUT); // declare la broche omme une entree
  pinMode (13, OUTPUT); // declare la broche 13 comme une sortie BUZZER
}

/* parametre de d'ouverture et fermeture de la porte */

void ouverture()
{ // enclenche l'ouverture de la porte
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, HIGH); // on allume la Led
  digitalWrite (moteurA, HIGH); // ouverture porte
  digitalWrite (moteurB, LOW); // ouverture porte
  analogWrite (ENA, 160); // PWM moteur a l'ouverture (0.255)
  tourne = true;
}

void fermeture()
{
  chrono = millis();//enregistre le départ
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, LOW); // on eteint la Led
  digitalWrite (moteurA, LOW); // fermeture porte
  digitalWrite (moteurB, HIGH); // fermeture porte
  analogWrite (ENA, 100); //PWM moteur a la fermeture (0.255)
  tourne = true;
}

void stop()
{
  digitalWrite (moteurA, LOW); // arret porte
  digitalWrite (moteurB, LOW); // arret porte
  digitalWrite (ENA, LOW); // desactive le l298
  tourne = false; 
}

void loop()
{
  /* partie affichage sur le moniteur serie*/
  Serial.print("cellule = ");
  Serial.print(sensorValue); // on imprime la valeur sur le moniteur serie
  Serial.print ("  FDC haut =");
  Serial.print(sensorValuehaut); // on affiche sur le port serie
  Serial.print("  FDC bas =");
  Serial.print(sensorValuebas); // on affiche sur le port serie
  Serial.print("  bouton =");
  Serial.println(etatbouton);

  sensorValue = analogRead(analogInPin); // lecture valeur cellule photoelectrique
  sensorValuehaut = digitalRead( hallhaut ); // lecture du capteur a Effet Hall
  sensorValuebas = digitalRead( hallbas ); // lecture du capteur a Effet Hall
  etatbouton = digitalRead(bouton );// lecture de l'etat du bouton

  /*partie lancement du d'ouverture ou fermeture en fonction de la cellule*/

  // ouverture :

  if (!sensorValuebas) // fermé
  {
    if (!tourne && etatbouton)ouverture(); // ouverture forcée

    if (sensorValue > 300)// jour
    {
      /* On envoi l'ordre une fois suite au jour est maintenu pendant
        la durée du retard, sinon on remets le compteur à zéro*/
      if (!tourne && ((millis() - chrono) > retardjour)) ouverture();
    }
    else chrono = millis();// RAZ si < jour
  }

  if (tourne && !sensorValuehaut)stop();//ouvert

  // fermeture :

  if (!sensorValuehaut) // ouvert
  {
    if (!tourne && etatbouton)fermeture(); // fermeture forcée

    if (sensorValue < 100) // nuit
    {
      if (!tourne && ((millis() - chrono) > retardnuit))fermeture();
    }
    else chrono = millis();
  }

  if (tourne && (millis - chrono > freinbas ))analogWrite (ENA, 100);

  if (tourne && !sensorValuebas)
  {
    stop(); // fermé
    Serial.print("Durée de fermeture = ");
    Serial.print(millis() - chrono); // on imprime la valeur sur le moniteur serie
  }
}

Bonjour,

j'ai rajouté une booléenne pour la montée et une pour la descente sinon le code ne donnais rien je ne sais pas si il y avais un lien avec l’état a la mise en service j'ai essayé de rajouter le script avec la booléenne ouvert mais ça n'a rien donné

sensorValuehaut = digitalRead( hallhaut ); // lecture du capteur a Effet Hall
  if (!sensorValuehaut)ouvert = true;//ouvert
  else ouvert = false; // fermé

sinon j'ai bien un temps affiché sur le moniteur mais lorsque je l'ajoute a freinbas çà ne donne rien, après je fais des essai avec lecteur CD et le temps est très rapide 23 affiché

void fermeture()
{
  //chrono = millis();//enregistre le départ
  digitalWrite (ENA, HIGH); // active le L298
  digitalWrite (LedVerte, HIGH); // on allume la Led
  digitalWrite (moteurA, LOW); // fermeture porte
  digitalWrite (moteurB, HIGH); // fermeture porte
  analogWrite (ENA, 100); //PWM moteur a la fermeture (0.255)
  descend = true;
}

j'ai rajouté une led pour voir physiquement ce qui se passe et elle s'allume toujours au début
et impossible quel que soit la valeur rajouté dans freinbas de lui faire avoir un autre comportement

je fais des essai avec lecteur CD et le temps est très rapide 23 affiché

??
23 ms :o c'est un moteur de lecteur CD ?
Normalement faut un moto-réducteur pour ce type d'application, ou un moteur pas à pas comme lui https://electrotoile.eu/fabrication-diy-porte-poulailler-automatique-arduino.php#003