Portier automatique pour poulailler

Bonjour,

Merci pour le retour. Si tu cherches un moteur et un encombrement minimal, je posterai demain des photos de mon montage. La porte fait 30x30 et pèse 75gr, elle est parfaitement inviolable (guidée par des rails verticaux en pvc) et le moteur pas à pas 28BYJ-48 suffit a l'actionner.
Le moteur est couplé à une bobine de fil vide de récup, car la course de fermeture et d'ouverture est très courte (32cm) et la bobine de fil offre un diamètre de 2cm ce qui va limiter le nombre de rotations à 4,5 pour actionner la trappe.
Je poste les photos dès demain. Merci.

La box une fois finie fait L.119 x l.35 x H.40
J'ai aussi de grandes portes car j'ai une race de grandes poules. La porte fait 45cm de haut et doit s'ouvrir d'autant.

V1 presque ok

J'effectue 2 ou 3 mise au point avant d'imprimer le modèle définitif.

Suite du boitier principal

Le positionnement des éléments est fini.

Je lance le print qui dure quasi 22h... Saint Patience merci :rofl:

image

tu a mis quelle taille de buse ?

0.4mm

OK, ça marche :wink:
merci !

J'ai reçu mon écran 128 * 64.
J'ai aussi reçu les modules I2C mais je me suis rendu compte d'une chose.



Ces modules sont parfait pour les écrans 16 * 2 ou 20 x 4 mais pour celui ci, il me manque visiblement 4 pins.

Auriez vous une idée de si ça pourrait quand même fonctionner ou s'il me faut impérativement trouver un module pour cet écran? Ici: https://amzn.eu/d/aJGHNOZ

Je ne peux pas brancher tous les pins de l'écran un a un sur l'arduino parce que je n'ai pas assez de pins restants de libre.

Merci !

Êtes vous même sûr que c’est compatible ?

Il faut regarder les fonctions des pins et ce à quoi sert le module…

Je cherche sur le net mais je ne trouve pas mon cas, c'est à dire CET écran et CE module... En revanche, les 4 derniers pins sur l'écran ne semblent pas être utilisés dans la majorité des cas que j'ai pu voir.

Ce module sert à la communication entre écran et arduino, ça évite de brancher tout les pins 1 a 1 sur le arduino et donc d'en utiliser que 2..

EDIT: J'ai trouvé ça:

bon c'est une bonne nouvelle si c'est le même écran vous avez la correspondance des pins à souder et ça a l'air d'être dans le bon ordre en plus

Petite MàJ du projet.

Boitier réimprimé. Changement de couleur et quelques modifs de l'emplacement des trous pour l'alim des moteurs, l'alim générale et l'arrivée des fils pour les capteurs externes + l'embout mini USB sur le coté.

J'ai finalement installé un 20x4 comme sur l'autre projet (la mangeoire) à la place du 12864 que j'ai reçu la semaine dernière, auquel il me faudrait en fait rajouter un module vraiment compatible (pas celui que j'ai vu sur le tuto) pour pouvoir utiliser pleinement tout l'écran. Le module est très dur a trouver et est aussi cher voir plus que l'écran 20x4 avec le module I2C déjà installé dessus. Donc mon choix à été vite fait et au final, j'arrive quand même a afficher les infos que je désire.

Plus qu'a:

  • attendre que le capot finisse de s'imprimer pour installer l'écran et les 2 boutons pour commander la fermeture manuelle des portes.
  • câbler les interrupteurs
  • câbler les capteurs
  • imprimer les boitiers pour chaque moteur
  • modéliser des petits supports pour les capteurs magnétiques et les imprimer
  • d'autres choses que j'oublie sûrement à l'instant T

to be continued...

Aussitôt fini d'imprimer:

Sur secteur:

Sur batterie:

4 Likes

J'ai eu un soucis sur la boite. Les "murs" se décollaient du fond. J'ai décidé d'en re-imprimer une en changeant des choses.

Renforts sur les côtés, trous de fixations a l'extérieur, boite un peu plus grande pour avoir de la place a l'intérieur. Au final, tout compact ne sert pas a grand chose. Et upgrade sur le moyen de fermeture. Jusqu'ici j'avais fait avec des encoches. Là, j'ai ajouté 4 inserts dans lesquels je visserai directement le capot.

Le boitier est fini (après des heures et des heures d'impression).

Le capot est en cours.

J'attends aussi des connecteurs 3 broches pour les capteurs.

A suivre, j'espère l'installation bientôt !

1 Like

Projet Portier poulailler v2 = CHECK !

Mon plus gros jusqu'a présent, car hormis la corde et les rails de guidage de porte, tout est home made.

L'imprimante 3D m'a grandement facilité l'intégration des composants.

Vue générale

Vue connecteurs + boite basse

Vue boitier + infos

Vue porte enclos

Zoom moteur 12v 100rpm

Vue capteurs + boite de branchement

Vue porte poulailler

Vue capteurs + boite de branchement

Vue moteur 12v 100rpm

Une maj du capot avec ajout de boutons (quantité pas encore définie) pour le réglage du décalage de la fermeture et la mise a l'heure manuelle est envisagée. D'ou le placement des boutons de fermeture forcée de chacune des portes, en bas du capot. Je ne sais pas encore comment m'y prendre, mais j'y réfléchis !

2 Likes

merci pour les photos :slight_smile: et pour le partage

1 Like

Super ! :slightly_smiling_face: Bravo à toi pour ce projet.

1 Like

Merci!

J'oubliai le plus important

#include <LiquidCrystal_I2C.h>
#include <Dusk2Dawn.h>
#include <EEPROM.h>
#include <Wire.h>
#include <math.h>
#include <RTClib.h>

int switchEnclos        = A0;
int switchPoulailler    = A1;

int in1Poulailler       = 4;
int in2Poulailler       = 5;
int in3Enclos           = 6;
int in4Enclos           = 7;

int downSensorClose1    = 10;
int upSensorOpen2       = 11;
int downSensorClose3    = 8;
int upSensorOpen4       = 9;

RTC_DS3231 rtc;
Dusk2Dawn maison(43.9163881, 1.357439, +1);
LiquidCrystal_I2C lcd(0x27,20,4);

DateTime now;
int sunrise;
int sunset;
int timeStamp;
int timeStampLeverPoulailler;
int timeStampCoucherPoulailler;
int timeStampLeverEnclos;
int timeStampCoucherEnclos;
int hiverEte = 60;
//int hiverEte = 0;
int decalageSoirPoulailler = hiverEte - 10;
int decalageSoirEnclos = hiverEte - 5;
int decalageMatinEnclos = hiverEte - 5;
int hOuverturePoulailler;
int mOuverturePoulailler;
int hFermeturePoulailler;
int mFermeturePoulailler;
int hOuvertureEnclos;
int mOuvertureEnclos;
int hFermetureEnclos;
int mFermetureEnclos;
int deltaRTC = 4;
const bool debug = false;

void setup() {
  Serial.begin(9600);
  pinMode(in1Poulailler, OUTPUT);
  pinMode(in2Poulailler, OUTPUT);
  pinMode(in3Enclos, OUTPUT);
  pinMode(in4Enclos, OUTPUT);
  pinMode(downSensorClose1, INPUT);
  pinMode(upSensorOpen2, INPUT);
  pinMode(downSensorClose3, INPUT);
  pinMode(upSensorOpen4, INPUT);
  pinMode(switchPoulailler, INPUT_PULLUP);
  pinMode(switchEnclos, INPUT_PULLUP);

  rtc.begin();
  lcd.init();
  
  if (debug){
      Serial.println("Démarrage. MàJ du RTC.");
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  else if (!debug){
      Serial.println("Démarrage. Pas de MàJ du RTC. Heure et date à contrôler!");
  }
}

void loop() {
  now = rtc.now();
  sunrise = maison.sunrise(now.year(), now.month(), now.day(), true);
  sunset = maison.sunset(now.year(), now.month(), now.day(), true);
  timeStamp = ((now.hour()) * 60) + ((now.minute() + 1));
  timeStampLeverPoulailler = sunrise - hiverEte;
  timeStampCoucherPoulailler = sunset - decalageSoirPoulailler;
  timeStampLeverEnclos = sunrise - decalageMatinEnclos;
  timeStampCoucherEnclos = sunset - decalageSoirEnclos;
    
  displayLCD();
  hourCalculation();
    
//  checkAll();

  if ((timeStamp >= timeStampLeverPoulailler && timeStamp <= timeStampCoucherPoulailler) && digitalRead(upSensorOpen2) == 0){
      ouverturePoulailler();
  }
  else if (((timeStamp < timeStampLeverPoulailler || timeStamp > timeStampCoucherPoulailler) || digitalRead(switchPoulailler) == 0) && digitalRead(downSensorClose1) == 0){
      fermeturePoulailler();
  }

  if ((timeStamp >= timeStampLeverEnclos && timeStamp <= timeStampCoucherEnclos) && digitalRead(upSensorOpen4) == 0){
      ouvertureEnclos();
  }
  else if (((timeStamp < timeStampLeverEnclos || timeStamp > timeStampCoucherEnclos) || digitalRead(switchEnclos) == 0) && digitalRead(downSensorClose3) == 0){
      fermetureEnclos();
  }   
}

void displayLCD(){
  if (timeStamp < timeStampLeverPoulailler || timeStamp > timeStampCoucherPoulailler){
    lcd.noBacklight();
  }
  else{
    lcd.backlight();
  }
  
  lcd.setCursor(0, 0);
  if (now.day() < 10){
    lcd.print("0");
  }
  lcd.print(now.day());
  lcd.print("/");
  if (now.month() < 10){
    lcd.print("0");
  }
  lcd.print(now.month());
  lcd.print("/");
  lcd.print(now.year());
  lcd.setCursor(12, 0);
  if (now.hour() < 10){
    lcd.print("0");
  }
  lcd.print(now.hour()); 
  lcd.print(":");
  if (now.minute() < 10){
    lcd.print("0");
  }
  lcd.print(now.minute()); 
  lcd.print(":");
  if (now.second() < 10){
    lcd.print("0");
  }
  lcd.print(now.second());

  lcd.setCursor(0,1);
  lcd.print("Temp:");
  lcd.setCursor(14, 1);
  lcd.print(rtc.getTemperature() - deltaRTC);
  lcd.print("C");

  lcd.setCursor(0, 2);
  lcd.print("Poules:");
  lcd.setCursor(8, 2);
  if (hOuverturePoulailler < 10){
    lcd.print("0");
  }
  lcd.print(hOuverturePoulailler);
  lcd.print(":");
  if (mOuverturePoulailler < 10){
    lcd.print("0");
  }
  lcd.print(mOuverturePoulailler);
  lcd.setCursor(15, 2);
  if (digitalRead(switchPoulailler) == 1){
    lcd.print(hFermeturePoulailler);
    lcd.print(":");
    if (mFermeturePoulailler < 10){
      lcd.print("0");
    }
    lcd.print(mFermeturePoulailler);
  }
  else if(digitalRead(switchPoulailler) == 0){
    lcd.print("FORCE");
  }
  
  lcd.setCursor(0, 3);
  lcd.print("Enclos:");
  lcd.setCursor(8, 3);
  if (hOuvertureEnclos < 10){
    lcd.print("0");
  }
  lcd.print(hOuvertureEnclos);
  lcd.print(":");
  if (mOuvertureEnclos < 10){
    lcd.print("0");
  }
  lcd.print(mOuvertureEnclos);
  lcd.setCursor(15, 3);
  if(digitalRead(switchEnclos) == 1){
    lcd.print(hFermetureEnclos);
    lcd.print(":");
    if (mFermetureEnclos < 10){
      lcd.print("0");
    }
    lcd.print(mFermetureEnclos);
  }
  else if(digitalRead(switchEnclos) == 0){
    lcd.print("FORCE");
  }
}

void hourCalculation(){
    hOuverturePoulailler = (timeStampLeverPoulailler / 60);
    mOuverturePoulailler = (timeStampLeverPoulailler % 60);
    hFermeturePoulailler = (timeStampCoucherPoulailler / 60);
    mFermeturePoulailler = (timeStampCoucherPoulailler % 60);
    hOuvertureEnclos = (timeStampLeverEnclos / 60);
    mOuvertureEnclos = (timeStampLeverEnclos % 60);
    hFermetureEnclos = (timeStampCoucherEnclos / 60);
    mFermetureEnclos = (timeStampCoucherEnclos % 60);
}

void ouvrePoulailler() {
  digitalWrite(in1Poulailler,0);
  digitalWrite(in2Poulailler,1);
  Serial.println("P1 Enroule");
}
void fermePoulailler() {  
  digitalWrite(in1Poulailler,1);
  digitalWrite(in2Poulailler,0);
  Serial.println("P1 Déroule");
}

void ouvreEnclos() {
  digitalWrite(in3Enclos,0);
  digitalWrite(in4Enclos,1);
  Serial.println("P2 Enroule");
}
void fermeEnclos() {  
  digitalWrite(in3Enclos,1);
  digitalWrite(in4Enclos,0);
  Serial.println("P2 Déroule");
}

void ouverturePoulailler(){
  while(digitalRead(upSensorOpen2) == 0){
    Serial.println("Ouverture");
    ouvrePoulailler();
  }
  delay(650);
  Serial.println("Coupure alimentation moteur");
  arretPoulailler();
}
void fermeturePoulailler(){
  while(digitalRead(downSensorClose1) == 0){
    Serial.println("Fermeture"); 
    fermePoulailler();
  }
  delay(500);
  Serial.println("Coupure alimentation moteur");
  arretPoulailler();

  while(digitalRead(switchPoulailler) == 0){
    Serial.println("Maintien du poulailler fermé à cause de l'interrupteur.");
    delay(500);
  }
}

void ouvertureEnclos(){
  while(digitalRead(upSensorOpen4) == 0){
    Serial.println("Ouverture");
    ouvreEnclos();
  }
  delay(610);
  Serial.println("Coupure alimentation moteur");
  arretEnclos();
}
void fermetureEnclos(){
  while(digitalRead(downSensorClose3) == 0){
    Serial.println("Fermeture"); 
    fermeEnclos();
  }
  delay(500);
  Serial.println("Coupure alimentation moteur");
  arretEnclos();

  while(digitalRead(switchEnclos) == 0){
    Serial.println("Maintien de l'enclos fermé à cause de l'interrupteur.");
    delay(500);
  }
}

void arretPoulailler() {  
  digitalWrite(in1Poulailler,0);
  digitalWrite(in2Poulailler,0);
  Serial.println("Alimentation Poulailler Off");
}
void arretEnclos() {  
  digitalWrite(in3Enclos,0);
  digitalWrite(in4Enclos,0);
  Serial.println("Alimentation Enclos Off");
}

void checkSwitchs(){
  if (digitalRead(switchPoulailler) == 0){
    Serial.print(digitalRead(switchPoulailler));
    Serial.println(" - Switch poulailler appuyé");      
  }
  else{
    Serial.print(digitalRead(switchPoulailler));
    Serial.println(" - Switch poulailler relaché");      
  }
  if (digitalRead(switchEnclos) == 0){
    Serial.print(digitalRead(switchEnclos));
    Serial.println(" - Switch enclos appuyé");      
  }
  else{
    Serial.print(digitalRead(switchEnclos));
    Serial.println(" - Switch enclos relaché");  
  }
  delay(1000);
}

void checkDoors(){
  Serial.print("capteur poulailler haut  ");
  Serial.println(digitalRead(upSensorOpen2));
  Serial.print("capteur poulailler bas  ");
  Serial.println(digitalRead(downSensorClose1));
  Serial.print("capteur enclos haut  ");
  Serial.println(digitalRead(upSensorOpen4));
  Serial.print("capteur enclos bas  ");
  Serial.println(digitalRead(downSensorClose3));
  Serial.println(" ");
  delay(3000);
}

void checkDateHeure(DateTime now){
  Serial.print("Date: ");
  Serial.print(now.day());
  Serial.print('/');
  Serial.print(now.month());
  Serial.print('/');
  Serial.print(now.year());
  Serial.print(" | Heure: ");
  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.print(now.second());
  Serial.println();
}

void checkSunsetSunriseTimeStamp(DateTime now){
  Serial.print("Sunrise: ");
  Serial.print(sunrise);
  Serial.print(" - Sunset: ");
  Serial.print(sunset);
  Serial.print(" - timeStamp: ");
  Serial.print(timeStamp);
  Serial.println();
}

void checkAll(){
  checkSwitchs();
  checkDoors();
  checkDateHeure(now);
  checkSunsetSunriseTimeStamp(now);
  Serial.println("");
  delay(3000);
}
1 Like

La porte est bien pensée.
Les capteurs sont placés plus haut qu'auparavant, ce qui protège les fils des coups de becs.
Le bas de la porte en position basse est hors d'atteinte des griffes d'un prédateur qui essaierait de la soulever, grâce à la fente au sol.

récemment dans ma famille ils ont retrouvé le poulailler vide avec pleins de plumes réparties sur le sol... En premier lieu la réaction a été de penser à un renard ou une fouine qui passait par là, puis à y regarder de plus près les oeufs avaient aussi disparu du pondoir - y compris les oeufs en bois et il n'y avait pas une seule trace de sang et aucune plume dans l'abri et le loquet du grillage était refermé... ➜ On pense plutôt à un prédateur à deux pattes...