Porte automatique pour poulailler version 3 *

Description :

Version 3 :

2 modes sélectionnables (Automatique / Manuel) par 1 bouton avec affichage des infos sur LCD.

-Automatique : porte sera pilotée par le capteur de luminosité (LDR).

-Manuel : porte sera pilotée par 2 boutons manuellement.

 

    Prérequis :

Matériel :

  • 1 x Carte Arduino Uno
  • 2 x Fin de course
  • 1 x LDR photorésistance
  • 1 x Résistance 10 KΩ
  • 3 x Boutons
  • 1 x Ecran LCD 20×4
  • 1 x Module I2C
  • 1 x Moteur Nema PAP
  • 1 x L298N
  • 1 x Alimentation 12v
  • Fils de connexion
  • 1 x Breadboard

Version IDE :

 

 

Vidéo de démonstration :

 

Schéma de câblage :

 

Code :

const int LDR = A0; // broche du LDR
const int btmonter = 4; // broche du bouton monter
const int btdescente = 3; // broche du bouton descendre
const int btmenu = 2; // broche du bouton menu
const int fdchaut = 5; // broche du fin de course haut
const int fdcbas = 7; // broche du fin de course bas

int val_LDR_ouverture = 400; // valeur luminosité minimum pour ouverture
int val_LDR_fermeture = 100; // valeur luminosité minimum pour fermeture
int nbcyclerefresh = 5000; //Nb de cycle progr. avant rafraichissement LCD

#include <Stepper.h>
const int stepsPerRevolution = 200;
// Initialise le moteur sur les broches 8 à 11
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
boolean menu = 0;
boolean etatporte = 0; 
unsigned int refreshLDRms;
int refrechchgetat = 0;

void setup() {  
  myStepper.setSpeed(200); //Vitesse de rotation du moteur à 200
  lcd.init();                     
  lcd.backlight();
  lcd.clear();
  affichagemanuel();
  pinMode(btmonter, INPUT_PULLUP);
  pinMode(btdescente, INPUT_PULLUP);
  pinMode(btmenu, INPUT_PULLUP);
  pinMode(fdchaut, INPUT_PULLUP);
  pinMode(fdcbas, INPUT_PULLUP); 
}

void loop() { 
  int valeurLDR = analogRead(LDR);
//////////Gestion bouton selection menu /////////
  if(digitalRead(btmenu) == LOW){
    menu = !menu;
    if( menu == 0){
      lcd.clear();
      affichagemanuel();
    }
    else{
      lcd.clear();
      affichageautomatique(valeurLDR);
      refreshLDRms = nbcyclerefresh + 1; 
    }  
    while(digitalRead(btmenu) == LOW){
    }
  }
//////////Mode Automatique si menu == 1/////////
  if(valeurLDR >= val_LDR_ouverture && menu == 1){
      etatporte = 1;
    }
  if(valeurLDR <= val_LDR_fermeture && menu == 1){
      etatporte = 0;
    } 
  if(menu == 1 && refreshLDRms > nbcyclerefresh || refrechchgetat == !etatporte){
    refrechchgetat = etatporte;
    affichageautomatique(valeurLDR);
  } 
  while(etatporte == 1 && digitalRead(fdchaut) == HIGH && menu == 1){
    myStepper.step(1);
  }
  while(etatporte == 0 && digitalRead(fdcbas) == HIGH && menu == 1){
    myStepper.step(-1);
    }
  refreshLDRms++;
//////////Mode Manuel si menu == 0/////////////  
  if(digitalRead(btmonter) == LOW && menu == 0){
    affichagemanuel();
    while(digitalRead(btmonter) == LOW && digitalRead(fdchaut) == HIGH && menu == 0){
        myStepper.step(1);
    } 
  }
  if(digitalRead(btdescente) == LOW && menu == 0){
    affichagemanuel();
    while(digitalRead(btdescente) == LOW && digitalRead(fdcbas) == HIGH && menu == 0){
        myStepper.step(-1);
    }
  }
  if(menu == 0){
    affichagemanuel();   
  }     
/////////Mise au repos du moteur PAP
  moteurrepos(); 
}

int affichageautomatique (int valeurLDR){
  lcd.setCursor(0,0);
  lcd.print("Mode : ");
  lcd.setCursor(7,0);
  lcd.print("Automatique");
  lcd.setCursor(0,1);
  lcd.print("V. du LDR : "); 
  if(valeurLDR < 100){
    lcd.setCursor(12,1); 
    lcd.print(valeurLDR);
    lcd.setCursor(14,1); 
    lcd.print("   ");
  }
  else if(valeurLDR >= 100 && valeurLDR < 1000){
    lcd.setCursor(12,1); 
    lcd.print(valeurLDR);
    lcd.setCursor(15,1); 
    lcd.print("   ");
  }
  else{
    lcd.setCursor(12,1); 
    lcd.print(valeurLDR);    
  } 
  lcd.setCursor(0,2);
  lcd.print("Ouverture a : ");
  lcd.setCursor(14,2);
  lcd.print(val_LDR_ouverture);
  lcd.setCursor(0,3);
  lcd.print("Fermeture a : ");
  lcd.setCursor(14,3);
  lcd.print(val_LDR_fermeture);  
  refreshLDRms = 0;     
}

int affichagemanuel (){
  lcd.setCursor(0,0);
  lcd.print("Mode : ");
  lcd.setCursor(7,0);
  lcd.print("Manuel     ");
  lcd.setCursor(0,1);
  lcd.print("                   ");
  lcd.setCursor(0,2);
  lcd.print("Bouton : ");
  if (digitalRead(btmonter) == LOW){
    lcd.setCursor(9,2);
    lcd.print("Monter  ");
  }
  else if (digitalRead(btdescente) == LOW){
    lcd.setCursor(9,2);
    lcd.print("Descente");
  }
  else{
    lcd.setCursor(9,2);
    lcd.print("Repos   ");  
  }
  lcd.setCursor(0,3);
  lcd.print("Pos. porte : ");  
  if(digitalRead(fdchaut) == LOW){
   lcd.setCursor(13,3);
   lcd.print("Ouverte");  
  }
  else if(digitalRead(fdcbas) == LOW){
    lcd.setCursor(13,3);
    lcd.print("Fermer "); 
  }
  else{
    lcd.setCursor(13,3);
    lcd.print(" ...   ");
  }
}
  
void moteurrepos (){
   digitalWrite (8, LOW);
   digitalWrite (9, LOW);  
   digitalWrite (10, LOW);
   digitalWrite (11, LOW);  
}

 


 

Cet article a 2 commentaires

  1. maaz

    Bonjour,

    Votre montage est top, j’ai cependant un prb, j’ai effectué le montage à l’identique, le programme également (j’ai juste modif les valeurs ldr de déclenchement), tout fonctionnait à merveille, mais pour je ne sais quelle raison, la valeur affiché sur le LCD ne change plus, au branchement de l’arduino la valeur enregistrée par la LDR est comme figée, et j’ai beau lui envoyer une lumière ou caché le capteur rien ne change et du coup le systeme ne fonctionne plus en auto.
    J’ai teste la ldr, j’ai changé la ldr, mais rien, le sketch n’a pas bougé, j’ai vérifié tout les elements et tout est ok.
    Je me suis dit que c’etait le rafraichissement qui était en cause, mais encore une fois rien, vous avez une idée du dysfonctionnement??

    1. steven

      Bonjour,

      Au vu de vos informations, je dirais plutôt une erreur de branchement du LDR.
      Vous pouvez dans un premier temps repartir du début reprendre le code d’origine et re charger le programme.
      Vous pouvez aussi vérifier votre LDR avec ce petit montage pour contrôler qu’il marche bien avec ce petit exemple.

      https://robdomo.com/arduino/exemples-montage-schemas-et-codes/uno/intermediaire/afficher-la-valeur-dune-photoresistance-dans-le-moniteur-serie-ide-arduino/

      Aussi vérifier la résistance Résistance 10 KΩ qui est très importante.
      Si le problème persiste, contactez-moi sur Facebook nous regarderons ça ensemble.
      Cordialement,

Laisser un commentaire