IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Porte automatique temporisée


Sujet :

Arduino

  1. #1
    Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Août 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Août 2020
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Porte automatique temporisée
    Bonjour à tous,
    je suis en train de bricoler une porte actionnée automatiquement par une photorésistance et 2 fins de course.
    En glanant des infos à droite et à gauche, j'ai réussi à programmer son ouverture en fonction de la luminosité.
    Je voudrais maintenant ajouter une fonction de temporisation telle que si la condition de luminosité est vraie pendant 5 minutes, seulement à ce moment là, on actionne la porte. Si ça n'est pas vrai pendant 5 minutes d'affilées, on reprend le comptage.
    J'ai essayé avec la fonction millis, mais ça ne marche pas vraiment comme je le désire. Dans le programme que j'ai fait, si la condition de luminosité change pendant cette tempo de 5 minutes, ça ne ré-initialise pas le comptage et je ne trouve pas comment je pourrais résoudre ça. Si vous avez une piste...
    Merci d'avance pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    //Fonctionnement avec photorésistance et 2 fins de course
    // la valeur detection "jour" de la photoresistance est differente de la valeur "nuit" pour éviter les 
    // ouvertures/fermetures intempestives quand on est aux alentour du seuil de luminosité détecté
     
    #include <AFMotor.h> //librairie shield Adafruit motor
     
    AF_DCMotor motor(1); //Moteur branché sur la sortie 1
     
    // Déclaration des variables et des constantes
     
    int FinCFerm = A1;// entrée du fin de course FERME. Une broche sur la masse l'autre sur A1
    int FinCOuv = A2;// entrée du fin de course OUVERT. Une broche sur la masse l'autre sur A2
    int SensorValue;  //declaration de la photoresistance 
    int i=0;          //declaration de la valeur de la photoresistance
     
    unsigned long tempsDepart = 0;  // déclaration de la variable qui va contenir la valeur du temps au départ
    const long dureeTempo = 300000; // déclaration de la constante de durée de temporisation 300000ms = 5minutes
     
     
    void setup()
    {
     
      Serial.begin(9600); // démarrage la liaison série entre entrée analogique et ordi
      pinMode(FinCFerm, INPUT_PULLUP); // mode lecture sur le bouton FinCFerm utilisation de la resistance interne de pull up
      pinMode(FinCOuv, INPUT_PULLUP);  //mode lecture sur le bouton FinCOuv utilisation de la resistance interne de pull up
    //Donc de base lorsque le bouton n'est pas appuyé on lit un état haut (5V = niveau logique 1)
     
      motor.setSpeed(255); // reglage vitesse moteur à 255/255
     
      motor.run(RELEASE);  // le moteur s'arrête
    }
     
    void loop()
    {
        unsigned long tempsCourant = millis(); // variable du temps courant. Appel à la fonction millis() pour l'obtention de la valeur de ce temps
        SensorValue = analogRead(A0);
        i=map (SensorValue, 0, 1023, 0, 100);
        if ((i<=30) && (tempsCourant - tempsDepart >= dureeTempo))         //Condition : Detection de la nuit et tempo atteinte
          {
          tempsDepart = tempsCourant; // On sauvegarde la valeur du dernier tempsCourant
          while(digitalRead(FinCFerm) != 1){  //Tant que la porte n'est pas fermée, le moteur tourne dans le sens Fermeture
            motor.run(FORWARD);  
            }
        motor.run(RELEASE);    //On arrete le moteur car le contact fin de course est activé
        }   
        if ((i>50) && (tempsCourant - tempsDepart >= dureeTempo))         //Condition : Detection du jour et tempo atteinte
          {
           tempsDepart = tempsCourant;
           while(digitalRead(FinCOuv) != 1){  //Tant que la porte n'est pas ouverte, le moteur tourne dans le sens Ouverture  
            motor.run(BACKWARD);
            }
          motor.run(RELEASE);    //On arrete le moteur car le contact fin de course est activé
          }
     
        delay(1000); //petite attente
    }

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    vous avez le Adafruit Motor Shield ?

    La LDR ou photorésistance est un composant électronique dont la résistivité varie en fonction de la quantité de lumière incidente : plus elle est éclairée, plus sa résistivité baisse (Résistance, d'obscurité typiquement 1 à 20MΩ et quelques kΩ à la lumière). Je suppose que vous avez un pont de résistance avec la LDR (RLDR) + une résistance R en série.

    Si la LDR est reliée au 5V puis à la seconde résistance qui va au GND, avec A0 entre les 2 alors effectivement plus la valeur lue sur A0 est petite, plus il fait sombre (Vout = 5 x (R / (RLDR + R))) et votre test est fait dans le bon sens. Si c'est la LDR qui est sur GND, alors faut inverser le sens de vos tests. (Attention, une photorésistance est sensible à la chaleur. La mesure sera donc légèrement différente s'il fait très chaud ou très froid. votre réglage pour l'hiver ne sera sans doute pas identique à celui pour l'été)

    Vos contacteurs sont en INPUT_PULLUP, donc comme vous le dites "lorsque le bouton n'est pas appuyé on lit un état haut (HIGH)". Pourtant pour attendre un appui (donc état LOW) vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     while(digitalRead(FinCOuv) != HIGH) ...
    . ça ne semble pas logique,

    Pour gérer la tempo, une approche simple est de faire une machine à état.
    Par exemple quand la porte est OUVERTE, si vous détectez la nuit, vous passez dans un état TEMPO_FERMETURE.
    Dans cet état vous testez si la luminosité redépasse le seuil de la nuit alors vous abandonnez l'attente et revenez en état porte OUVERTE, sinon si le temps d'attente est écoulé, vous déclenchez la fermeture.

    (inversement quand la porte est fermée)

    le code pourrait ressembler à cela. Je l'ai tapé ici donc il se peut qu'il y ait des bugs. l'important c'est de comprendre l'idée des 4 états et ce que l'on doit tester dans chaque état, ce qui est fait dans le switch/case

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <AFMotor.h> //librairie shield Adafruit motor
    AF_DCMotor motor(1); //Moteur branché sur la sortie 1
     
    const byte photoPin = A0; // entrée de la photorésistance
    const byte FinCFerm = A1; // entrée du fin de course FERME. Une broche sur la masse l'autre sur A1
    const byte FinCOuv  = A2; // entrée du fin de course OUVERT. Une broche sur la masse l'autre sur A2
     
    enum : byte {OUVERTE, FERMEE, TEMPO_OUVERTURE, TEMPO_FERMETURE} etatPorte;
     
    unsigned long topChrono = 0;                  // déclaration de la variable qui va contenir la valeur du temps au départ
    const unsigned long dureeTempo = 300000UL;    // déclaration de la constante de durée de temporisation 300000ms = 5minutes
     
    void ouvrir()
    {
      motor.run(BACKWARD);                     // on active le sens ouverture
      while (digitalRead(FinCOuv) == HIGH);   // Tant que la porte n'est pas ouverte on attend
      motor.run(RELEASE);                     // On arrete le moteur car le contact fin de course est activé
      etatPorte = OUVERTE;
    }
     
    void fermer()
    {
      motor.run(FORWARD);                     // on active le sens fermeture
      while (digitalRead(FinCFerm) == HIGH);  // Tant que la porte n'est pas fermée on attend
      motor.run(RELEASE);                     // On arrete le moteur car le contact fin de course est activé
      etatPorte = FERMEE;
    }
     
    void setup()
    {
      pinMode(FinCFerm, INPUT_PULLUP);
      pinMode(FinCOuv, INPUT_PULLUP);
      motor.setSpeed(255);
      ouvrir();
    }
     
    void loop()
    {
      int luminosite = map (analogRead(photoPin), 0, 1023, 0, 100);   // plus on est proche de 0, plus c'est obscur
     
      switch (etatPorte) {
        case OUVERTE:
          // on est en position ouverte. Doit on se préparer à fermer ?
          if (luminosite <= 30) { // Detection de la nuit
            topChrono = millis(); // on note le moment
            etatPorte = TEMPO_FERMETURE;
          }
          break;
     
        case FERMEE:
          // on est en position fermée. Doit on se préparer à ouvrir ?
          if (luminosite > 50) { // Detection du jour
            topChrono = millis(); // on note le moment
            etatPorte = TEMPO_OUVERTURE;
          }
          break;
     
        case TEMPO_OUVERTURE:
          if (luminosite <= 50) etatPorte = FERMEE; // la condition n'a pas duré 5 minutes, on revient à l'état précédent
          else if (millis() - topChrono >= dureeTempo) ouvrir(); // sinon si le temps d'attente est écoulé, on ouvre.
          break;
     
        case TEMPO_FERMETURE:
          if (luminosite  > 30) etatPorte = OUVERTE; // la condition n'a pas duré 5 minutes, on revient à l'état précédent
          else if (millis() - topChrono >= dureeTempo) fermer(); // sinon si le temps d'attente est écoulé, on ferme.
          break;
      }
    }

    le mieux cependant pour éviter les soucis en cas d'orage, etc c'est de rajouter une RTC et gérer la porte en fonction de l'heure et du lever / coucher du soleil ce jour là...

  3. #3
    Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Août 2020
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Août 2020
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour le coup de main, le fonctionnement correspond exactement à ce que je recherchais, je n'avais pas pensé à faire ce genre de machine à état.

    Pour le while(digitalRead(FinCFerm) != HIGH), j'avais mis ça parce que j'avais utilisé le contact NF des fins de course au lieu du contact NO , mais j'avais pas corrigé le commentaire ; là, j'ai tout remis dans le bon sens

    Merci encore

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    cool - amusez vous bien !

    (rajoutez une tempo éventuellement lors des mouvement moteur au cas où le fin de course ne fonctionne pas)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MLD] gestion de portes automatiques
    Par kaalii dans le forum Schéma
    Réponses: 3
    Dernier message: 08/05/2012, 15h05
  2. [MCD] gestion de portes automatiques
    Par kaalii dans le forum Schéma
    Réponses: 2
    Dernier message: 01/05/2012, 21h59
  3. Choisir un port automatiquement
    Par alouha dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 29/01/2009, 02h02
  4. [PHP-JS] Fermeture automatique temporisée de fenètre
    Par malabarbe dans le forum Langage
    Réponses: 8
    Dernier message: 28/02/2008, 19h00
  5. [socket] port automatique
    Par hogan dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 18/07/2005, 21h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo