Porte de poulailler automatique – MAJ

Cela fait quelques années que j’ai écris un article sur ma porte de poulailler automatique. J’ai fait tellement de modifications dessus que je suis obligé de faire une mise à jour pour vous donner les dernières informations si vous souhaitez vous en construire un.

Partie Mécanique

La partie mécanique m’a lâché plusieurs fois. Trop de frottement, trop de jeu, pas assez robuste.

J’ai décidé de remplacer mon petit moteur et la tige filetée par un actionneur linéaire en 12V de 200mm de course que l’on peut trouver sur amazon. La comparaison est impressionnante. Cet actionneur développe une force très élevée qui peut fermer la porte sans problème, même s’il y a de la paille ou des copeaux dans le chemin.

J’ai protégé le tout par une petite extension du toit pour être à l’abris de la pluie.

Partie Electrique

Commande

Pour commander l’actionneur, je passe toujours par les deux relais. Deux pins sont utilisés sur l’arduino : une pour dire de fermer la fenetre, et une autre pour dire d’ouvrir. Si les deux sont HIGH, il ne se passe rien. Si les deux sont LOW, il ne se passe rien non plus. Il n’y a donc pas de « conflit » de commande vers l’actionneur.

Par rapport à mon installation précédente, j’ai rajouté un controlleur ethernet (basé sur un chip W5500) pour communiquer en MQTT,

A titre d’information, voici le code de l’arduino :

#include <PubSubClient.h>
#include <SPI.h>
#include <Ethernet.h>


byte mac[] = {
  0x00, 0xAA, 0xBB, 0xCD, 0xDF, 0x03
};

IPAddress ip(192, 168, 1, 20);

EthernetClient ethClient;
PubSubClient client;

#define MQTT_USERNAME ""
#define MQTT_PASSWORD ""
#define MQTT_SERVER "192.168.1.100"
#define MQTT_STATUS "/poulailler/state"
#define MQTT_OPEN "/poulailler/set"
#define MQTT_AVAILABLE "/poulailler/available"

unsigned long time2 = (long)0;
char buffer[16];
boolean ouvert = false;
const int closePin = 43;  // pin fermer 
const int openPin = 41;   // pin ouvrir


void callback(char* topic, byte* payload, unsigned int length) {
  String topicStr = topic;
  if (topicStr == MQTT_OPEN){
    if(payload[0] == 49){ // = 1 en char
      ouvert = true;
      Serial.println("Door open");
      client.publish(MQTT_STATUS, "1");
    }
    else{
      ouvert = false;
      Serial.println("Door close");
      client.publish(MQTT_STATUS, "0");
    }
  }
}

// close the coop door motor
void closeDoor() {
  digitalWrite (closePin, HIGH);
  digitalWrite (openPin, LOW);
}

// open the coop door
void openDoor() {
  digitalWrite(closePin, LOW);
  digitalWrite(openPin, HIGH);
}

void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac,ip);
  delay(1000);
  client = PubSubClient(MQTT_SERVER, 1883, callback,ethClient);
  Serial.println(Ethernet.localIP());
  client.setServer(MQTT_SERVER, 1883);
  
  pinMode (closePin, OUTPUT);    // motor close direction pin = output
  pinMode (openPin, OUTPUT);     // motor open direction pin = output
}

void loop() {
  if (!client.connected()) {
    if (client.connect("poulailler", MQTT_USERNAME, MQTT_PASSWORD)) {
      client.publish(MQTT_AVAILABLE, "online");
      Serial.println("Connected to MQTT");
      client.subscribe(MQTT_OPEN);
      Serial.println("Subscribed");
    }
    else {
      Serial.println("Could not connect to MQTT");
    }

  }

  // gestion de la porte
  if(ouvert) {
    openDoor();
  }
  else{
    closeDoor();
  }
  client.loop();
}

Capteur solaire vers MQTT

La photo-résistance a commencé à se corroder, et le système me posait quelques problèmes à la longue (difficilement paramétrable – on doit mettre à jour le sketch de l’arduino pour changer les valeurs, ou alors rajouter un potentiomètre – une pièce en plus … et je voulais aussi un système de bypass manuel sans devoir mettre des interrupteurs et tout le tralala, pour l’incorporer à ma domotique)

Je suis donc parti sur une commande par réseau MQTT, afin de l’intégrer à ma domotique (avec node-red, home assistant … je vous invite à lire mes autres articles sur le sujet). Il suffit d’envoyer le message « 1 » ou « 0 » sur un topic MQTT pour ouvrir/fermer le poulailler.

Je demande à mon poulailler de se fermer 15 minutes avant le coucher du soleil, et de s’ouvrir 30min après le lever. Et j’ai la possibilité d’avoir un retour d’état sur la fermeture de la porte et faire des petits graphiques de geek 🙂

poulailler_graph

et je peux du coup aussi commander la porte via Home Assistant en considérant le poulailler comme un switch manuel :

homeassistant

La partie automatique du switch est gérée via Node-Red qui envoie une commande sur le réseau MQTT quand le soleil est à la bonne position (ouvrir quand le soleil se lève, fermer quand le soleil se couche)

poulailler_nodered

[
    {
        "id": "3ef8a5a5.e7ade2",
        "type": "tab",
        "label": "Poulailler",
        "disabled": false,
        "info": ""
    },
    {
        "id": "b61dad48.10761",
        "type": "inject",
        "z": "3ef8a5a5.e7ade2",
        "name": "",
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "repeat": "600",
        "crontab": "",
        "once": true,
        "onceDelay": "60",
        "x": 211.5,
        "y": 170,
        "wires": [
            [
                "1d21987a.6d22"
            ]
        ]
    },
    {
        "id": "ee72fa1a.81de28",
        "type": "mqtt out",
        "z": "3ef8a5a5.e7ade2",
        "name": "",
        "topic": "/poulailler/set",
        "qos": "",
        "retain": "true",
        "broker": "21c3ebbb.867574",
        "x": 1049,
        "y": 171,
        "wires": []
    },
    {
        "id": "9b4e2eb0.066ea8",
        "type": "mqtt out",
        "z": "3ef8a5a5.e7ade2",
        "name": "",
        "topic": "/poulailler/available",
        "qos": "",
        "retain": "true",
        "broker": "21c3ebbb.867574",
        "x": 399.8833312988281,
        "y": 74.88333129882812,
        "wires": []
    },
    {
        "id": "664dfc21.ed0dec",
        "type": "inject",
        "z": "3ef8a5a5.e7ade2",
        "name": "",
        "topic": "",
        "payload": "online",
        "payloadType": "str",
        "repeat": "",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "x": 191.5499267578125,
        "y": 74.88333129882812,
        "wires": [
            [
                "9b4e2eb0.066ea8"
            ]
        ]
    },
    {
        "id": "1d21987a.6d22",
        "type": "within-time-switch",
        "z": "3ef8a5a5.e7ade2",
        "name": "",
        "positionConfig": "49242030.270f6",
        "startTime": "civilDawn",
        "startTimeType": "pdsTime",
        "startOffset": "60",
        "startOffsetType": "num",
        "startOffsetMultiplier": 60000,
        "endTime": "civilDusk",
        "endTimeType": "pdsTime",
        "endOffset": "0",
        "endOffsetType": "num",
        "endOffsetMultiplier": 60000,
        "propertyStart": "",
        "propertyStartType": "none",
        "startTimeAlt": "",
        "startTimeAltType": "entered",
        "startOffsetAlt": 0,
        "startOffsetAltType": "none",
        "startOffsetAltMultiplier": 60000,
        "propertyEnd": "",
        "propertyEndType": "none",
        "endTimeAlt": "",
        "endTimeAltType": "entered",
        "endOffsetAlt": 0,
        "endOffsetAltType": "none",
        "endOffsetAltMultiplier": 60000,
        "tsCompare": "0",
        "statusOut": 3,
        "lastMsgOnStartOut": false,
        "lastMsgOnEndOut": false,
        "x": 397.5666809082031,
        "y": 167.90005493164062,
        "wires": [
            [
                "ebb18418.2c95a8",
                "521ee87f.0bd7c8"
            ],
            [
                "41345e77.75f498",
                "39d05640.d72c52"
            ]
        ]
    },
    {
        "id": "41345e77.75f498",
        "type": "change",
        "z": "3ef8a5a5.e7ade2",
        "name": "payload 0",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "0",
                "tot": "num"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 638.566650390625,
        "y": 205.11666870117188,
        "wires": [
            [
                "f8c54705.9c1508"
            ]
        ]
    },
    {
        "id": "ebb18418.2c95a8",
        "type": "change",
        "z": "3ef8a5a5.e7ade2",
        "name": "payload 1",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "1",
                "tot": "num"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 639.88330078125,
        "y": 161.88333129882812,
        "wires": [
            [
                "f8c54705.9c1508"
            ]
        ]
    },
    {
        "id": "f8c54705.9c1508",
        "type": "rbe",
        "z": "3ef8a5a5.e7ade2",
        "name": "",
        "func": "rbe",
        "gap": "",
        "start": "",
        "inout": "out",
        "property": "payload",
        "x": 811.88330078125,
        "y": 162.88333129882812,
        "wires": [
            [
                "ee72fa1a.81de28"
            ]
        ]
    },
    {
        "id": "39d05640.d72c52",
        "type": "function",
        "z": "3ef8a5a5.e7ade2",
        "name": "global set nuit",
        "func": "global.set(\"soleil\",\"nuit\");",
        "outputs": 1,
        "noerr": 0,
        "x": 659.88330078125,
        "y": 240.88333129882812,
        "wires": [
            []
        ]
    },
    {
        "id": "521ee87f.0bd7c8",
        "type": "function",
        "z": "3ef8a5a5.e7ade2",
        "name": "global set jour",
        "func": "global.set(\"soleil\",\"jour\");",
        "outputs": 1,
        "noerr": 0,
        "x": 656.88330078125,
        "y": 119.88333129882812,
        "wires": [
            []
        ]
    },
    {
        "id": "21c3ebbb.867574",
        "type": "mqtt-broker",
        "z": "",
        "name": "NAS",
        "broker": "192.168.1.100",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "willTopic": "",
        "willQos": "0",
        "willPayload": ""
    },
    {
        "id": "49242030.270f6",
        "type": "position-config",
        "z": "",
        "name": "Limelette",
        "isValide": "true",
        "longitude": "0",
        "latitude": "0",
        "angleType": "deg",
        "timezoneOffset": "2"
    }
]

Si cet article vous a plu, inscrivez-vous à la newsletter pour être informé de la publication d'autres articles.

Vous pouvez aussi partager cet article sur les réseaux sociaux

Une réflexion sur “Porte de poulailler automatique – MAJ

Laisser un commentaire