Go Down

Topic: Porte automatique pour poulailler (Read 67938 times) previous topic - next topic

jp28

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 +

jp28

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

etibou

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..

jp28

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 ????

etibou

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+

jp28

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 +

etibou

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+

jp28

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 +

etibou

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+

jp28

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 +

philippe6philoux

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...

franck_sv

#116
Mar 09, 2020, 10:13 pm Last Edit: Mar 09, 2020, 10:18 pm by franck_sv
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.
Code: [Select]
#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);

etibou

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...

franck_sv

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 !

franck_sv

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 (https://www.arduino.cc/reference/tr/language/structure/control-structure/dowhile/) 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 :
Code: [Select]

#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);
}

Go Up