Porte automatique de poulailler v3
Description :
Ce projet permet d’automatiser l’ouverture et la fermeture d’un poulailler pour protéger vos poules sans effort. Grâce à un capteur de lumière (LDR) et une carte Arduino, la porte s’ouvre toute seule au lever du soleil et se ferme à la tombée de la nuit.
Le système propose deux façons de fonctionner :
- Mode Automatique : Le capteur mesure la luminosité et commande le moteur selon des seuils que vous avez choisis.
- Mode Manuel : Un simple bouton permet de basculer en commande manuelle. Vous pouvez alors piloter la porte vous-même avec deux boutons (Monter/Descendre).
Un écran LCD rétroéclairé affiche en temps réel tout ce qu’il se passe : le mode choisi (Auto ou Manu), la force de la lumière et la position de la porte. Pour éviter d’abîmer la structure ou de forcer sur le moteur, des capteurs de sécurité (fin de course) arrêtent automatiquement le mouvement dès que la porte est totalement ouverte ou fermée.
Prérequis :
- 1 x Carte Arduino Uno
- 3 x Bouton
- 1 x L298N
- 1 x LCD 20×4 2004 avec adaptateur d interface série IIC I2C
- 1 x Photorésistance (LDR)
- 1 x Résistances 10KΩ
- 1 x Moteur (entre 5V et 35V max)
- 1 x Alimentation (adapter à la tension du moteur)
- 1 x Breadboard
- Fils de connexion
Vidéo de démonstration :
NA
Schéma de câblage :


Code :
/*
* PROJET : Automatisation de porte de poulailler
* FONCTIONNALITÉS : Mode Automatique (LDR) et Mode Manuel (Boutons)
* AFFICHAGE : LCD 20x4 I2C
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Initialisation de l'écran LCD (Adresse I2C, Colonnes, Lignes)
LiquidCrystal_I2C lcd(0x27, 20, 4);
// --- Configuration des broches (Pins) ---
const int LDR_PIN = A0; // Capteur de lumière
const int IN1 = 8; // Pilotage moteur L298N - Sens 1
const int IN2 = 9; // Pilotage moteur L298N - Sens 2
const int FIN_HAUT = 5; // Capteur fin de course porte ouverte
const int FIN_BAS = 6; // Capteur fin de course porte fermée
const int Bouton_Monter = 4; // Bouton poussoir montée
const int Bouton_Descendre = 3; // Bouton poussoir descente
const int Bouton_Toggle_Mode = 2; // Bouton poussoir changement de mode
// --- Variables d'état ---
bool modeAuto = true; // État du mode (Auto par défaut)
bool dernierEtatBouton = HIGH; // Pour la détection de l'impulsion (bouton mode)
// --- Seuils de luminosité (Ajustables) ---
const int SEUIL_OUVERTURE = 700; // Seuil jour
const int SEUIL_FERMETURE = 450; // Seuil nuit
// ================================================================
// INITIALISATION
// ================================================================
void setup() {
lcd.init(); // Initialisation de l'écran
lcd.backlight(); // Allumage du rétroéclairage
// Configuration des sorties moteur
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
// Configuration des entrées avec résistance de tirage interne (PULLUP)
// Note : Boutons et capteurs doivent être reliés au GND
pinMode(FIN_HAUT, INPUT_PULLUP);
pinMode(FIN_BAS, INPUT_PULLUP);
pinMode(Bouton_Monter, INPUT_PULLUP);
pinMode(Bouton_Descendre, INPUT_PULLUP);
pinMode(Bouton_Toggle_Mode, INPUT_PULLUP);
lcd.clear();
majAffichage(); // Affiche la structure de base sur le LCD
}
// ================================================================
// BOUCLE PRINCIPALE
// ================================================================
void loop() {
// --- Gestion du changement de Mode (Détection d'appui) ---
bool etatActuelBouton = digitalRead(Bouton_Toggle_Mode);
if (dernierEtatBouton == HIGH && etatActuelBouton == LOW) { // Si appui détecté
modeAuto = !modeAuto; // Inversion de l'état
lcd.clear(); // Nettoyage écran pour le nouveau mode
majAffichage(); // Mise à jour de la structure du texte
delay(250); // Anti-rebond logiciel
}
dernierEtatBouton = etatActuelBouton;
// --- Aiguillage vers la logique correspondante ---
if (modeAuto) {
gestionModeAuto();
}
else {
gestionModeManu();
}
delay(50); // Fluidité de la boucle
}
// ================================================================
// LOGIQUE AUTOMATIQUE (LDR)
// ================================================================
void gestionModeAuto() {
int lum = analogRead(LDR_PIN); // Lecture de la luminosité actuelle
// Mise à jour de la valeur sur le LCD (Ligne 2)
lcd.setCursor(12, 1);
lcd.print(lum);
lcd.print(" "); // Efface les anciens caractères
// Vérification des conditions d'ouverture/fermeture
if (lum > SEUIL_OUVERTURE && digitalRead(FIN_HAUT) == HIGH) {
ouvrirPorte();
}
else if (lum < SEUIL_FERMETURE && digitalRead(FIN_BAS) == HIGH) {
fermerPorte();
}
}
// ================================================================
// LOGIQUE MANUELLE (BOUTONS)
// ================================================================
void gestionModeManu() {
// --- Affichage de la position actuelle sur la Ligne 4 ---
lcd.setCursor(0, 3);
lcd.print("Pos. porte : ");
if (digitalRead(FIN_HAUT) == LOW) lcd.print("Ouvert ");
else if (digitalRead(FIN_BAS) == LOW) lcd.print("Ferme ");
else lcd.print("Deplac.");
// --- Affichage de l'action bouton sur la Ligne 3 ---
lcd.setCursor(0, 2);
lcd.print("Bouton : ");
// Action Monter (si pas déjà en haut)
if (digitalRead(Bouton_Monter) == LOW && digitalRead(FIN_HAUT) == HIGH) {
lcd.print("Monter ");
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
}
// Action Descendre (si pas déjà en bas)
else if (digitalRead(Bouton_Descendre) == LOW && digitalRead(FIN_BAS) == HIGH) {
lcd.print("Descente ");
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
}
// Si aucun appui ou fin de course atteint
else {
lcd.print("Attente ");
stopperMoteur();
}
}
// ================================================================
// FONCTIONS D'AFFICHAGE ET DE MOUVEMENT
// ================================================================
// Affiche la structure fixe du menu (appelée au changement de mode)
void majAffichage() {
lcd.setCursor(0, 0);
if (modeAuto) {
lcd.print("Mode : Auto");
lcd.setCursor(0, 1); lcd.print("V. du LDR : ");
lcd.setCursor(0, 2); lcd.print("Ouverture a "); lcd.print(SEUIL_OUVERTURE);
lcd.setCursor(0, 3); lcd.print("Fermeture a "); lcd.print(SEUIL_FERMETURE);
}
else {
lcd.print("Mode : Manuel");
lcd.setCursor(0, 1); lcd.print("--------------------");
}
}
// Commande d'ouverture (Mode Auto)
void ouvrirPorte() {
while (digitalRead(FIN_HAUT) == HIGH) { // Tant que le capteur haut n'est pas touché
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
// Sécurité : passage en manuel possible pendant le mouvement
if (digitalRead(Bouton_Toggle_Mode) == LOW) { modeAuto = false; break; }
// Rafraîchir la valeur LDR sur l'écran pendant le trajet
lcd.setCursor(12, 1); lcd.print(analogRead(LDR_PIN));
}
stopperMoteur();
}
// Commande de fermeture (Mode Auto)
void fermerPorte() {
while (digitalRead(FIN_BAS) == HIGH) { // Tant que le capteur bas n'est pas touché
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
// Sécurité : passage en manuel possible pendant le mouvement
if (digitalRead(Bouton_Toggle_Mode) == LOW) { modeAuto = false; break; }
lcd.setCursor(12, 1); lcd.print(analogRead(LDR_PIN));
}
stopperMoteur();
}
// Arrêt complet du moteur via le module L298N
void stopperMoteur() {
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
}
