Capteurs fin de course et trappe poupoule

Bonjour,
Je suis d'avance désolé de ma question, mais après 2 ou 3H de recherches et tests, comme je n'arrive à rien je me tourne vers vous.

C'est encore une histoire de trappe pour un poulailler, je leur ai fait un joli pont-levis. Le principe est le suivant :

une photorésistante capte la luminosité, si celle-ci est faible, un compteur décompte à partir de 200.
Si c'est un nuage qui est passé, la luminosité remonte et le compteur se réinitialise mais si c'est le crépuscule, alors le compteur atteint 5 et il faut fermer le pont-levis :
Le moteur se met en marche jusqu'à une butée, celle-ci atteinte, il doit s'arrêter. C'est là que le programme ne fonctionne pas.

J'utilise un moteur CC avec un pont en H L298N, des petits fin de course à galet et une carte arduino mega (je n'ai que ça sous la main).

Je teste l'état du fin de course avec un print, cela fonctionne, mais ma boucle n'arrête pas le moteur.

ça me paraissait tout simple à programmer, mais je n'ai pas l'effet escompté. Sûrement un problème dans les boucle if imbriquées.

Pourriez vous jeter un oeil SVP. Merci beaucoup par avance.

const int ENB = 6;
const int IN3 = 7;
const int IN4 = 8;
const int pinVal = A1;
int compteur = 200;
int jour;
const int unBouton = 2; //cpateur de fin de course
int etat;

void setup() {
Serial.begin(9600);
pinMode(unBouton,INPUT);
 // put your setup code here, to run once:
 pinMode(ENB, OUTPUT);
 pinMode(IN3, OUTPUT);
 pinMode(IN4, OUTPUT);
 pinMode(3,OUTPUT);

 digitalWrite(ENB, LOW);
 digitalWrite(IN3, HIGH);
 digitalWrite(IN4, LOW);
 
jour= HIGH;  // on initialise l'arduino le jour
}

void loop() {

delay(1000);
etat = digitalRead(unBouton);
int valeur = analogRead(pinVal);
Serial.print("resistance : ");
Serial.println(valeur);
Serial.print("compteur : ");
Serial.println(compteur);
Serial.print("jour : ");
Serial.println(jour);
Serial.println(etat);


//delay(250);

if (jour==HIGH) //SI c'est le jour
 {
   if (valeur<100) //si la valeur de la photorésistance est petite
   {
   compteur=compteur-1; //le compteur diminue
   }
   else
   {
   compteur=200;
   } 
   
   if (compteur<5)  //si le compteur est inférieur à un seuil
     {
       if (etat == HIGH) //si la fin de course est ouverte
       {
     digitalWrite(IN3, LOW);
     digitalWrite(IN4, HIGH);
     analogWrite(ENB, 255);
       }
       else is (etat == LOW) //butée atteinte on arrête le moteur
       {
     analogWrite(ENB, 0); 
       }
   jour=LOW;  // c'est maintenant la nuit
   compteur =200; // réinitialistion du compteur
     }
   //delay(3000);    
}  

// On fera la même chose quand le jour se lève avec un compteur qui s'incrémente vers le haut
if (jour==LOW)
 {
   if (valeur>300)
   {
   compteur=compteur+1;
   }
   else
   {
   compteur=200;
   } 
   
   if (compteur>205)
   {
   digitalWrite(IN3, HIGH);
   digitalWrite(IN4, LOW);
   analogWrite(ENB, 255);
   delay(3000);
   analogWrite(ENB, 0);
   jour=HIGH;  
   compteur =200;  
   } 
 }  
//if (valeur >=400)
//  {
//  digitalWrite(IN3, HIGH);
//  digitalWrite(IN4, LOW);
//  analogWrite(ENB, 255);
// // delay(10000);
//  analogWrite(ENB, 0);
//  }
}

A bientôt

Pourriez vous jeter un coup d’œil aussi aux règles du forum (les posts épinglés en haut du forum comme “Bien éditer son post pour les nuls” , “Faire un Nouveau Sujet ou le corriger avec les Balises...” et “Règles du forum francophone”), et corriger votre post?

———

À quoi sert le compteur? Comment gérez vous les rebonds du capteur de fin de course ?

Pour simplifier votre gestion du capteur de fin de course, éventuellement utilisez la librairie de @bricoleau

Pour bien comprendre les moteurs (et pour bien débuter avec l’arduino), c’est bien de lire Le mouvement grâce aux moteurs - les tutos d’eskimon. (commencez par la partie Le moteur à courant continu)

c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Bonjour,
Merci pour ta réponse. J’ai corrigé mon post, j’ai lu les tutos indiqués mais cela ne m’a pas aidé.
Je ne pourrais pas avoir un tuyau ? Cette idée de fin de course me paraissait simple pourtant.

Merci d’avance
Julien

ben comme vous n'avez pas de gestion du temps comment voulez vous que votre compteur soit représentatif de quoi que ce soit? à chaque tour de loop() vous allez décrémenter et votre int va passer négatif puis deviendra super grand...

Vous n’avez pas expliqué comment vous gérez les rebonds (ni ai vous avez des pullup)

Faut réécrire avec une machine à état propre ou alors mettre des while pour attendre que le moteur ferme ou ouvre la porte