Porte automatique pour poulailler

bonsoir, autant pour moi ,j'ai fait la même erreur dans l'autre sens, pas mis == ,maintenant mes if fonctionnent tous correctement..

Bonsoir, Félicitations pour ce super et gros travail, bravo.

une suggestion, pour le problème de courant au repos du moteur pas à pas, j'ai fait des essais en mettant à 0 les 4 broches : digitalWrite(8,0); digitalWrite(9,0); digitalWrite(10,0); digitalWrite(11,0) , après une toute petite tempo pour être sûr que le moteur est arrêté, et ça fonctionne ! Je ne sais pas si ça pourrait être applicable à ton code.

autre question, serait-il possible d'utiliser le RTC DS1302 à la place du 1307 ? Merci

Bonjour, je suppose que pour le 1302 à la place du 1307, c'est oui, le 1302 est plus précis dérive -+ 2min par ans ,contre -+ 2 minutes par mois pour 1307..

La précision d'un DS1302 ou d'un DS1307 dépend totalement de son quartz. Si le module possède un quartz de piètre qualité, il dérivera plus. Et comme le montage n'est pas dans un local à température constante ...

Un DS3231 par contre a un oscillateur interne compensé en température.

Accuracy ±2ppm from 0°C to +40°C

Bonjour,

Effectivement les DS1302 / DS1307 dérivent dans le temps mais comme les poules n’ont pas de montre, une mise à l’heure tous les 6 mois est suffisant.
Pour couper l’alimentation sur un moteur pas à pas lors de la phase de repos, il faut être certain qu’il n’y a pas de glissement sinon, on perd le référentiel.
Si besoin, je pourrai poster une nouvelle version qui corrige quelques petits soucis…
A+

Bonsoir Etienne, une question de débutant en arduino, quel est l'intérêt d'utiliser I13 à la fois en entrée et en sortie, pourquoi ne pas utiliser I12 qui est disponible pour l'inter M/A ? Et cet inter, il est bien relié au +5V ?

Pour ma modeste contribution, voici les nouveaux liens : https://jean-paul-cornec.pagesperso-orange.fr/formule_rang.htm https://jean-paul-cornec.pagesperso-orange.fr/rang_des_jours.htm https://jean-paul-cornec.pagesperso-orange.fr/heures_lc.htm Merci A +

Bonjour à tous, J'ai téléchargé le programme sur mon arduino uno, inter sur i13 ouvert (i13 = +4,9V) test des fonctions : ouverture, arrêt et fermeture manuelle = ok (cde O, "espace", et F) test : étalonnage (cde E) la porte se ferme, cde E pour arrêter OK , après la porte devrait s'ouvrir, mais ce n'est pas toujours le cas. Cependant on peut l'ouvrir avec la cde O. test cycle (cde C) ok Nota le nb de pas est toujours arrondi ex : 3000 ou 4000 (je m'attendais à 3624 par exemple !) mais en gros pas de problème jusqu'ici

Après envoi cde T (debug) et là, je constate que l'heure et le jour ne sont pas corrects. Nota, j'ai testé le DS1307 avec un autre programme et il fonctionne bien. Les cdes D mise à l'heure et P get date semblent ne pas fonctionner. Alors je me dis que je ne dois pas suivre la bonne procédure pour l'utilisation de ce programme. Quelqu'un pourrait-il nous donner le mode d'emploi ? Merci

Bonjour,

Voici une version corrigée de la version V4 (moteur pas à pas).
De mémoire elle corrige la boulette sur l’entrée I13.
On a maintenant
I12 - Contact M/A
I13 - Led Arduino

Elle règle également le pb de remontée de la porte dans la phase d’étalonnage.
Si on veut plus de précision lors de l’étalonnage, il faut réduire le pas d’étalonnage.
Dans ce cas le temps d’étalonnage sera plus long.
Attention au format date à la saisie.

Si c’est la même bibliothèque qui est utilisée pour les tests du module DS1307 que celle qui est déclarée dans le programme, il n’a pas de raison que ça ne fonctionne pas…
Attention au changement d’heure… Après celui-ci, il faut mieux vérifier car j’ai eu des soucis mais sans trouver la cause.
Bon courage…

Poulailler_4.ino (34 KB)

Bonjour, merci pour cette version, J'ai dû apporter une petite modif à la ligne 245 (ajout de "= 1") sinon la mise à l'heure ne se faisait pas ligne 245 : void set_CLOCK(int Mode = 1)

est-ce que j'ai bien fait ????

Bjr,

Avec cette modification le paramètre qui est passé lors de l'appel de la fonction ne sert plus à rien. Le paramètre est forcé systématiquement à 1. Dans ce cas, le révérenciel de date est toujours la RTC.. Ce n'est pas gênant si elle fonctionne bien. A+

Bonjour, merci pour la réponse.

Une petite précision pour les débutants comme moi, la ligne 971 : digitalWrite(M_A, HIGH); peut être supprimée si on ajoute _PULLUP à la ligne 970 qui devient : pinMode(M_A, INPUT_PULLUP); L'inter est relié à GND. inter ouvert = réglages, inter fermé = Marche

L'ensemble fonctionne bien, l'heure est conservée après une coupure de crt, mais pas le Nb de pas. Est-ce qu'on pourrait le stocker différemment ? Merci A +

Bonsoir,

Pour le INPUT_PULLUP ça revient à la même chose. Si le montage est stable mécaniquement et que les étalonnages donnent toujours le même résultat, il faut mettre cette valeur dans la variable : NbPasFermetureStd. Il n'y a plus besoin de faire d'étalonnage... A+

Bonjour Grand merci, Etienne, pour ce programme génial et pour ton aide. une dernière question : pourquoi la lettre L après le Nb de pas ? A +

Bjr,

Lors d'une affectation d'une constante (NbPasFermetureStd), le "L" est utilisé pour forcer le format numérique en long afin que les comparaisons ultérieures se réalisent bien en mode long (valeur > 32000). A+

Bonjour,
en pièce jointe, et pour info, la photo du micro-treuil avec embrayage que j’ai réalisé.
L’embrayage se règle en comprimant ou en desserrant le ressort.
Un des avantages est de pouvoir ajuster manuellement la position de la porte sans ordinateur et sans outil, et du coup, dans le programme, on peut couper totalement l’alimentation du moteur.

A +

Bonjour à tous, trop fort l'apprentissage de Etibout et l’embrayage micro-treuil pour la sécurité de porte par Jp28 bravos à tous,je crois que je vais le faire , car mon moteur a calé je ne sait pas pourquoi, et 'ai eu de la chance , car le feu s'est limité aux fils du moteur et les poule ont put s’échapper car l’incident s'est produit porte mis-ouverte, j'ai mis un fusible plus petit(0.5a) en attendant...

Bonjour à tous,
J’ai pas mal lu tous les messages et les idées sont plutôt intéressantes.
J’ai essayé de faire un petit bout de code (le plus simple possible) pour automatiser la porte de mon poulailler.
Cependant, j’ai des soucis avec la double condition dans mes boucles “while”.
En effet, la fermeture est OK mais lors de l’ouverture, dès que la porte quitte l’inter du bas, elle s’arrête…
Je ne souhaite prendre en compte pour le moment, uniquement la valeur de la LDR + l’état des interrupteurs haut et bas.
Dans un second temps, mettre en place une sécurité concernant l’heure pour éviter que la porte se ferme trop par exemple en cas d’orage…
Pouvez-vous m’aider, svp?
Merci d’avance,
PS: je n’utilise pas un moteur pas à pas.

#include <config.h>
#include <ds3231.h>
#include <Wire.h>


// Clock DS3231 connectée de la facon suivante :
// SDA : Pin 2
// SCL : Pin 3

const int InterHaut = 4; // Pin 4 + Montage avec resistance de 10Kohm
const int InterBas = 5; // Pin 5 + Montage avec resistance de 10Kohm

// Conexions du moteur
int MoteurA = 9; // Pin 9 Activation du premier moteur
int MoteurUP = 8; // Pin 8 pour monter
int MoteurDOWN = 7; // Pin 9 pour descendre

int LDR ; //Resistance LDR monte sur A0 avec resistance de 10kohm
int EtatInterHaut;
int EtatInterBas;
int Tension;
int securite;

//on convertit cette valeur en une tension
float tension;

void setup()
{
  Serial.begin(9600);
  // Indique le fonctionnement des variables
  pinMode(InterHaut, INPUT_PULLUP); // Indique l etat du microrupteur d'ouverture
  pinMode(InterBas, INPUT_PULLUP); // Indique l etat du microrupteur de fermeture
  pinMode(MoteurUP, OUTPUT); // indique que l'on va envoyer l'ordre pour monter sur cette broche
  pinMode(MoteurDOWN, OUTPUT); // indique que l'on va envoyer l'ordre pour descendre sur cette broche
  pinMode(MoteurA, OUTPUT); // Indique que le moteur sera active via cette pin

// Initialisation des variables pour le démarrage ou en cas de reboot de l'Arduino
  // Mise a l'arret du moteur
  digitalWrite(MoteurUP, LOW);
  digitalWrite(MoteurDOWN, LOW);
}
void loop()
{
    // lit l'état des microrupteurs et stocke les résultat dans EtatInterHaut et EtatInterBas
  EtatInterHaut = digitalRead(InterHaut);
  EtatInterBas = digitalRead(InterBas);
  
   // Recupère la valeur de la LDR
  int LDR = analogRead(A0);

    //on affiche la valeur lue sur la liaison série
    Serial.print("valeurLue = ");
    Serial.println(LDR);
    Serial.print("Etat InterHaut = ");
    Serial.println(EtatInterHaut);
    Serial.print("Etat InterBas = ");
    Serial.println(EtatInterBas);
    if (LDR < 600)
    {
      while ( (EtatInterHaut == 0) && (EtatInterBas == 1) ) { // Si interHaut = 0 et InterBas = 1 alors la porte est ouverte
      digitalWrite(MoteurA, HIGH);
      digitalWrite(MoteurUP, HIGH);
    Serial.println("Porte en cours de fermeture ");
    EtatInterHaut = digitalRead(InterHaut);
    EtatInterBas = digitalRead(InterBas);
    }
    digitalWrite(MoteurA, LOW);
    digitalWrite(MoteurUP, LOW);
    }
    else
    {
      while ( (EtatInterHaut == 1) && (EtatInterBas == 0) ) { // Si InterBas = 0 alors la porte est fermee
      digitalWrite(MoteurA, HIGH);
      digitalWrite(MoteurDOWN, HIGH);
      Serial.println("Porte en cours d ouverture");
      EtatInterBas = digitalRead(InterBas);
      EtatInterHaut = digitalRead(InterHaut);
      }
      digitalWrite(MoteurA, LOW);
      digitalWrite(MoteurDOWN, LOW);
    }    
    delay(1000);

Bonjour,

Dans les tests pour connaitre la position de la porte, il faut revoir les whiles.. If faut dire while (tant que la porte n'est pas fermé, je donne l'ordre de descente.) ou on peut écrire je donne l'ordre de fermeture tant que la porte n'est pas fermée. Dans ce dernier cas le test est après les ordres.

Si on veut garde le test " ( (EtatInterHaut == 1) && (EtatInterBas == 0) )" qui détermine l'état fermé de la porte, il faut écrire : do { ordres } while ....

Attention dans un programme avec microcontrôleur, on évite les boucles qui peuvent boucler indéfiniment si la condition n'est pas trouvée car pendant ce temps, le système ne fait rien d'autre. De plus, une fois qu'on a donné l'ordre de descente ou de montée, il est mémoriser donc inutile de la renvoyer à chaque boucle.. Il faut forger pour devenir forgeron.. Bon courage.. Mais première version de programme, fonctionnait avec un moteur continue et des contacts fin de courses mais si pour une raison mécanique, le contact ne se faisait pas, la casse arrivait vite...

Merci pour ton retour rapide! En effet, j'ai déjà arraché quelques poulies ... JE vais tester ca et ferai un retour. C'est marrant de voir que pour une même idée, il y ai autant de programmes différents !

Retour avec les tests en prenant en compte les infos de la boucle “Do … While”.
Le moteur fonctionne, mais uniquement une fraction de seconde, puis se relance.
Je n’ai pas eu la patience d’aller jusqu’au bout de l’ouverture… :-s
Lorsque je regarde sur le site des références arduino (do...while - Arduino Reference) il est indiqué que normalement, on ne met qu’une seule condition au do…While, vous confirmez?
En attendant, le code que j’ai modifié est le suivant :

#include <config.h>
#include <ds3231.h>
#include <Wire.h>

//librairies a utiliser

// Clock DS3231 connectée de la facon suivante :
// SDA : Pin 2
// SCL : Pin 3

const int InterHaut = 4; // Pin 4 + Montage avec resistance de 10Kohm
const int InterBas = 5; // Pin 5 + Montage avec resistance de 10Kohm

// Conexions du moteur
int MoteurA = 9; // Pin 9 Activation du premier moteur
int MoteurUP = 8; // Pin 8 pour monter
int MoteurDOWN = 7; // Pin 9 pour descendre

int LDR ; //Resistance LDR monte sur A0 avec resistance de 10kohm
int EtatInterHaut;
int EtatInterBas;
int Tension;
int securite;

//on convertit cette valeur en une tension
float tension;

void setup()
{
  Serial.begin(9600);
  // Indique le fonctionnement des variables
  pinMode(InterHaut, INPUT_PULLUP); // Indique l etat du microrupteur d'ouverture
  pinMode(InterBas, INPUT_PULLUP); // Indique l etat du microrupteur de fermeture
  pinMode(MoteurUP, OUTPUT); // indique que l'on va envoyer l'ordre pour monter sur cette broche
  pinMode(MoteurDOWN, OUTPUT); // indique que l'on va envoyer l'ordre pour descendre sur cette broche
  pinMode(MoteurA, OUTPUT); // Indique que le moteur sera active via cette pin

// Initialisation des variables pour le démarrage ou en cas de reboot de l'Arduino
  // Mise a l'arret du moteur
  digitalWrite(MoteurUP, LOW);
  digitalWrite(MoteurDOWN, LOW);
}
void loop()
{
    // lit l'état des microrupteurs et stocke les résultat dans EtatInterHaut et EtatInterBas
  EtatInterHaut = digitalRead(InterHaut);
  EtatInterBas = digitalRead(InterBas);
  
   // Recupère la valeur de la LDR
  int LDR = analogRead(A0);

    //on affiche la valeur lue sur la liaison série
    Serial.print("valeurLue = ");
    Serial.println(LDR);
    Serial.print("Etat InterHaut = ");
    Serial.println(EtatInterHaut);
    Serial.print("Etat InterBas = ");
    Serial.println(EtatInterBas);
    if (LDR < 600) { // Si luminosité est basse (inferieur à valeur 600)
      do { // Ferme la porte
        digitalWrite(MoteurA, HIGH); // Active moteur A
        digitalWrite(MoteurUP, HIGH); // Active la montee 
        Serial.println("Porte en cours de fermeture ");
        EtatInterHaut = digitalRead(InterHaut);
        EtatInterBas = digitalRead(InterBas);
      } while ( (EtatInterHaut == 0) && (EtatInterBas == 1) ); // Si interHaut = 0 et InterBas = 1 alors la porte est ouverte   
      digitalWrite(MoteurA, LOW);
      digitalWrite(MoteurUP, LOW);
    }
    else if (LDR > 680) {
      do { // Si luminosité haute 
      
      digitalWrite(MoteurA, HIGH);
      digitalWrite(MoteurDOWN, HIGH);
      Serial.println("Porte en cours d ouverture");
      EtatInterBas = digitalRead(InterBas);
      EtatInterHaut = digitalRead(InterHaut);
      } while ( (EtatInterHaut == 1) && (EtatInterBas == 0) ); // Si InterBas = 0 alors la porte est fermee
      digitalWrite(MoteurA, LOW);
      digitalWrite(MoteurDOWN, LOW);
    }
    else { // Sinon, en temps normal, le moteur est eteint
      digitalWrite(MoteurA, LOW);
      digitalWrite(MoteurUP, LOW);
      digitalWrite(MoteurDOWN, LOW);
    }    
    delay(1000);
}