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 :

Problème de temporisation (débutant)


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    conducteur de train
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : conducteur de train

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Problème de temporisation (débutant)
    Bonjour a tous,

    Debutant sur arduino, je trouve ce système sympa et je commence a my plancher dessus.

    Pour ma 1ere application, je souhaite faire une prog qui lorsque on ouvre la porte la lumiere s'allume! rien de sorcier. Ensuite lorsque que son ferme cette porte la lumière reste allumé X temps, jusque la tout va bien!

    mais, j'aurais aimé avoir une tempo supplémentaire, que si, la porte reste ouverte Trop longtemps la lumiere ce coupe et c'est la ou je seiche

    Pour la tempo j'ai trouvé un code sur le net et modifier pour mon fonctionnement tout vas bien, mais impossible de trouver comment y ajouter la dernière tempo, des idées?
    Je le redis, entièrement débutant en Arduino mais connais assez bien l'électronique

    Merci a tous de votre aide


    voici mon 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    const int Broche_BP = 2;
    const int Broche_LED = 4;
     
    int Etat_BP = 0;
    int Ordre_Tempo = 0;
    int LED = 0;
     
    unsigned long Temps_Actuel;
    unsigned long Temps_Precedent;
     
    unsigned long Tempo_Repos = 5000; // Temps de la temporisation apres fermeture porte 
     
    void setup() {
      pinMode(Broche_BP, INPUT_PULLUP);
      pinMode(Broche_LED, OUTPUT);
    }
     
    void loop() {
     
      Temps_Actuel = millis();
     
      //GESTION TEMPORISATION REPOS---------------------------------------------------
     
      Etat_BP = digitalRead(Broche_BP);
     
      if (Etat_BP == LOW) {
        Temps_Precedent = Temps_Actuel;
        Ordre_Tempo = 1;
      }
     
      if (Ordre_Tempo == 1) {
        if ((Temps_Actuel -  Temps_Precedent) < Tempo_Repos) {
          LED = 1;
        }
     
        else {
          LED = 0;
          Ordre_Tempo = 0;
     
     }
     
     
     
    } 
     
     
     
     
      //FIN GESTION TEMPORISATION REPOS
      //------------------------------------------------------------------------------
      //GESTION ARRET / MARCHE LED
     
     
      if (LED == 1 ) {
          digitalWrite(Broche_LED, HIGH);
      }
      else {
        digitalWrite(Broche_LED, LOW);
      }
     
    }

  2. #2
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    Bonjour,

    un pseudo code (loop). Le contenu de la variable lumiere indique le statut de la lumière et la porte.
    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
     
    int lumiere
    int porte
    int pinPorte
    int pinLumiere
    int start
    const int tempsPorte = 5000 //ms
     
    setup()
    {
      // initialisation E/S
      // .......
     
      // init variable :
      lumiere = 0
    }
     
    loop()
    {
    porte = digitalRead(pinPorte)
     
    si porte == HIGH alors  // porte ouverte
     
      // allume
       si lumiere == 0alors
          lumiere = 1
          digitalWrite(pinLumiere, HIGH)
          start = millis()
       fin si
     
      // si porte ouverte trop longtemps, on éteint
       si millis()-start  > tempsPorte && lumiere==1 alors
          lumiere = 2
          digitalWrite(pinLumiere, LOW)
       fin si
     
    sinon // porte fermee
     
       // éteint
       si lumiere==1 ou lumiere==2 alors
          lumiere = 0
          digitalWrite(pinLumiere, LOW)
       fin si
     
    fin si
    }

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    conducteur de train
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : conducteur de train

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Bonjour,

    un pseudo code (loop). Le contenu de la variable lumiere indique le statut de la lumière et la porte.
    Merci pour cette réponse rapide,

    Je suis en train d 'étudier cela. est ce que je démarre bien?


    `
    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
     
    int lumiere = 0;
    int porte;
    const int pinPorte = 10;
    const int pinLumiere = 2;
    int start;
    const int tempsPorte = 5000; //ms
     
     
     
     
    void setup() {
     
     
      // initialisation E/S
      pinMode(pinPorte, INPUT);
      pinMode(pinLumiere, OUTPUT);
     
      // .......
     
      // init variable :
     
     
     
    }
     
    void loop() {
     
      porte = digitalRead(pinPorte); {
     
              if (porte == LOW)    // porte ouverte
     
              // allume
     
              if (lumiere == 0)
     
              lumiere = 1;
     
               digitalWrite(pinLumiere, HIGH);
     
               start = millis();     }     
     
     
     
     
     
                               // si porte ouverte trop longtemps, on éteint
     
                                      if ((millis() - start)  > (tempsPorte && lumiere == 1)) {
     
                                lumiere = 2;
                                          digitalWrite(pinLumiere, LOW);}
     
                                          else // porte fermee
     
                                          digitalWrite(pinLumiere, LOW);
     
     
     
     
                 }

  4. #4
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 647
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 647
    Points : 11 136
    Points
    11 136
    Par défaut
    Il faut revoir sérieusement la syntaxe du if :
    https://www.arduino.cc/reference/en/...-structure/if/
    https://cpp.developpez.com/cours/cpp/?page=page_4

    Et les accolades.

  5. #5
    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
    Et attention aux types. Pour stocker le temps (millis dans start) il faut un unsigned long, pas un int sinon vous allez vite déborder.

    Pour tempsPorte, il serait aussi mieux en unsigned (int ou long en fonction du temps Max que vous voulez pouvoir gérer)

    Les pins peuvent être des const byte, un seul octet suffit.

    La variable porte ne sert pas à grand chose, vous pouvez tester directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (digitalRead(pinPorte) == LOW) {
       ....
    } else {
       ...
    }
    Pour rendre le code plus lisible, on peut nommer les états de la lumière. Au lieu de le déclarer en int, on peut la déclarer comme type énuméré, la variable pouvant prendre une des valeurs fourni dans la liste entre accolades
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum : byte {ETEINTE, ALLUMEE, TEMPO_TERMINEE } lumiere ;
    et par exemple au lieu de faire lumiere = 0; on peut alors écrire lumiere = ETEINTE; c’est plus compréhensible.


    avez vous mis un pull down sur votre capteur de porte ?

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    conducteur de train
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : conducteur de train

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Auteur Voir le message
    merci je reprends toute la lecture... ça va rentrer a force lol

    Citation Envoyé par Jay M Voir le message
    merci pour ces infos,

    Le capteur de porte et un inter magnétique, avec une résistance de pull-up et un condo au borne de l inter

  7. #7
    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
    Le capteur de porte et un inter magnétique, avec une résistance de pull-up et un condo au borne de l inter
    OK donc le test peut se faire simplement sans se soucier des rebonds sans doute.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    conducteur de train
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : conducteur de train

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    quel casse tête pour un débutant lol

    ouverture de la porte avec allumage lumière ok!
    fermeture de la porte avec extinction lumière ok!

    mais impossible a inclure la fonction tempo !

    la lumière c'éteints au bout de 5 secondes après le démarrage du programme puis reste éteinte quoi qu'il ce passe grrrrrrr

    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
    enum : byte {ETEINTE, ALLUMEE, TEMPO_TERMINEE } lumiere ;
    const int pinPorte = 10;
    const int pinLumiere = 2;
    unsigned long start;
     
    unsigned long tempoPorte = 5000; // tempo apres fermeture de la porte
    unsigned long tempoTerminee = 5000; // tempo si oubli fermeture porte
     
    int tempoFin;
     
     
     
    void setup() {
     
    pinMode(pinPorte, INPUT);
    pinMode(pinLumiere, OUTPUT);
     
     // init variable :
     
     byte ETEINTE = 0;
     byte ALLUMEE = 1;
     byte TEMPO_TERMINEE = 0;
    Serial.begin(9600);
    }
     
    void loop() 
     
     
    {
     
     
     
     
     
     
     
      if (digitalRead(pinPorte) == HIGH) {
      lumiere = ETEINTE;
     }
     
    // Ouverture Porte avec demarrage du temps
     
     
      if (digitalRead(pinPorte) == LOW) {{
      lumiere = ALLUMEE;                            // porte ouverte
      tempoFin = millis (); }
     
     
     
      if ((lumiere == ALLUMEE) && ((tempoFin) > (tempoTerminee))){
        lumiere = ETEINTE; }}                                           // oubli porte ouverte
     
     
     
     
     
     
     
     
     
     
     //GESTION ARRET / MARCHE LUMIERE
     
     
      if (lumiere == ALLUMEE ) {
          digitalWrite(pinLumiere, HIGH);
      }
      else {
        digitalWrite(pinLumiere, LOW);
      }
     
     Serial.print(";lumiere : "); Serial.print(lumiere);
      Serial.print("; tempoFin : "); Serial.print(tempoFin);
    Serial.print("; milis() : "); Serial.print(millis());
     
     
     
    }

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    conducteur de train
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : conducteur de train

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Je pense avoir trouvé la solution!! Houra....
    Si un expert peu me confirmer cela

    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
    enum : byte {ETEINTE, ALLUMEE, TEMPO_TERMINEE } lumiere ;
    const int pinPorte = 10;
    const int pinLumiere = 2;
    unsigned long start;
     
    unsigned long tempoPorte = 5000; // tempo apres fermeture de la porte
    unsigned long tempoTerminee = 2000; // tempo si oubli fermeture porte
     
    int tempoFin;
    int temps_Actuel;
     
     
    void setup() {
     
    pinMode(pinPorte, INPUT);
    pinMode(pinLumiere, OUTPUT);
     
     // init variable :
     
     byte ETEINTE = 0;
     byte ALLUMEE = 1;
     byte TEMPO_TERMINEE = 0;
     
    }
     
    void loop() 
     
     
    {
     
      temps_Actuel = millis();
     
     
     
     
     
     
     
      if (digitalRead(pinPorte) == HIGH) { // porte fermee
      lumiere = ETEINTE;
          tempoFin = temps_Actuel;
     
     }
     
      if (digitalRead(pinPorte) == LOW) {    // Ouverture de la porte 
      lumiere = ALLUMEE;
     
      }
    // si la porte reste trop longtemps ouverte la lumiere ce coupe 
      {
     
      if ((lumiere == ALLUMEE) && (((temps_Actuel) - (tempoFin)) < (tempoTerminee))){
        lumiere = ALLUMEE; }
     
    else (lumiere = ETEINTE);
     
      }
     
     
     
     
     //GESTION ARRET / MARCHE LUMIERE
     
     
      if (lumiere == ALLUMEE ) {
          digitalWrite(pinLumiere, HIGH);
      }
      else {
        digitalWrite(pinLumiere, LOW);
      }
     
     
     
     
    }

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    conducteur de train
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : conducteur de train

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Je suis plutôt content pour ce 1er code qui fonctionne (je sais c'est basique mais c'est ce que je voulais pour un début)

    Maintenant, je cherche a intégrer une tempo supplémentaire sans utiliser delay.

    En gros

    porte fermée = lumière éteinte

    porte ouverte = lumière allumée

    si la porte reste ouverte trop longtemps = lumière éteinte

    Jusqu'à la ça fonctionne mais j'aimerais rajouter:

    a la fermeture de la porte, lumière reste allumée X seconde et c'est la ou je bloque, j'ai essayer tout un tas de chose mais rien a faire GRRRRR

    Si une âme charitable pouvait me mettre sur la piste...

  11. #11
    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
    temps_Actuel doit être de quel type selon vous ?

    Relisez ce qui vaut été proposé ci dessous en pseudo code. Est-ce que ça correspond ?

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    conducteur de train
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : conducteur de train

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    franchement je me casse la tête la dessus et je vois pas.

    J'ai bien regardé le pseudo code de Auteur mais je ne vois pas non plus la tempo fermeture de porte

    Bon deja la 1ere partie de mon code fonctionne et la je comprends pourquoi.

    Mais pour le reste j'ai du mal

  13. #13
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    Salut,

    Voici une piste possible. En mode économique car édition sur téléphone, dsl.
    Sans factorisation pour montrer la logique.

    Code C++ : 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
    enum : uint8_t {UNKNOWN, CLOSE , OPEN} previous_door_stat;
     
    using millis_t= decltype(millis()); // type inference 
    enum Timeout : millis_t {CLOSE_TIMEOUT= 3000, OPEN_TIMEOUT= 5000};
    millis_t start_time; 
     
    setup:
     
      // pins configuration only
     
    loop : (pseudocode)
     
    is door open                            // => door digital_read
        if previous_door_stat not OPEN
            if light off                    // => light digital_read 
                turn_on light               // => light digital_write
            reset_timer                     // => start_time= millis()
            previous_door_stat= OPEN
        if light on
            if elapsed OPEN_TIMEOUT         // if ((millis() - start_time) > OPEN_TIMEOUT) ...
                turn_off light 
     
    is door close
        if previous_door_stat not CLOSE
            reset_timer
            previous_door_stat= CLOSE
        if light on 
            if elapsed CLOSE_TIMEOUT
                turn_off light

    Edit:

    Je ne sais pas d'où viennent les *************** !? Sans clavier il m'est impossible de revenir dessus.

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    conducteur de train
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : conducteur de train

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Ok merci, je vais essayé de faire le code avec tes infos...
    Je te tiens au courant des que j'avance

    merci a toi pour ton aide

  15. #15
    Membre éprouvé
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 94
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 562
    Points : 1 253
    Points
    1 253
    Par défaut
    J'ai réédité le code.

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    conducteur de train
    Inscrit en
    Août 2020
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : conducteur de train

    Informations forums :
    Inscription : Août 2020
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par kaitlyn Voir le message
    J'ai réédité le code.
    ok merci j'y vois deja plus clair
    Je vais essayer de mettre ça en forme et voir pour comprendre tout ça

    merci a toi

Discussions similaires

  1. Composant Edit, problème de syntaxe [débutant]
    Par hepha1970 dans le forum Débuter
    Réponses: 2
    Dernier message: 22/08/2007, 16h36
  2. Problème de classe (débutant)
    Par Tober dans le forum Débuter
    Réponses: 13
    Dernier message: 01/08/2007, 12h34
  3. problème d'un débutant sur un formulaire
    Par cuicuicui dans le forum Langage
    Réponses: 4
    Dernier message: 17/04/2007, 15h55
  4. Petit problème en C++ (débutant)
    Par Ryan_ dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 01/11/2006, 21h26
  5. Problème de collections [débutant]
    Par jackin dans le forum Langage
    Réponses: 5
    Dernier message: 10/07/2006, 14h04

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