Porte automatique pour poulailler

Bonjour et Bonne Année à tous,

Je poste la dernière version du code pour mon projet de porte automatique de poulailler.
Ce code est allégé et simplifié car on utilise un moteur pas à pas (28BYJ-48 5V) pour piloter la porte guillotine au lieu d’un moto-réducteur
Plus de fin de course mais un mode étalonnage pour déterminer la longueur de course de la porte.
Les heures de fermetures et d’ouverture sont toujours calculées par rapport au levé et couché du soleil.(plus de cellule photo-résistance)
Les inconvénients de ce nouveau code sont qu’il n’y a plus de détection d’anomalie de fermeture (plus de fin de course) et que l’ensemble consomme plus de courant avec le maintient sous tension du module ULN2003.

Composants nécessaires

  • Arduino uno
  • Tiny RTC
  • Moteur Pas à Pas 28BYJ-48 5V
  • Module pilotage Moteur ULN2003
  • Convertisseur DC-DC 12V-5V

A bientôt.

Poulailler_4.ino (33.3 KB)

Bonsoir, et bonne année à tous, on peu dire a mon niveau, waou ça c'est un travail approfondis, je vais maintenant essayer d'en comprendre un petit peu , bon travail superbe.

Bonjour je suis en dernière année secondaire et je compte faire votre projet en travail de fin d'étude j'aurai besoin de quelque information supplémentaire pourrions-nous parler via mail ou autre voici mon mail: norman14@live.fr

Bonjour,

Je vous ai directement répondu par mail. Aucun problème pour répondre à vos questions.

Bonjour,

c'est un super projet que tu nous présente là ! j'aimerais savoir comment l'adapter à un arduino pro mini ?

Bonjour,

Pour le code, je ne vois pas ce qui bloquerai son bon déroulement sur Arduino pro mini car le fonctionnement d'une Arduino pro mini est quasiment identique à un arduino uno sauf qu'il n'y a pas l'interface de communication USB pour la programmation et le mode débug en liaison série. Si après programmation on supprime la carte de communication pour conserver que "Arduino pro mini", il sera difficile de la mettre à l'heure ou de passer en mode debug.. Pour les projets qui n'utilisent pas d'horloge mais juste un détection de seuil lumineux l'Arduino pro mini est intéressante car une fois le programme au point, il n'y a plus besoin d'accéder à la carte. Elle est autonome. A voir...

Bonjour,
je pense ajouter une gestion des heures,pour cela j’ai opté pour un rtc ic2 1307,
tout se passe bien pour la lecture , sauf au niveau de ma variable “mois”, il semble que cette variable ne marche pas, je voudrai le chiffre du mois en décimal.
En fait comment placer et écrire les données de date et d’heures dans des variables…

exemple : si avril alors retirer 180 secondes à l’ouverture
si mai alors retirer 360 secondes à l’ouverture…etc
comme cela la porte s’ouvre de plus en plus tôt.

j’ai mis des //****************** (pour ce qui concerne la variable “mois” )

Bonne soirée.

#include <RTClib.h>
#include <Wire.h>

RTC_DS1307 RTC; //Classe RTC_DS1307

const char ledbleu = 2; // variable broche 2 (vraie), Une LED bleu  pour détection crépuscule, s'il fait sombre
const char fermeture = 7;  // variable pour broche 7 (vraie), pour fermer porte
const char capteur = 0; // broche A0 sur laquelle va être connecté le pont diviseur de tension

float tension = 0;             // variable qui va enregistrer la tension lue en sortie du capteur
float seuilObscurite = 4.2;    // valeur en V, seuil qui détermine le niveau auquel l'obscurité est présente
float seuilLumonisite = 4;    // valeur en V, seuil qui détermine le niveau auquel la luminosité est présente
boolean PorteFermee = false;  // statut de la porte ou démarre toujours le programme porte ouverte
int mois = 4;  //********************************

void setup()
{
  // définition des broches utilisées
  pinMode(ledbleu, OUTPUT);
  pinMode(fermeture, OUTPUT);
  digitalWrite(ledbleu, HIGH);
  digitalWrite(fermeture, HIGH);
  Serial.begin(57600); // la voie série pour monitorer
  Wire.begin(); //Démarrage de la librairie wire.h
  RTC.begin(); //Démarrage de la librairie RTClib.h

 
  
  //Si RTC ne fonctionne pas
  if (! RTC.isrunning()) {
    Serial.println("RTC ne fonctionne pas !");
   
    //Met à l'heure à date à laquelle le sketch est compilé
    RTC.adjust(DateTime(__DATE__, __TIME__));
    //Cela fonctionne également :
    //RTC.adjust(DateTime("Dec  5 2012","12:00:00"));
    //RTC.adjust(DateTime(2014, 1, 21, 3, 0, 0));
    }
  }
void loop()
{
  //Affichage de l'heure
  DateTime now = RTC.now();
  //Serial.print(now.day(), DEC);
  //Serial.print('/');
  Serial.println(now.month(), DEC);
  
   mois == now.month();   //*******************
   Serial.println(mois);   //**********************
  Serial.print('/');
  Serial.print(now.year(), DEC); 
  Serial.println(' ');
  //Serial.print(now.hour(), DEC);
  //Serial.print(':');
  //Serial.print(now.minute(), DEC);
  //Serial.print(':');
//  Serial.print(now.second(), DEC);
 // Serial.println();
  //delay(3000);
  // conversion de cette valeur en tension
  tension = (analogRead(capteur) * 5.0) / 1024;

  if ((tension >= seuilObscurite) && !PorteFermee) //Pour FERMETURE
  {
   
    digitalWrite(ledbleu, LOW);             // detection seuil obscurité On allume la LED bleu
    delay(4000);                            // délai pour ne fermer porte que aprés 4 minutes ( 240 000) pour essais 4sec =4000

    digitalWrite(fermeture, LOW);                           //  On ferme la porte apres x secondes
    digitalWrite(ledbleu, HIGH);                           // On éteint la LED bleu
    PorteFermee = true;
    Serial.print(" PorteFermee=  ");
    Serial.println(PorteFermee);
  }

  if ((tension < seuilLumonisite) && PorteFermee) //Pour OUVERTURE   //*********************
  {
       if (mois == 4)                                                //**********************
  {
  Serial.println('avril');                                           //**********************
  delay(3);
  }
   
    delay(4000);//délai pour ouvrir la porte que aprés 4 minutes pour essais 4sec =4000
    digitalWrite(fermeture, HIGH); // on ouvre la porte
    PorteFermee = false;
    Serial.print(" PorteFermee=  ");
    Serial.println(PorteFermee);
  }

  // délai pour ne prendre des mesures que toutes les 60-secondes (60 000) cela évite les ouvertures en cas d'orage
  delay(500);// pour essais 1/2seconde=500

 
  //Serial.println(PorteFermee);
}

Bonjour,

Une petite erreur de syntaxe mois == now.month(); Le double "=" est un test d'égalité et non pas d'affectation. Un seul "=" est nécessaire.. Bonne journée

Bonjour, oui bien vu, j'ai changé et ça marche, j'avais aussi mis serial.print ('avril') entre simple guiements ce qui me donnais comme résultat : 26988 je ne sais pas pourquoi, peu être en hexa... merci beaucoup . Maintenant je vais ajouter des if pour une ouverture différé différente chaque mois en fonction du lever du jour.

Pourquoi je veux ça, c'est pour ouvrir le poulailler a des heures ou il y a déjà une activité dans les rues , ce qui je l’espère empêche le renard de venir....

Bonne journnée

bonjour,
voilà que je bloque à nouveau, je ne comprend pas la structure des if, j’en ai placé deux pour le mois 4 et le mois 5, et apparemment contre toute attente il passe au if 5…pourtant je suis au mois 4.

ci-dessous le code:

#include <RTClib.h>
#include <Wire.h>

RTC_DS1307 RTC; //Classe RTC_DS1307

const char ledbleu = 2; // variable broche 2 (vraie), Une LED bleu  pour détection crépuscule, s'il fait sombre
const char fermeture = 7;  // variable pour broche 7 (vraie), pour fermer porte
const char capteur = 0; // broche A0 sur laquelle va être connecté le pont diviseur de tension

float tension = 0;             // variable qui va enregistrer la tension lue en sortie du capteur
float seuilObscurite = 4.2;    // valeur en V, seuil qui détermine le niveau auquel l'obscurité est présente
float seuilLumonisite = 4;    // valeur en V, seuil qui détermine le niveau auquel la luminosité est présente
boolean PorteFermee = false;  // statut de la porte ou démarre toujours le programme porte ouverte
int mois = 0;  //********************************
float xtemp = 0;

void setup()
{
  // définition des broches utilisées
  pinMode(ledbleu, OUTPUT);
  pinMode(fermeture, OUTPUT);
  digitalWrite(ledbleu, HIGH);
  digitalWrite(fermeture, HIGH);
  Serial.begin(57600); // la voie série pour monitorer
  Wire.begin(); //Démarrage de la librairie wire.h
  RTC.begin(); //Démarrage de la librairie RTClib.h

 
  
  //Si RTC ne fonctionne pas
  if (! RTC.isrunning()) {
    Serial.println("RTC ne fonctionne pas !");
   
    //Met à l'heure à date à laquelle le sketch est compilé
    RTC.adjust(DateTime(__DATE__, __TIME__));
    //Cela fonctionne également :
    //RTC.adjust(DateTime("Dec  5 2012","12:00:00"));
    //RTC.adjust(DateTime(2014, 1, 21, 3, 0, 0));
    }
  }
void loop()
{
  //Affichage de l'heure
  DateTime now = RTC.now();
  Serial.print(now.day(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  
   mois = now.month(), DEC;   //*******************
   //Serial.println(mois);   //**********************
  Serial.print('/');
  Serial.print(now.year(), DEC); 
  Serial.print(' ');
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();
  //delay(3000);
  // conversion de cette valeur en tension
  tension = (analogRead(capteur) * 5.0) / 1024;

  if ((tension >= seuilObscurite) && !PorteFermee) //Pour FERMETURE
  {
   
    digitalWrite(ledbleu, LOW);             // detection seuil obscurité On allume la LED bleu
    delay(4000);                            // délai pour ne fermer porte que aprés 4 minutes ( 240 000) pour essais 4sec =4000

    digitalWrite(fermeture, LOW);                           //  On ferme la porte apres x secondes
    digitalWrite(ledbleu, HIGH);                           // On éteint la LED bleu
    PorteFermee = true;
    Serial.print(" PorteFermee=  ");
    Serial.println(PorteFermee);
  }

  if ((tension < seuilLumonisite) && PorteFermee) //Pour OUVERTURE   //*********************
  {
       if (mois = 4)                                                
  {                            
    xtemp = 40000;
  Serial.print(" avril = ");                                         
  Serial.println(mois);
Serial.print("xtemp = ");
Serial.println(xtemp);
                         
  }
         if (mois = 5)                                                
  {                       
    xtemp = 8000;
  Serial.print(" mai = ");                                         
  Serial.println(mois);
Serial.print("xtemp = ");
Serial.println(xtemp);
  }                   
   
    delay(xtemp);//délai pour ouvrir la porte que aprés xtemp secondes, pour essais 4sec =4000
    digitalWrite(fermeture, HIGH); // on ouvre la porte
    PorteFermee = false;
    Serial.print(" PorteFermee=  ");
    Serial.println(PorteFermee);
  }

  // délai pour ne prendre des mesures que toutes les 60-secondes (60 000) cela évite les ouvertures en cas d'orage
  delay(500);// pour essais 1/2seconde=500

 
  //Serial.println(PorteFermee);
}

bonsoir, autant pour moi ,j'ai fait la même erreur dans l'autre sens, pas mis == ,maintenant mes if fonctionnent tous correctement..

Bonsoir, Félicitations pour ce super et gros travail, bravo.

une suggestion, pour le problème de courant au repos du moteur pas à pas, j'ai fait des essais en mettant à 0 les 4 broches : digitalWrite(8,0); digitalWrite(9,0); digitalWrite(10,0); digitalWrite(11,0) , après une toute petite tempo pour être sûr que le moteur est arrêté, et ça fonctionne ! Je ne sais pas si ça pourrait être applicable à ton code.

autre question, serait-il possible d'utiliser le RTC DS1302 à la place du 1307 ? Merci

Bonjour, je suppose que pour le 1302 à la place du 1307, c'est oui, le 1302 est plus précis dérive -+ 2min par ans ,contre -+ 2 minutes par mois pour 1307..

La précision d'un DS1302 ou d'un DS1307 dépend totalement de son quartz. Si le module possède un quartz de piètre qualité, il dérivera plus. Et comme le montage n'est pas dans un local à température constante ...

Un DS3231 par contre a un oscillateur interne compensé en température.

Accuracy ±2ppm from 0°C to +40°C

Bonjour,

Effectivement les DS1302 / DS1307 dérivent dans le temps mais comme les poules n’ont pas de montre, une mise à l’heure tous les 6 mois est suffisant.
Pour couper l’alimentation sur un moteur pas à pas lors de la phase de repos, il faut être certain qu’il n’y a pas de glissement sinon, on perd le référentiel.
Si besoin, je pourrai poster une nouvelle version qui corrige quelques petits soucis…
A+

Bonsoir Etienne, une question de débutant en arduino, quel est l'intérêt d'utiliser I13 à la fois en entrée et en sortie, pourquoi ne pas utiliser I12 qui est disponible pour l'inter M/A ? Et cet inter, il est bien relié au +5V ?

Pour ma modeste contribution, voici les nouveaux liens : https://jean-paul-cornec.pagesperso-orange.fr/formule_rang.htm https://jean-paul-cornec.pagesperso-orange.fr/rang_des_jours.htm https://jean-paul-cornec.pagesperso-orange.fr/heures_lc.htm Merci A +

Bonjour à tous, J'ai téléchargé le programme sur mon arduino uno, inter sur i13 ouvert (i13 = +4,9V) test des fonctions : ouverture, arrêt et fermeture manuelle = ok (cde O, "espace", et F) test : étalonnage (cde E) la porte se ferme, cde E pour arrêter OK , après la porte devrait s'ouvrir, mais ce n'est pas toujours le cas. Cependant on peut l'ouvrir avec la cde O. test cycle (cde C) ok Nota le nb de pas est toujours arrondi ex : 3000 ou 4000 (je m'attendais à 3624 par exemple !) mais en gros pas de problème jusqu'ici

Après envoi cde T (debug) et là, je constate que l'heure et le jour ne sont pas corrects. Nota, j'ai testé le DS1307 avec un autre programme et il fonctionne bien. Les cdes D mise à l'heure et P get date semblent ne pas fonctionner. Alors je me dis que je ne dois pas suivre la bonne procédure pour l'utilisation de ce programme. Quelqu'un pourrait-il nous donner le mode d'emploi ? Merci

Bonjour,

Voici une version corrigée de la version V4 (moteur pas à pas).
De mémoire elle corrige la boulette sur l’entrée I13.
On a maintenant
I12 - Contact M/A
I13 - Led Arduino

Elle règle également le pb de remontée de la porte dans la phase d’étalonnage.
Si on veut plus de précision lors de l’étalonnage, il faut réduire le pas d’étalonnage.
Dans ce cas le temps d’étalonnage sera plus long.
Attention au format date à la saisie.

Si c’est la même bibliothèque qui est utilisée pour les tests du module DS1307 que celle qui est déclarée dans le programme, il n’a pas de raison que ça ne fonctionne pas…
Attention au changement d’heure… Après celui-ci, il faut mieux vérifier car j’ai eu des soucis mais sans trouver la cause.
Bon courage…

Poulailler_4.ino (34 KB)

Bonjour, merci pour cette version, J'ai dû apporter une petite modif à la ligne 245 (ajout de "= 1") sinon la mise à l'heure ne se faisait pas ligne 245 : void set_CLOCK(int Mode = 1)

est-ce que j'ai bien fait ????

Bjr,

Avec cette modification le paramètre qui est passé lors de l'appel de la fonction ne sert plus à rien. Le paramètre est forcé systématiquement à 1. Dans ce cas, le révérenciel de date est toujours la RTC.. Ce n'est pas gênant si elle fonctionne bien. A+