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 :

Amélioration de code : temporisation à ajouter


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Décembre 2020
    Messages : 13
    Par défaut Amélioration de code : temporisation à ajouter
    Bonjour,

    je souhaiterais améliorer mon code avec une temporisation qui arrête le moteur même si le fin de course n'est pas atteint au bout d'un certain temps et sans qu'il puisse se réenclencher tant que la valeur de la photorésistance n'a pas changer d'état inverse.

    Description :
    1 fin de course haut
    1 fin de course bas
    1 moteur CC
    une photorésistance qui mesure la luminosité extérieur
    un seuil sous 100 fermeture
    un seuil au dessus 150 ouverture

    Le code :

    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
    // Déclaration des variables et des constantes
    int PhotoR = A0;// entrée analogique de la photorésistance
    int FinCHaut = 5;// entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
    int FinCBas = 6;// entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
    int D2 = 2;//monté
    int D3 = 3;//descente
     
    //variable pour stocker la valeur lue après conversion
    int PhotoRLue;
     
    void setup()
    {
    Serial.begin(9600); // démarrage la liaison série entre entrée analogique et ordi
    pinMode(FinCHaut, INPUT_PULLUP); //Déclaration des contacts fin de course en entrée avec utilisation de la fonction PULLUP interne
    pinMode(FinCBas, INPUT_PULLUP); //Les Pull Up sont des résistances internes à l'arduino. //Donc de base lorsque le boutton n'est pas appuyé on lit un état haut (5V = niveau logique 1)
    }
     
    void loop()
    {
        PhotoRLue = analogRead(PhotoR); //Valeur comprise entre 0 et 1024
        Serial.print("PhotoRLue = "); //on affiche la valeur lue sur la liaison série
        Serial.print(PhotoRLue);
        Serial.println(); //on saute une ligne entre deux affichages
     
        if (PhotoRLue <100 & digitalRead(FinCBas) == 1)         //Condition : Detection de la nuit et la porte est ouverte
        //Alors on ferme la porte
        {
          while(digitalRead(FinCBas) == 1){  //Tant que la porte n'est pas fermé, le moteur tourne   
              //Fermeture
            digitalWrite(D2, LOW);
            digitalWrite(D3, HIGH);
          }
            digitalWrite(D3, LOW);    //On arrete le moteur car le contact fin de course est activé
        }   
        if (PhotoRLue > 150 && digitalRead(FinCHaut) == 0)         //Condition : Detection du jour et la porte est fermée FinCHaut = 1 signifie le boutton fin de course haut n'est pas appuyé
        {
                while(digitalRead(FinCHaut) == 0){  //Tant que la porte n'est pas ouverte, le moteur tourne   
              //Fermeture
            digitalWrite(D2, HIGH);
            digitalWrite(D3, LOW);
          }
        digitalWrite(D2, LOW);
        }
    }
    Images attachées Images attachées  

  2. #2
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Décembre 2020
    Messages : 13
    Par défaut
    Je pense qu'il faudrait que je rajoute une condition comme dire quand la lecture de la LDR et inférieur a 100 il écrit nuit et quand elle et supérieur a 200 par exemple elle écrit jour et de ce fait je récupére l'infos jour ou nuit pour faire les commande du moteur avec arrêt au bout d'un certain temps, cela permet que si la lumière bouge de ne pas réactiver le moteur même si le fdc ne fonctionne pas.

    Mais je n'arrive pas a coder , merci pour votre aide ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (PhotoRLue < 100) {
        Serial.println(" - nuit");
      } else if (PhotoRLue > 200) {
        Serial.println(" - jour")

  3. #3
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    avec une temporisation qui arrête le moteur même si le fin de course n'est pas atteint au bout d'un certain temps
    La condition d'arrêt est donc un OU logique entre "temps écoulé" OU "fin de course atteint

    Le "plus simple" serait de faire une petite machine à état.

    Votre système a 4 états possibles que l'on peut stoker dans une variable etat qui prendrait 4 valeurs. On fait cela avec une énumération
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum : byte {EN_OUVERTURE, OUVERTE, EN_FERMETURE, FERMEE} etat;
    Ensuite il suffit d'écouter les événements pertinents en fonction de l'état et prendre les actions qui s'imposent et changer d'état le cas échéant.

    La structure du code pourrait alors être comme cela: (je vous ai laissé du boulot )

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    // Déclaration des variables et des constantes
    const byte pinPhotoR    = A0; // entrée analogique de la PhotoRésistance
    const byte pinFinCHaut  = 5;  // entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
    const byte pinFinCBas   = 6;  // entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
    const byte pinMontee    = 2;  // bouton montée
    const byte pinDescente  = 3;  // bouton descente
    const unsigned long tempsMaxCourse = 5000;  // le moteur tourne maximum pendant ce temps en ms
     
    const int seuilNuit = 100;  // si luminosité < seuilNuit alors il fait nuit
    const int seuilJour = 150;  // si luminosité > seuilJour alors il fait Jour
     
    enum : byte {EN_OUVERTURE, OUVERTE, EN_FERMETURE, FERMEE} etat;
    unsigned long debutMouvement;
     
     
    bool ilFaitNuit() {     // retourne true s'il fait nuit
      return ... ; // A ECRIRE
    }
     
    bool ilFaitJour() {    // retourne true s'il fait jour
      return ... ;  // A ECRIRE
    }
     
    void ouvrir() {      // lancer le moteur dans le sens ouverture
      ... // A ECRIRE
      debutMouvement = millis();
      etat = EN_OUVERTURE;
    }
     
    void fermer() {     // lancer le moteur dans le sens fermeture
      ... // A ECRIRE
      debutMouvement = millis();
      etat = EN_FERMETURE;
    }
     
    void arret() {       // arret du moteur
      ... // A ECRIRE
    }
     
    void gestionPorte() {
      switch (etat) {
        // on est en ouverture, on vérifie s'il faut s'arrêter
        case EN_OUVERTURE:
          if ((digitalRead(pinFinCHaut) == LOW) || (millis() - debutMouvement >= tempsMaxCourse)) {
            arret();
            etat = OUVERTE;
          }
          break;
     
        // on est ouvert, on vérifie s'il faut lancer la fermeture, cest à dire s'il fait nuit
        case OUVERTE:
          if (ilFaitNuit()) fermer();
          break;
     
        // on est en fermeture, on vérifie s'il faut s'arrêter
        case EN_FERMETURE:
          ... // à faire
     
          break;
     
        // on est fermé, on vérifie s'il faut lancer l'ouverture, cest à dire s'il fait jour
        case FERMEE:
          ... // à faire
          break;
      }
    }
     
    void setup() {
      pinMode(pinFinCHaut, INPUT_PULLUP);
      pinMode(pinFinCBas, INPUT_PULLUP);
      pinMode(pinMontee, OUTPUT);
      pinMode(pinDescente, OUTPUT);
      pinMode(pinPhotoR, INPUT);
      ouvrir();
    }
     
    void loop() {
      gestionPorte();
    }

  4. #4
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Décembre 2020
    Messages : 13
    Par défaut
    merci pour ton aide, tu ma fait un beau travail, mais il y a bien un mais je ne suis pas pro
    mais je bute un peu sur bool ilfaitjour return !! je ne sais pas quoi mettre et
    j'ai rempli la ou tu m'a dit sans trop de certitude si tu peu me dire si c'est bon.
    Merci

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    // Déclaration des variables et des constantes
    const byte pinPhotoR    = A0; // entrée analogique de la PhotoRésistance
    const byte pinFinCHaut  = 5;  // entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
    const byte pinFinCBas   = 6;  // entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
    const byte pinMontee    = 2;  // bouton montée
    const byte pinDescente  = 3;  // bouton descente
    const unsigned long tempsMaxCourse = 5000;  // le moteur tourne maximum pendant ce temps en ms
     
    const int seuilNuit = 100;  // si luminosité < seuilNuit alors il fait nuit
    const int seuilJour = 150;  // si luminosité > seuilJour alors il fait Jour
     
    enum : byte {EN_OUVERTURE, OUVERTE, EN_FERMETURE, FERMEE} etat;
    unsigned long debutMouvement;
     
     
    bool ilFaitNuit() {     // retourne true s'il fait nuit
      return ... ; // A ECRIRE
    }
     
    bool ilFaitJour() {    // retourne true s'il fait jour
      return ... ;  // A ECRIRE
    }
     
    void ouvrir() {      // lancer le moteur dans le sens ouverture
      digitalWrite(pinMontee, LOW);
      digitalWrite(pinDescente, HIGH); // A ECRIRE
      debutMouvement = millis();
      etat = EN_OUVERTURE;
    }
     
    void fermer() {     // lancer le moteur dans le sens fermeture
      digitalWrite(pinMontee, HIGH);
      digitalWrite(pinDescente, LOW);// A ECRIRE
      debutMouvement = millis();
      etat = EN_FERMETURE;
    }
     
    void arret() {       // arret du moteur
      digitalWrite(pinMontee, LOW);
      digitalWrite(pinDescente, LOW); // A ECRIRE
    }
     
    void gestionPorte() {
      switch (etat) {
        // on est en ouverture, on vérifie s'il faut s'arrêter
        case EN_OUVERTURE:
          if ((digitalRead(pinFinCHaut) == LOW) || (millis() - debutMouvement >= tempsMaxCourse)) {
            arret();
            etat = OUVERTE;
          }
          break;
     
        // on est ouvert, on vérifie s'il faut lancer la fermeture, cest à dire s'il fait nuit
        case OUVERTE:
          if (ilFaitNuit()) fermer();
          break;
     
        // on est en fermeture, on vérifie s'il faut s'arrêter
        case EN_FERMETURE:
          if ((digitalRead(pinFinCBas) == LOW) || (millis() - debutMouvement >= tempsMaxCourse)) {
            arret();
            etat = FERMER;
          } // à faire
     
          break;
     
        // on est fermé, on vérifie s'il faut lancer l'ouverture, cest à dire s'il fait jour
        case FERMEE:
          if (ilFaitJour()) ouvrir(); // à faire
          break;
      }
    }
     
    void setup() {
      pinMode(pinFinCHaut, INPUT_PULLUP);
      pinMode(pinFinCBas, INPUT_PULLUP);
      pinMode(pinMontee, OUTPUT);
      pinMode(pinDescente, OUTPUT);
      pinMode(pinPhotoR, INPUT);
      ouvrir();
    }
     
    void loop() {
      gestionPorte();
    }

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    c'est pas mal du tout

    attention à l'orthographe des mots clés alors que dans l'enum on a dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum : byte {EN_OUVERTURE, OUVERTE, EN_FERMETURE, FERMEE} etat;
    pour la fonction ilFaitNuit, ce n'est pas super compliqué. il suffit de retourner vrai si la lecture de la photo résistance est inférieure au seuil, donc un truc comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool ilFaitNuit() {     // retourne true s'il fait nuit
      return (analogRead(pinPhotoR) < seuilNuit); 
    }
    à quoi pourrait bien ressembler la fonction ilFaitJour() ? on se demande ...

  6. #6
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Décembre 2020
    Messages : 13
    Par défaut
    code final

    Merci cela fonctionne au simulateur reste à essayer en pratique. tu es un pro, si tu habite dans l'herault je te paye une bière quand les bar ré-ouvre avec plaisir.

    j'aime comprendre et je comprend cela : si entrée fdc haut egal a 0 ET temps - debut de mouv. superieur temps max mouvement j’arrête et mon état devient ouvert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ((digitalRead(pinFinCHaut) == LOW) || (millis() - debutMouvement >= tempsMaxCourse)) {
            arret();
            etat = OUVERTE;
          }
          break;

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    // Déclaration des variables et des constantes
    const byte pinPhotoR    = A0; // entrée analogique de la PhotoRésistance
    const byte pinFinCHaut  = 5;  // entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
    const byte pinFinCBas   = 6;  // entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
    const byte pinMontee    = 2;  // bouton montée
    const byte pinDescente  = 3;  // bouton descente
    const unsigned long tempsMaxCourse = 5000;  // le moteur tourne maximum pendant ce temps en ms
     
    const int seuilNuit = 100;  // si luminosité < seuilNuit alors il fait nuit
    const int seuilJour = 150;  // si luminosité > seuilJour alors il fait Jour
     
    enum : byte {EN_OUVERTURE, OUVERTE, EN_FERMETURE, FERMEE} etat;
    unsigned long debutMouvement;
     
     
    bool ilFaitNuit() {     // retourne true s'il fait nuit
      return (analogRead(pinPhotoR) < seuilNuit); // A ECRIRE
    }
     
    bool ilFaitJour() {    // retourne true s'il fait jour
      return (analogRead(pinPhotoR) > seuilJour);  // A ECRIRE
    }
     
    void ouvrir() {      // lancer le moteur dans le sens ouverture
      digitalWrite(pinMontee, LOW);
      digitalWrite(pinDescente, HIGH); // A ECRIRE
      debutMouvement = millis();
      etat = EN_OUVERTURE;
    }
     
    void fermer() {     // lancer le moteur dans le sens fermeture
      digitalWrite(pinMontee, HIGH);
      digitalWrite(pinDescente, LOW);// A ECRIRE
      debutMouvement = millis();
      etat = EN_FERMETURE;
    }
     
    void arret() {       // arret du moteur
      digitalWrite(pinMontee, LOW);
      digitalWrite(pinDescente, LOW); // A ECRIRE
    }
     
    void gestionPorte() {
      switch (etat) {
        // on est en ouverture, on vérifie s'il faut s'arrêter
        case EN_OUVERTURE:
          if ((digitalRead(pinFinCHaut) == LOW) || (millis() - debutMouvement >= tempsMaxCourse)) {
            arret();
            etat = OUVERTE;
          }
          break;
     
        // on est ouvert, on vérifie s'il faut lancer la fermeture, cest à dire s'il fait nuit
        case OUVERTE:
          if (ilFaitNuit()) fermer();
          break;
     
        // on est en fermeture, on vérifie s'il faut s'arrêter
        case EN_FERMETURE:
          if ((digitalRead(pinFinCBas) == LOW) || (millis() - debutMouvement >= tempsMaxCourse)) {
            arret();
            etat = FERMEE;
          } // à faire
     
          break;
     
        // on est fermé, on vérifie s'il faut lancer l'ouverture, cest à dire s'il fait jour
        case FERMEE:
          if (ilFaitJour()) ouvrir(); // à faire
          break;
      }
    }
     
    void setup() {
      pinMode(pinFinCHaut, INPUT_PULLUP);
      pinMode(pinFinCBas, INPUT_PULLUP);
      pinMode(pinMontee, OUTPUT);
      pinMode(pinDescente, OUTPUT);
      pinMode(pinPhotoR, INPUT);
      ouvrir();
    }
     
    void loop() {
      gestionPorte();
    }

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Cool. Je ne suis pas dans le coin mais sympa !

    Le || c’est un OU pas un ET

    C’est à dire quand la première des conditions se produit on passe à l’état suivant

  8. #8
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Décembre 2020
    Messages : 13
    Par défaut
    Merci, quand tu vient en vacances on se bois un verre.

    Est ce que c'est facile de rajouter 2 entrées monté et descente forcé. J'ai beau chercher mais je n'y arrive pas ?!

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Citation Envoyé par djgary Voir le message
    Merci, quand tu vient en vacances on se bois un verre.
    Je suis toujours en vacances (retraité)

    Citation Envoyé par djgary Voir le message
    Est ce que c'est facile de rajouter 2 entrées monté et descente forcé. J'ai beau chercher mais je n'y arrive pas ?!
    vous voulez rajouter un bouton qui force le mouvement? ça devient un mode manuel et Il faudra définir alors comment vous ressortez du mode manuel. (parce que sinon le mouvement va se faire mais s'il en s'était pas déclenché, vous risquez que l'opération inverse se déclenche instantanément juste après)

    donc éventuellement 1 interrupteur + 2 boutons.
    - L'interrupteur défini si on est en mode manuel ou automatique
    - les boutons ne sont opérationnels qu'en mode manuel et lancent la fermeture ou ouverture

    dans ce cas le code de la boucle commencerait par tester la position de l'interrupteur. Si on est on mode auto, alors on fait le code qui existe déjà. Si on est en mode manuel alors il faut écrire un autre petit code assez similaire mais au lieu de tester "ilFaitJour()" on va tester l'appui du bouton correspondant - idem pour la nuit

  10. #10
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Décembre 2020
    Messages : 13
    Par défaut
    Alors oui bonne analyse du fonctionnement a faire. J'ai essayer cela mais cela ne fonctionne pas.

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    // Déclaration des variables et des constantes
    const byte pinPhotoR    = A0; // entrée analogique de la PhotoRésistance
    const byte pinFinCHaut  = 5;  // entrée du fin de course HAUT. Une broche sur la masse l'autre sur l'arduino
    const byte pinFinCBas   = 6;  // entrée du fin de course BAS. Une broche sur la masse l'autre sur l'arduino
    const byte pinMontee    = 2;  // bouton montée
    const byte pinDescente  = 3;  // bouton descente
    const byte pinManuAuto  = 4;  // Mode Manuel ou Auto
    const byte pinManuM = 8;  // Manuel Bouton Montée
    const byte pinManuD = 9;  // Manuel Bouton Descente
     
    const unsigned long tempsMaxCourse = 5000;  // le moteur tourne maximum pendant ce temps en ms
     
    const int seuilNuit = 100;  // si luminosité < seuilNuit alors il fait nuit
    const int seuilJour = 150;  // si luminosité > seuilJour alors il fait Jour
     
    enum : byte {EN_OUVERTURE, OUVERTE, EN_FERMETURE, FERMEE} etat;
    unsigned long debutMouvement;
     
     
    bool ilFaitNuit() {     // retourne true s'il fait nuit
      return (analogRead(pinPhotoR) < seuilNuit); // A ECRIRE
    }
     
    bool ilFaitJour() {    // retourne true s'il fait jour
      return (analogRead(pinPhotoR) > seuilJour);  // A ECRIRE
    }
     
    void ouvrir() {      // lancer le moteur dans le sens ouverture
      digitalWrite(pinMontee, LOW);
      digitalWrite(pinDescente, HIGH); // A ECRIRE
      debutMouvement = millis();
      etat = EN_OUVERTURE;
    }
     
    void fermer() {     // lancer le moteur dans le sens fermeture
      digitalWrite(pinMontee, HIGH);
      digitalWrite(pinDescente, LOW);// A ECRIRE
      debutMouvement = millis();
      etat = EN_FERMETURE;
    }
     
    void arret() {       // arret du moteur
      digitalWrite(pinMontee, LOW);
      digitalWrite(pinDescente, LOW); // A ECRIRE
    }
     
    void Manuel() {
        switch (etat) {
        // on est en ouverture, on vérifie s'il faut s'arrêter
        case EN_OUVERTURE:
          if ((digitalRead(pinFinCHaut) == LOW) || (millis() - debutMouvement >= tempsMaxCourse)) {
            arret();
            etat = OUVERTE;
          }
          break;
     
        // on est ouvert, on vérifie s'il faut lancer la fermeture, cest à dire s'il fait nuit
        case OUVERTE:
          if (pinManuM == LOW) fermer();
          break;
     
        // on est en fermeture, on vérifie s'il faut s'arrêter
        case EN_FERMETURE:
          if ((digitalRead(pinFinCBas) == LOW) || (millis() - debutMouvement >= tempsMaxCourse)) {
            arret();
            etat = FERMEE;
          } // à faire
     
          break;
     
        // on est fermé, on vérifie s'il faut lancer l'ouverture, cest à dire s'il fait jour
        case FERMEE:
          if (pinManuD == LOW)) ouvrir(); // à faire
          break;
      }
    }
     
    void gestionPorte() {
      switch (etat) {
        // on est en ouverture, on vérifie s'il faut s'arrêter
        case EN_OUVERTURE:
          if ((digitalRead(pinFinCHaut) == LOW) || (millis() - debutMouvement >= tempsMaxCourse)) {
            arret();
            etat = OUVERTE;
          }
          break;
     
        // on est ouvert, on vérifie s'il faut lancer la fermeture, cest à dire s'il fait nuit
        case OUVERTE:
          if (ilFaitNuit()) fermer();
          break;
     
        // on est en fermeture, on vérifie s'il faut s'arrêter
        case EN_FERMETURE:
          if ((digitalRead(pinFinCBas) == LOW) || (millis() - debutMouvement >= tempsMaxCourse)) {
            arret();
            etat = FERMEE;
          } // à faire
     
          break;
     
        // on est fermé, on vérifie s'il faut lancer l'ouverture, cest à dire s'il fait jour
        case FERMEE:
          if (pinManuM == LOW()) ouvrir(); // à faire
          break;
      }
    }
     
    void setup() {
      pinMode(pinFinCHaut, INPUT_PULLUP);
      pinMode(pinFinCBas, INPUT_PULLUP);
      pinMode(pinMontee, OUTPUT);
      pinMode(pinDescente, OUTPUT);
      pinMode(pinPhotoR, INPUT);
      pinMode(pinManuAuto, INPUT_PULLUP);
      pinMode(pinManuM, INPUT_PULLUP);
      pinMode(pinManuD, INPUT_PULLUP);
      ouvrir();
    }
     
    void loop() {
      if (pinManuAuto == HIGH) {
            void gestionPorte();
      }
      else {
        (void Manuel);
      }
    }

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    C'est globalement l'idée, il y a quelques petites erreurs

    1/ D'après vous combien vaut pinManuAuto si vous la déclarez comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const byte pinManuAuto  = 4;  // Mode Manuel ou Auto
    une fois répondu à cette question, pensez vous que ce test puisse fonctionner?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if (pinManuAuto == HIGH) {
    la même question est valable pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (pinManuM == LOW) fermer();
    et pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (pinManuD == LOW)) ouvrir();
    2/ est-ce comme cela qu'on appelle une fonction?3/ et (même si ça va fonctionner), est-ce comme cela qu'on avait écrit l'appel à gestionPorte précédemment?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      if (pinManuAuto == HIGH) {
            void gestionPorte();
      }
    pourquoi avez vous rajouté void devant?

  12. #12
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Décembre 2020
    Messages : 13
    Par défaut
    plutôt ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (pinManuAuto == 1) {
     
    if (pinManuM == 1) fermer();
     
    if (pinManuD == 1) ouvrir();
    2/ 3/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (pinManuAuto == 1) {
           gestionPorte();
      }

  13. #13
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Bravo pour les fonctions mais Non pour les if...

    Je repose la question... Si vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     const byte pinManuAuto  = 4;  // Mode Manuel ou Auto
    quelle est la valeur de pinManuAuto ? C’est une constante, un numéro de pin, croyez vous qu’il y a la moindre chance qu’elle puisse valoir 1 ou HIGH ?

    (Petit indice: à quoi sert la fonction digitalRead() que vous utilisez par ailleurs ? )

  14. #14
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Décembre 2020
    Messages : 13
    Par défaut
    en faite il faudrait plutôt écrire : int pinManuAuto = 4; // Mode Manuel ou Auto ?

  15. #15
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Non non le numéro de pin est constant...

    C’est juste que le test qui vous intéresse porte sur l’état de la pin et pas son numéro... il faut donc appeler la fonction ...... pour lire l’état de la pin

Discussions similaires

  1. [XL-2007] Comment améliorer mon code pour ajout et modification de user code
    Par capi81 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/08/2014, 14h16
  2. Code blocks ajouter un .lib
    Par gl0be dans le forum Code::Blocks
    Réponses: 7
    Dernier message: 09/09/2006, 15h04
  3. Acceder par code a Ajout/Suppression de programme
    Par Ben_Le_Cool dans le forum Delphi
    Réponses: 1
    Dernier message: 13/07/2006, 08h49
  4. [Sécurité] Comment amélioré mon code ?
    Par Nadd dans le forum Langage
    Réponses: 14
    Dernier message: 03/03/2006, 20h13

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