Porte de Poulailler avec vérin électrique 12 V

Bonjour à tous,

Je viens sur ce forum car je suis une bille en programmation et j’aurais besoin d’aide.

Mon objectif:

Avoir une porte de poulailler qui s’ouvre et se ferme en fonction de la luminosité, avec une lumière qui s’éclaire 15 min à l’intérieur du poulailler avant la fermeture.

Montage :

Arduino Uno
Batterie 12 V (qui se recharge via un panneau solaire)
Vérin électrique 12 V
Led 5 V
LDR
Module de Relais 2 canaux
Convertisseur de tension (Pour alimenter l’Arduino avec la batterie)

Je n’ai pas de capteur fin de course car comme j’utilise un vérin, je sais qu’il me faut 30 sec pour ouvrir ou fermer la porte. Cependant, je ne sais pas comment l’arrêter.

Mon second problème réside dans le stockage des données. J’aimerais savoir comment je peux faire pour garder les valeurs mesurées par la LDR et en établir une moyenne sur 5 min de mesures. Idéalement, ce qui serait bien c’est que les mesures soient faites toutes les 10 sec et qu’ils réitèrent la moyenne en permanence toutes les 10 secondes. Si la moyenne est inférieure à un certain seuil, la lumière du poulailler s’allume pdt 15 min et ensuite la porte se ferme.

Je vous mets en PJ mon prog Arduino et le montage mais je suis loin d’avoir réussi à faire ce que je voulais.

Merci d’avance pour votre aide !

Prog_pour_le_poulaillier.ino (1 KB)

Montage.jpg

Quel verin?
On en trouve chez ali ou ebay ils sont presque tous équipé de fin de courses. Donc Tu ne t'occupe de rien.
Je suis en train de faire le meme
Moi j'utilise un double pont en H l298D

L298D DOUBLE pont en H

Pour la ldr
Tu te creer une variable int ldr, un byte nb de lecture
Et toutes les 10 secondes ou minutes tu lit la ldr, tu cumule les valeures a la fin tu fait une division du total ldr par le nb de lecture et tu aura une valeure moyenne sur (nb x tempo) de temps ca evite les fausse mesures , flashs, eclair ou autre

Prevoie un hysterisis ou tu ne fait rien, la limite nuit / jour doit etre TRES franche pour eviter les bagots

Ps je suis sur tablette, difficile de lire ton code.g

Bonjour,
Un verin c'est un gros moyen, un servo moteur suffit en général ?

Pourquoi éclairer 15 mn ? Chez moi elles rentrent quand il ne fait pas encore complètement nuit, il suffit d'une fenêtre et elles voient assez clair.

Sinon pour les 15 mn, il suffit d'un seuil pour allumer et utiliser le compteur millis() ou même délay() pour éteindre 15 mn après.

achess:
Bonjour,
Un verin c'est un gros moyen, un servo moteur suffit en général ?

moi j'utilise ça car c'est en 12V, très fiable, pas de gestion des fin de course , très costaud pour une porte guillotine, pas de risque que ça déconne

avant d'avoir ça je me suis déjà fait bouffer une vingtaine de poules... outre l'effet pécunier, il y a aussi l'effet émotionnel...
c'est vrai le bouzin m'a couté une vingtaine d'euro... soit le prix de 2 poules.... mais quand on aime, on ne compte pas! :slight_smile:

Pourquoi répéter la demande ?
https://forum.arduino.cc/index.php?topic=670983.0

Arzou:
moi j'utilise ça car c'est en 12V, très fiable, pas de gestion des fin de course , très costaud pour une porte guillotine, pas de risque que ça déconne

Pas besoin non plus de fin de course avec un servo test

La ldr non plus, tu prends la mesure sur le PV :wink:

Salut Arzou et merci pour ta réponse rapide.

"Tu te creer une variable int ldr, un byte nb de lecture
Et toutes les 10 secondes ou minutes tu lit la ldr, tu cumule les valeures a la fin tu fait une division du total ldr par le nb de lecture et tu aura une valeure moyenne sur (nb x tempo) de temps ca evite les fausse mesures , flashs, eclair ou autre..."

Ce que tu as dit juste au dessus, je ne sais pas faire c'est bien le problème. Comment cumuler les valeurs? et continuer de les cumuler ttes les 10 minutes et faire la moyenne à l'infini?

Ensuite pour répondre aux autres sur le pourquoi j'ai prix un vérin c'est pour être sur que le renard va pas soulever la porte avec son museau. L'effort axial nécessaire pour la soulever avec un vérin lui sera impossible.

https://www.amazon.fr/Walfront-Actionneur-Linéaire-Electrique-Automobile/dp/B076QDFJGS/ref=pd_sbs_201_t_2/261-5849600-6716760?_encoding=UTF8&pd_rd_i=B076QDFJGS&pd_rd_r=04b95942-ab92-4860-951f-b935140b9e49&pd_rd_w=UDn9B&pd_rd_wg=SXIyr&pf_rd_p=9b28d941-c13a-4c2b-b935-36854aa20020&pf_rd_r=9WEBBSPM8X0CM19F90FS&psc=1&refRID=9WEBBSPM8X0CM19F90FS

Je n'ai pas d'infos sur ce vérin pour savoir s'il y a une fin de course ou non ou alors est ce que c'est par défaut et une fois arrivé au max, il s'arrête automatiquement? Comment en être sur?

Merci

Ensuite pour répondre aux autres sur le pourquoi j'ai prix un vérin c'est pour être sur que le renard va pas soulever la porte avec son museau

Pas si le bas entre dans un logement et que ça bloque comme dans la video.

En cas d'erreur, guillotine assurée et au même prix, t'as 10 servos

ca evite les fausse mesures , flashs, eclair ou autre...

jamais eu de soucis. Pour les risques de flash, j'ai juste prévu un retard à l'ouverture.

je te met mon extrait de code

a toi de l'adapter
je ne suis pas chez moi donc je ne pourrais pas le tester avant ce soir

if ( millis() - tempo >= periode_scrutation) //  autorise  a entrer dans la boucle ldr sans blocage
  {
    tempo = millis();
    if (nb_lectures_LDR > duree_boucle) // traitement de la ldr au fil de l'eau  si on a atteint le nb de lectures LDR
    {
      periode_scrutation = 10000ul; // aprés la premiere loop, on ralentie la lecture LDR en ajoutant une tempo importante
      if ((total_ldr / nb_lectures_LDR) >= 500) Etat = nuit;  // si la moyenne des lectures LDR >= 500 il fait jour hors de cette plage on ne fait rien
      else   if ((total_ldr / nb_lectures_LDR) <= 400)  Etat = jour; // si la moyenne des lectures LDR <= 400 il fait nuit
      total_ldr = 0; // on re initialise
      nb_lectures_LDR = 0;
      
    }
    total_ldr = total_ldr + (analogRead(lecture_Ldr)); // on cumule les lecture LDR
    nb_lectures_LDR++;   // INC nb de boucles

je te le donne brut de decoffrage

achess:
Pas si le bas entre dans un logement et que ça bloque comme dans la video.

sauf qu'avec les poules le bas du logement va se remplir très très vite de "merdes" et ca ne descendra plus et ta porte se bloquera.. entre-ouverte

Arzou:
sauf qu'avec les poules le bas du logement va se remplir très très vite de "merdes" et ca ne descendra plus et ta porte se bloquera.. entre-ouverte

je nettoie tout les jours et j'ai rarement quelque chose. La gorge fait 2 cm du fait que j'ai arrondi le bas de la tôle.

Merci pour vos conseils les gars. Je vais regarder ton code ce soir Arzou et essayer de le comprendre :slight_smile:

Quand Je serais chez Moi, je te refilerais un code nettoyé et expliqué car pas sûr que ma logique soit..... la plus logique
:slight_smile:

klvin1981:
Je n'ai pas d'infos sur ce vérin pour savoir s'il y a une fin de course ou non ou alors est ce que c'est par défaut et une fois arrivé au max, il s'arrête automatiquement? Comment en être sur?

Merci

chez wish c'est spécifié.

la aussi c'est spécifié,
Verin 12V

pour savoir, tu branche ton verin sur une source 12V et tu regarde ce qu'il se passe. s'il s'arrete seul en bout de course, il a des contacts de fin de course, s'il force.... pas bon!

Arzou,

Je te confirme, je viens de faire le test. Il y a bien des contacts fin de course.

J'ai pas vraiment compris ton code pour être honnête. Voilàa ce que j'ai fait au départ. Je ne sais pas comment intégrer ton code dans le mien :frowning:

C'est là ou je bugge.

const int forwards = 7;
const int backwards = 12;
int pinPR = A0; //pin de connexion pour la photorésistance
int Light = 6;

void setup() {

Serial.begin(9600);
pinMode(pinPR,INPUT);
pinMode(forwards, OUTPUT);//set relay as an output
pinMode(backwards, OUTPUT);//set relay as an output
pinMode(Light,OUTPUT);
}

void loop() {

int valeur = analogRead(pinPR); // on lit la valeur transmise par la photorésistance
Serial.println(valeur); // on l'affiche
if (valeur > 300)
{
digitalWrite(forwards, LOW);//Ouverture porte
digitalWrite(backwards, HIGH);//Ouverture porte
delay(1000); // wait 30 seconds
digitalWrite(forwards, LOW);
digitalWrite(backwards, LOW);
}
if (valeur < 300)
{
digitalWrite(Light,HIGH);
delay(5000);// wait 10 minutes
digitalWrite(forwards, HIGH);//Fermeture porte
digitalWrite(backwards, LOW);//Fermeture porte
delay(1000);// wait 30 seconds
digitalWrite(forwards, LOW);
digitalWrite(backwards, LOW);
digitalWrite(Light,LOW);
}

}

Edite ton code et met le entre balises </> sinon tu vas te faire engueuler. :slight_smile:

Autre chose, donne un nom facilement compréhensible a tes variables et fonction .
Je regarde ca tout a l'heure

Voici le code, j'ai viré pas mal de choses, il est minimaliste pas testé

 byte nb_boucles=0;  // comptage de nb boucles
   byte duree_boucle=20; // nombre de lecture a effectuer. plus le nombre est élevé  plus la précision de la moyenne  augmente 
long int total_ldr =0;   //  pour memoriser et faire la moyenne des lectures ldr


void setup() 
{
  //Put your setup code here, to run once:
  
}

void loop()

{   
 if (nb_boucles >duree_boucle)  // si le nombre de boucles est supérieur a la durée (nombre de lectures prevues) on rentre dans le test
  { 
    if ((total_ldr/nb_boucles) >=500) etat=jour; // si  total lecture ldr/nb_boucles ( soit la valeur moyenne) est supérieur ou egal a 500 il fait jour
     else   if ((total_ldr/nb_boucles) <=400)  etat=nuit; // si la moyenne est inférieur ou égal à 400 il fait nuit
             //        si la moyenne  est entre 400 et 500 on ne fait rien pour eviter l'effet yoyo.
             //  ces valeures sont a tester en situation réelle 
      total_ldr=0; // on re initialise le cumul des lectures ldr
      nb_boucles=0;  // on re initialisele nb de boucle a 0
}
 total_ldr=total_ldr+(analogRead(lecture_Ldr)); // ici on lit la ldr ( valeur entre 0 et 1023) et on la cumule aux valeurs lues précédemment. 
 nb_boucles++;  //on incremente le nombre de boucles. 
    
}  
 if (jour_ou_nuit != etat)     // y a t il eu un changement d'etat oui ? alors, 
                               // (etat est la situation precedente )
 {

   jour_ou_nuit = etat; // on memorise l'état actuel
    if (jour_ou_nuit==nuit)                   // on est passe de jour a nuit?
    { 
 
    baisse_trappe();   // oui, donc on baisse la trappe  et le reste
                                 
    }
    else 
    {
 
      monte_trappe(); // donc on est passé de nuit à jour
           
     }  delay(1000);   // on attend 1  seconde sinon ce serait trop rapide et la moyenne ne serai pas significative.  On peut  ( je dirait même, on doit!) Utiliser millis()  pour eviter le blocage de la loop .  On peu utiliser une valeur bcp plus grande que 1 seconde  pour augmenter la stabilité de la moyenne. 
    
 }

Le code original fonctionne tres bien sur etabli.

J'ai été trop long, message perdu :confused: , j'abrège..
Réponds à ton besoin d'assurer la mesure 5 mn et l'arrêt même si défaut de fin de course.
Non vérifié :

Plus de variables, avec des noms plus évocateurs pour ne jouer les actions qu'une fois, ce que je propose :

//hors fonction :
const int pinOuvrir = 12;
const int pinFermer = 7;
int pinPR = A0; //pin de connexion pour la photorésistance
int pinLampe = 6;
int valeur;
unsigned long chrono;
unsigned long attente = 300000;// 5 mn
unsigned long chronoMoteur;
unsigned long  dureeMoteur = 32000; // 32 secondes avec marge de sécurité
bool ouverture = 0;
bool finDeCourse;
bool fermeture = 0;
bool jour;

Dans le setup :
  valeur = analogRead(pinPR);
  if (valeur > 300)jour = true;
  else jour = false;

Dans le loop:

//ouverture
  if ((valeur > 300))
  {
    if (jour)// Après vérification
    {
      if (!ouverture)//commande éxécutée une seule fois
      {
        digitalWrite(pinOuvrir, LOW);//Ouverture porte
        ouverture = true;
        finDeCourse = false;
        chronoMoteur = millis();
      }

      if ((!finDeCourse) && ((millis() - chronoMoteur) > dureeMoteur))
      {
        digitalWrite(pinOuvrir, LOW);//arrête le moteur
        finDeCourse = true;
      }
    }
    else // encore la nuit
    {
      if ((millis() - chrono) > attente)
      {
        jour = true;//valide la mesure
        ouverture = false;// prochaine action
      }
      else chrono = millis();//remets le compteur à zéro
    }
  }