Portier automatique pour poulailler

Bonjour a tous! Nouveau ici et dans le monde de la programmation, je m'intéresse de prêt à la programmation et à la réalisation de mécanismes automatiques pour mes chères cocottes!

J'ai déjà réalisé un 1er projet que je présenterai plus tard parce que je compte le refaire maintenant que j'ai un peu plus d'expérience dans le domaine.

C'est donc un portier double pour mon poulailler que j'ai réalisé à l'aide d'un Arduino nano V3!

J'ai réalisé tout ça a l'aide de:

  • Arduino Nano v3
  • Support d'arduino
  • Rallonge interne usb
  • Un contrôleur L298N en H
  • Un RTC_DS3231
  • 4 capteurs magnétiques
  • 2 moteurs 12v high torque 50rpm
  • Une alim 12v 2A
  • Des boitiers étanches


Le système remplace le précédent, 2 boitiers du commerce. Sur piles ( 4x AA ) qui ne durent jamais plus de 6 mois et dérivent vachement dans le temps... (dans les boites en bois, pour éviter qu'ils n'aient trop froid l'hiver).

Le voilà à présent en place!



J'aimerai lui apporter quelques améliorations tels qu'un interrupteur par porte pour commander la fermeture manuelle forcée et pourquoi pas, un écran LCD qui afficherait l'heure, la date, l'état des portes ainsi que l'heure du couché et levé du soleil.

Au niveau du code, le arduino ouvre la porte du poulailler 10 minutes avant le sunrise et la ferme 30 minutes après le sunset. Il ouvre l'enclos au sunrise et la ferme 20 minutes après le sunset.

Au plaisir!

Comme vous postez dans le sous forum réalisations et projets finis, ce serait intéressant de poster aussi votre code est une description de votre solution…

Edit/ merci pour les ajouts !! :wink:

Excusez moi, j'ai été un peu vite pour créer le sujet.

Voici mon code. Je suis novice, soyez indulgents !

//***** Portier double poulailler *****//

//Bibliothèques inclues:
#include <Dusk2Dawn.h>
#include <EEPROM.h>
#include <Wire.h>
#include <math.h>
#include <RTClib.h>

// Définition moteurs:
int in1Poulailler     = 9;  //fil noir
int in2Poulailler     = 10; //fil blanc
int in3Enclos         = 11; //fil gris
int in4Enclos         = 12; //fil violet

// Définition capteurs:
int downSensorClose1  = 5;  //fil jaune
int upSensorOpen2     = 6;  //fil vert
int downSensorClose3  = 7;  //fil jaune
int upSensorOpen4     = 8;  //fil vert

// Définition interrupteurs:
//int switch1Open       = 3;  //fil blanc
//int switch1Close      = 4;  //fil bleu
//int switch2Open       = 1;  //fil jaune
//int switch2Close      = 0;  //fil vert

// Définition module heure temps réel:
RTC_DS3231 rtc;

//Locatlisation GPS et fuseau horaire pour la bibliothèque dusk2dawn
Dusk2Dawn Lieux(lat, long, +1);

// Déclarations variables:
DateTime now;
int sunrise;
int sunset;
int currentTime;

// MàJ du module RTC à chaque nouvelle connexion. 
// à mettre sur "false" après avoir téléversé sur "true" pour éviter une maj suite à une coupure de courant. 
// Déclaration d'une constante
const bool debug = true;

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(switch1Open, INPUT);
//  pinMode(switch1Close, INPUT);
//  pinMode(switch2Open, INPUT);
//  pinMode(switch2Close, INPUT);

  rtc.begin();
    if (debug){
      Serial.println("Démarrage. Vérification et ajustement du RTC");
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    }
    else if (!debug){
      Serial.println("Démarrage. Vérification mais pas d'ajustement du RTC");
    }
}

void loop() {
  delay(1000);
  now = rtc.now();
  sunrise = Lieux.sunrise(now.year(), now.month(), now.day(), true);
  sunset = Lieux.sunset(now.year(), now.month(), now.day(), true);
  
  currentTime = ((now.hour()) * 60) + (now.minute());

  afficheHeure(now);
//  afficheSunsetSunriseCurrentTime(now);
//  controlSensor();
  
    if (currentTime >= sunrise - 10 && currentTime <= sunset + 30 && digitalRead(upSensorOpen2) == 0){
      openDoorPoulailler();
    } 
      else if (currentTime < sunrise - 10 || currentTime > sunset + 30 && digitalRead(downSensorClose1) == 0){
        closeDoorPoulailler();
      }

    if (currentTime >= sunrise && currentTime <= sunset + 20 && digitalRead(upSensorOpen4) == 0){
      openDoorEnclos();
    }
      else if (currentTime < sunrise || currentTime > sunset + 20 && digitalRead(downSensorClose3) == 0){
        closeDoorEnclos();
      }
}

void doorPoulaillerOpen(){
  digitalWrite(in1Poulailler, 0);
  digitalWrite(in2Poulailler, 1);
}
void doorEnclosOpen(){
  digitalWrite(in3Enclos, 0);
  digitalWrite(in4Enclos, 1);
}

void doorPoulaillerClose(){
  digitalWrite(in1Poulailler, 1);
  digitalWrite(in2Poulailler, 0);
}
void doorEnclosClose(){
  digitalWrite(in3Enclos, 1);
  digitalWrite(in4Enclos, 0);
}

void doorPoulaillerStop(){
  digitalWrite(in1Poulailler, 0);
  digitalWrite(in2Poulailler, 0);
}
void doorEnclosStop(){
  digitalWrite(in3Enclos, 0);
  digitalWrite(in4Enclos, 0);
}

void afficheHeure(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 afficheSunsetSunriseCurrentTime(DateTime now){
  Serial.print("Sunrise: ");
  Serial.print(sunrise);
  Serial.print(" - Sunset: ");
  Serial.print(sunset);
  Serial.print(" - currentTime: ");
  Serial.print(currentTime);
  Serial.println();
}

void controlSensor(){
  Serial.print("Poulailler haut/bas: ");
  Serial.print(digitalRead(upSensorOpen2));
  Serial.print('/');
  Serial.print(digitalRead(downSensorClose1));
  Serial.print(" | Enclos haut/bas): ");
  Serial.print(digitalRead(upSensorOpen4));
  Serial.print('/');
  Serial.print(digitalRead(downSensorClose3));
  Serial.println();
}

void openDoorPoulailler(){
  Serial.println("La porte du poulailler s'ouvre");
  while (digitalRead(upSensorOpen2) == 0){
    doorPoulaillerOpen();
  }
  Serial.println("La porte du poulailler est ouverte, elle s'arrête");
  doorPoulaillerStop();
}
void closeDoorPoulailler(){
  Serial.println("La porte du poulailler se ferme");
  while (digitalRead(downSensorClose1) == 0){
    doorPoulaillerClose();
  }
  Serial.println("La porte du poulailler est fermée, elle s'arrête");
  delay(500);
  doorPoulaillerStop();  
}

void openDoorEnclos(){
  Serial.println("La porte de l'enclos s'ouvre");
  while (digitalRead(upSensorOpen4) == 0){
    doorEnclosOpen();
  }
  Serial.println("La porte de l'enclos est ouverte, elle s'arrête");
  delay(1000);
  doorEnclosStop();
}
void closeDoorEnclos(){
  Serial.println("La porte de l'enclos se ferme");
  while (digitalRead(downSensorClose3) == 0){
    doorEnclosClose();
  }
  Serial.println("La porte de l'enclos est fermée, elle s'arrête");
  delay(500);
  doorEnclosStop();
}

J'ai également commencé à écrire les fonctions pour l'affichage sur le lcd. J'ignore si ça marchera :smile:

Pas de souci - merci pour le partage !

Si vous postez assez vous pourrez ajouter plus d’images et liens - le forum restreint ce que peuvent faire les nouveaux comptes pour éviter le spam

Effectivement, j'ai pu ajouter d'autres photos!

Joli montage !

Bonjour, il me semble que les 2A de votre source d'alimentation peuvent être pas suffisant.

Vous pensez? Le système marche pourtant... Les deux moteurs ne sont pas actifs en même temps, jamais. C'est toujours un après l'autre... Et je pense que ce sont eux qui ont le plus besoin de puissance.

Je ne connais pas votre modèle de moteur, mais j'utiliserais 5A.

Ce sont ceux là, en 12v 50rpm. Pas plus de description sur le site...

Moteurs 12v 50rpm

1.2 A, trop proche de 2A, j'utiliserais 5A avec un fusible lent.

Selon mes données, ce moteur consomme au maximum 0,65 A et @ryugami dit qu'ils ne fonctionnent jamais en même temps. Et même s'ils fonctionnaient en même temps, on aurait une consommation de 1,3A, tout à fait admissible pour une source 2A. L'alimentation du projet est correctement dimensionnée telle quelle.

Si vous ne les connaissez pas, quel est le fondement de votre commentaire ??

Ça me rassure. Merci !

Tout à fait. Ces moteurs sont connus sur AliExpress, et DigiKey les distribue. Voici la datasheet :
JGA25-370

Merci pour cette fiche tech.

Retour après presque 10 jours d'instal, RAS.

Le ds3231 dérive beaaaaaaaaaucoup moins que le ds1307 que j'ai dans mon 1er DIY.

J'avance sur le code pour l'affichage du lcd...

Je regarde aussi en parallèle pour intégrer une alim batterie 12v rechargée par panneau solaire en cas de coupure de courant longue. je voudrais que si coupure → switch sur la batterie et si courant revient → switch sur alim classique.

Il existe des cartes d'alimentation par batterie. Par exemple :
https://fr.aliexpress.com/item/32742598051.html?spm=a2g0s.9042311.0.0.4e146c37WrjEHc
J'ai testé cette carte ici :

Voir paragraphe 2.7
Il faut que le montage consomme 50mA au minimum, sinon la carte coupe sa sortie au bout de 60 secondes. Si ce n'est pas le cas, on peut s'arranger pour que l'ARDUINO provoque une petite surconsommation dans une résistance, toutes les 40 à 50 secondes.

Le solaire me parait inutile. Autant recharger la batterie avec l'alimentation 12V, abaissée à 5V à l'aide d'un régulateur STEP-DOWN.

Oh oui, j'ai même troué mieux après quelques recherches. L'alim UPS semble le meilleur choix.

Je pense partir sur ça. C'est simple et, il me semble, suffisant.

Il me faut du 12v pour les moteurs. En fait mon alim n'alimente pas de suite le arduino. Elle arrive dans le contrôleur L298N, qui lui prend le 12v et à une sortie 5v. C'est de lui que part l'alim 5v pour le Nano

Oui c'est vrai il te faut du 12V.
J'avais fait ce powerbank 12V 1,2A l'année dernière avec une LIPO 10000mAH de récup :

Si 1,2A ne suffisent pas, on peut remplacer le convertisseur FP6293 par un SX1308 ou un MT3608 pour obtenir 2A.

Pour rester dans le DIY :wink:

Bonjour a tous ceux qui suivent ce post.

Je vais ajouter 2 boutons pour contrôler la fermeture de la porte manuellement pendant le cycle où elle est ouverte.

Sur internet, je vois de tout. Des montages avec des résistances 10kOhms et d'autres montage sans.

Quel est l'intérêt de ces résistances?

Merci !