«Prot» et «Ine» vivaient chez mon ami Frédéric qui leur avait confectionné un beau poulailler, mais…
ouvrir et fermer la porte du poulailler chaque jour devient vite @!#!.

Une solution à base d’un capteur de lumière nous a semblé la plus appropriée.

Le capteur
Le capteur est une LDR 12mm moulée car elle doit résister au intempéries.
LDR 12mm

Les mesures de luminosité sont effectuées à l’aide d’une entrée analogique de l’Arduino (A0), qui convertira une tension comprise entre 0 et 5V en une valeur numérique comprise entre 0 et 1024.
La valeur de la résistance est à adapter en fonction de votre capteur

schéma capteur

Nous voilà bien avancé… effectivement, à partir de quelles valeurs fait-il jour ou nuit ?
En plus, l’environnement (présence d’un éclarage public, poulailler à l’ombre etc.) peut jouer significativement.
Une seule solution, faire des mesures sur 24 heures pour déterminer correctement les valeurs de seuils à appliquer pour notre automatisme.

Le code coté Arduino pour effectuer les mesures

/*
  ReadAnalogLDR
  Lit la valeur d'une photorésistance sur l'entrée analogique 0
  et affiche la valeur lue sur le moniteur série (Ctrl+Maj+M) toutes les 30 secondes
  (soit 2880 mesures par 24h)
 */

// fonction exécutée une seule fois au après une remise à zéro (RaZ)(reset)
void setup() {
  // initialise la communication série à 9600 bauds par seconde
  Serial.begin(9600);
}

// boucle sans fin
void loop() {
  // lit la valeur de la photorésistance sur l'entrée analogique 0
  int ValeurLDR = analogRead(A0);
  // affiche la valeur lue sur le moniteur série (Ctrl+Maj+M)
  Serial.println(ValeurLDR);
  // attend 30 secondes
  delay(30000);
}

Le code python pour récupérer les mesures

#!/usr/local/bin/python
# -*- coding:Utf-8 -*-

import time
import serial

# configure la liaison série
ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    xonxoff=0
)

ser.isOpen()	# ouvre le port série

old_x = 0	# ancienne valeur

while 1:                    # boucle infinie
    x=ser.readline()        # lit les données du port série
    if x:                   # l'on écrit que si des données ont été lues
        if old_x != x:      # l'on note la valeur que si elle change par rapport à la précédente
            old_x = x       # mémorise la valeur
            # affiche la date, l'heure et la valeur lue du capteur
            affichage = time.strftime('%d/%m/%Y %H:%M:%S',time.localtime()) + " " + x			
            print affichage,    # la virgule ici évite les lignes vierges

ser.close() # ferme le port série (inutile ici en fait, car l'on ferme le programme avec Ctrl + C ...)

Enregistrer les valeurs dans un fichier
Dans une console exécuter la commande suivante :

python python_LDR.py > mesures.txt

Vous pouvez ensuite traiter les données récoltées à l’aide d’un tableur comme LibreOffice Calc en ouvrant le fichier mesures.txt obtenu.
Voici un exemple d’analyse Calc que vous pouvez utiliser avec vos propres relevés.

graphique capteur

Première constation à la lecture de ce graphique, le capteur “sature” avec très peu de lumière, un seuil de 800 pour ouvrir la porte semble approprié.
Le réverbère élève la valeur lue aux alentours de 380, ce qui nous oblige à un seuil supérieur de 400 pour la fermeture de la porte.
Sur le terrain cela ferme la porte un peu tôt, l’idée est d’ajouter une temporisation au programme pour permettre aux locataires de rentrer. C’est c.. une poule :-)

Le résultat en vidéo.

Le capteur de porte ouverte ou fermée est constitué d’un interrupteur vas et vient d’extérieur, sur lequel a été fixée une vis (rallonge).
Deux équerres sont fixées aux extrémités d’une baguette de bois solidarisée à la ficelle et guidée par un profilé en aluminium. Les équerres appuient alternativement sur la vis de l’interrupteur pour le faire basculer.