Progression de l’article :

Trappe automatique pour poulailler

Lors du premier mois de confinement, avec mon père nous voulions réaliser une trappe automatique qui s’ouvre au lever du jour et se ferme la nuit tombée (les poules sont autonomes et rentrent seules quand l’obscurité arrive). Dans un premier temps, mon père s’est occupé d’enlever le grillage présent sur la porte du poulailler pour y mettre une tôle en aluminium avec une ouverture pour la trappe et d’y ajouter un moteur de lève-vitre.

Ensuite, il fallait s’occuper de la partie autonome et électrique. Une contrainte : pas de source d’alimentation électrique au niveau du poulailler. Pour cela, nous sommes partis sur une batterie de 12 Volts. Nous avons installé deux fins de course, une en haut et une en bas pour arrêter le moteur. Dans un premier temps, nous avions mis un simple bouton pour ouvrir et fermer la trappe, mais nous voulions que cela soit autonome. Pour cela, j’ai décidé d’utiliser une carte Arduino, un Pont en H (L298N), une photorésistance (pour connaître le taux de luminosité dehors), des boutons (pour basculer du mode automatique au mode manuel), des leds (pour connaître l’état de la trappe et du mode choisi) et deux potentiomètres (pour régler la valeur jour et la valeur nuit).

Ensuite, après de nombreux tests en intérieur, quelques cartes L298N qui ont cramé, et de nombreux ajouts de sécurité/contrôle : nous avons réalisé les tests en conditions réelles. Aujourd’hui tout fonctionne très bien, seulement la batterie ne tient que quelques jours car la carte arduino tourne continuellement. Dans les jours à venir, une tranchée sera faite pour faire venir l’électricité et l’eau au poulailler.

Réalisé pendant le premier mois de confinement (23 mars au 10 avril 2020)

Code arduino

#define DELAY 1000
#define VIN 5 
#define R 10000 
//Variables
int sensorVal;
int lux; //Lux value
int valeur = 0;
int haut; //Fin de course haut
int bas; //Fin de course bas
int ledJour; //Led verte
int ledNuit; //Led rouge
int ledBleu; //Led quand le programme est éteint
int boutonArret; //Bouton arret programme jour/nuit
int moteur1;//controle le sens de rotation du moteur
int moteur2;//controle le sens de rotation du moteur
int port = A0; //port de la photorésistance
int boutonManuelHaut;
int boutonManuelBas;
int valeurNuit;
int valeurNuitMarge;
int valeurJour;
int valeurJourMarge;
int trappeManuelHaut = 0;
int trappeManuelBas = 0;
int trappeAutoHaut = 0;
int trappeAutoBas = 0;
int erreur = 0;
int trappeErreurHaut = 0;

void setup() {
  haut = 13; //HIGH et LOW sont inverser : HIGH = LOW et LOW = HIGH
  bas = 11;
  ledNuit = 2;
  ledJour = 4;
  ledBleu = 7;
  moteur1 = 5;
  moteur2 = 6;
  boutonManuelHaut = 8;
  boutonManuelBas = 9;
  boutonArret = 12;
  pinMode(haut,INPUT);
  pinMode(bas,INPUT);
  pinMode(boutonArret,INPUT);
  pinMode(boutonManuelHaut,INPUT);
  pinMode(boutonManuelBas,INPUT);
  pinMode(ledNuit, OUTPUT);
  pinMode(ledJour, OUTPUT);
  pinMode(ledBleu, OUTPUT);
  pinMode(moteur1, OUTPUT);
  pinMode(moteur2, OUTPUT);
  Serial.println ("Test programe");
  Serial.begin(9600);
}
void loop() {
  
valeurJour=analogRead(A1);
Serial.print("Valeur jour : ");
Serial.println(valeurJour);
valeurNuit=analogRead(A2);
Serial.print("Valeur nuit : ");
Serial.println(valeurNuit);
Serial.print(F("Valeur sensor : "));
Serial.println(valeur);
valeurNuitMarge = valeurNuit - 10;
valeurJourMarge = valeurJour - 10;
valeur = analogRead(port);
  lux=sensorRawToPhys(valeur);
//Commande auto
if (digitalRead(boutonArret) == LOW) 
  { 
  digitalWrite(ledBleu, LOW);
  //Quand il fait jour
  if(valeur > valeurJour && erreur == 0)
    {
      Serial.println("Il fait jour");
      if (digitalRead(bas) == HIGH) //si la trappe est en bas
        {
          Serial.println("Trappe en bas");
          if(digitalRead(haut) == HIGH)
            {
              Serial.println("Monter"); 
              digitalWrite(ledNuit, LOW);
              digitalWrite(moteur1, HIGH);
              digitalWrite(moteur2, LOW);
              trappeAutoHaut = 1;
            }
         }
      }
   if (digitalRead(haut) == LOW && trappeAutoHaut == 1) 
    {
      Serial.println("STOP");
      digitalWrite(ledJour, HIGH);
      digitalWrite(moteur1, LOW);
      digitalWrite(moteur2, LOW);
      trappeAutoHaut = 0;
    } 
  //Quand il fait nuit
  if(valeur < valeurNuit && erreur == 0)
    {
      Serial.println("Il fait nuit");
      if (digitalRead(haut) == LOW) //si la trappe est en haut
        {
          Serial.println("Trappe en haut");
          if(digitalRead(bas) == LOW)
            {
              Serial.println("Descendre"); 
              digitalWrite(ledJour, LOW);
              digitalWrite(moteur1, LOW);
              digitalWrite(moteur2, HIGH);
              trappeAutoBas = 1;
              delay(300);
              //Si la bouton en bas n'est pas encencher le trappe remonte (inversion du sense) il y a une erreur
              if (digitalRead(haut) == LOW){
                digitalWrite(moteur1, HIGH);
                digitalWrite(moteur2, LOW);
                digitalWrite(ledJour, HIGH);
                digitalWrite(ledNuit, HIGH);
                digitalWrite(ledBleu, HIGH);
                erreur = 1;
                delay(2500);
                digitalWrite(moteur1, LOW);
                digitalWrite(moteur2, LOW);
              }
            }
        }
    }
  if (digitalRead(bas) == HIGH && trappeAutoBas == 1) 
    {
      Serial.println("STOP");
      digitalWrite(ledNuit, HIGH);
      digitalWrite(moteur1, LOW);
      digitalWrite(moteur2, LOW);
      trappeAutoBas = 0;
    }
   }
  //Commande manuel
  if (digitalRead(boutonArret) == HIGH)
      {
        digitalWrite(ledBleu, HIGH);

        //Commande manuel monter
        if (digitalRead(boutonManuelHaut) == HIGH){
            Serial.println("Monter"); 
            trappeManuelHaut = 1;
            digitalWrite(ledJour, HIGH);
            digitalWrite(ledNuit, LOW);
            digitalWrite(moteur1, HIGH);
            digitalWrite(moteur2, LOW);
          }
        if (trappeManuelHaut == 1 && digitalRead(haut) == LOW)
          {
            Serial.println("STOP");
            digitalWrite(moteur1, LOW);
            digitalWrite(moteur2, LOW);
            trappeManuelHaut = 0;
          }
        //Commande manuel descendre 
        if (digitalRead(boutonManuelBas) == HIGH){
            Serial.println("Descendre"); 
            trappeManuelBas = 1;
            digitalWrite(ledJour, LOW);
            digitalWrite(ledNuit, HIGH);
            digitalWrite(moteur1, LOW);
            digitalWrite(moteur2, HIGH);
          }
        if (digitalRead(bas) == HIGH && trappeManuelBas == 1)
          {
            Serial.println("STOP");
            digitalWrite(moteur1, LOW);
            digitalWrite(moteur2, LOW);
            trappeManuelBas = 0;
          }
        }

//Si il y a une erreur on s'en occupe ici :
if(digitalRead(boutonManuelHaut) == HIGH && digitalRead(boutonManuelBas) == HIGH && erreur == 1)
  {
    digitalWrite(ledJour, LOW);
    digitalWrite(ledNuit, LOW);
    digitalWrite(ledBleu, LOW);
    erreur = 0;
    trappeErreurHaut = 1;
    digitalWrite(moteur1, HIGH);
    digitalWrite(moteur2, LOW);
  }
if (digitalRead(haut) == LOW && trappeErreurHaut == 1) 
  {
    Serial.println("STOP");
    digitalWrite(ledJour, HIGH);
    digitalWrite(moteur1, LOW);
    digitalWrite(moteur2, LOW);
    trappeErreurHaut = 0;
  } 
}
int sensorRawToPhys(int raw){
// Conversion rule
float Vout = float(raw) * (VIN / float(1024));
float RLDR = (R * (VIN - Vout))/Vout;
int phys=500/(RLDR/1000);
return phys;
}

0 commentaires

Soumettre un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

code