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 :

Minuterie


Sujet :

Arduino

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Minuterie
    Bonjour, nouveau sur arduino uno, je souhaite faire un programme réussi a moitié. En effet j'arrive a activer un relais en appuyant sur un bouton poussoir : après une impulsion du poussoir, le relais se ferme pendant 5s puis se remet au repos. Cependant comment je peux faire pour ajouter dans le programme que si je rappuie sur le poussoir avant la fin des 5s le décompte de la tempo repart de 5s automatiquement ? Merci

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur électricien
    Inscrit en
    Septembre 2008
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur électricien

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 267
    Points : 4 829
    Points
    4 829
    Par défaut
    Bonsoir Freddy et bienvenu sur DVP!

    C'est normalement simple, il suffit de réinitialisé le compteur temps lors d'une nouvelle pression sur le bouton poussoir. Après cela dépend de l'implémentation exacte. Par exemple, en cas d'utilisation d'un gros delay(5000); cela ne sera pas directement possible. Il faut utiliser le comptage de temps non bloquant comme indiqué dans le tutoriel Arduino: Blink Without Delay.

    Pour des réponses plus approfondie, il te faudra poster ton code.

    Delias

  3. #3
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Salut,

    en gérant un chrono avec la fonctionmillis() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    digitalWrite(relayPin, HIGH);  // fermeture du relais
      topDepart = millis();
     
      do {
        bp = digitalRead(bpPin);  // lire état du bouton
        if (bp) {  // si bouton appuyé
          topDepart = millis(); // on remet le chrono à zéro
        }
        delay(50);
      } while ((millis() - topDepart) < 5000); // tant que durée < 5s
     
      digitalWrite(relayPin, LOW); // ouverture du relais

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup, par contre dans votre code je ne vois pas les numéro des entrées sorties de la carte où je dois raccordé le bouton et le relais. Je possède une carte Uno avec une carte 8 relais. En réalité comment je peux faire un code pour gérer indépendamment plusieurs relais de la carte avec leurs poussoirs respectifs pour exactement la même fonction?

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Points : 1
    Points
    1
    Par défaut besoin encore d'aide
    Bonjour merci pour votre réponse,

    Je suis vraiment trop nouveau et j'arrive pas., je déprime devant mon ordi ( je fais un copier coller de ce que vous m'avez mis et j'ai des messages d'erreur)....
    Est ce que vous pourriez me faire le code complet que je dois mettre en mettant 2 relais et 2 Bp dans le même programme car j'ai une carte arduino uno avec une carte relais separée. Chaque Bp commande 1 relais respectif avec une tempo de fermeture de 5s après impulsion avec votre système de chrono millis pour réinitialisé le chrono de 5s si rappui sur 1 Bp.

    j'utilise les entrées pin 2 et 3 de l'arduino pour les poussoirs et les sorties pin 12 et 13 pour les relais

    Je vous remercie d'avance,

    freddy

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    Citation Envoyé par freeedy999 Voir le message
    par contre dans votre code je ne vois pas les numéro des entrées sorties de la carte où je dois raccordé le bouton et le relais.
    Mon code n'était que partiel pour donner une idée. Je ne connais pas ton matériel et le câblage. Un simple bouton et l'entrée peut être lue à l'état haut ou à l'état bas sur appui du bouton selon son montage, sans parler des problèmes de rebonds à gérer.... Tout comme la commande des relais, sans référence du matériel ou schéma de câblage, c'est difficile de répondre.

    Il est sûr que mon do...while précédent est bloquant si tu dois regarder d'autres boutons et relais.

    Mais dans l'idée, avec un seul bouton/relais cela donnerait dans la boucle loop() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void loop() {
      bp1 = digitalRead(bpPin1);
     
      if (bp1){ // si bouton appuyé
          digitalWrite(relayPin1, HIGH); // activer le relais
          topDepart1=millis();
        }
     
      if ((millis()-topDepart1)>=5000 && digitalRead(relayPin1)){ // si temps écoulé et relais actif
          digitalWrite(relayPin1, LOW);
        }
     
    }
    Après il faut que tu testes et que tu postes ton code en cas de souci...

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Merci
    Bonjour, ok je comprends. , par contre n'ayant aucune base je ne serais quoi mettre avant votre code....... Mon système est le suivant: j'ai une carte UNO et une carte relais . J'ai câblé un bouton poussoir 1 sur entrée pin2 et un bouton poussoir 2 sur entrée pin3. Un relais 1 sur sortie pin13 et un relais 2 sur sortie pin12. Le but si j'appuie sur bp1 , fermeture pendant 5s du relais 1 puis réouverture , même chose avec bp2 et relais 2. Et enfin si il y a un appui de bp1 avant la fin des 5s le compteur repart de 5s automatiquement sur le relais 1 , et si il y a un appui sur bp2 avant la fin des 5s le compteur repart de 5s sur le relais 2. Merci pour votre aide ...

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Points : 1
    Points
    1
    Par défaut fonctionne un peu
    Bonjour voici une copie du code qui fonctionne environ 1 min , mais je ne sais pas pourquoi au bout d'un moment ça plante , lorsque j'appuie sur le poussoir plus rien ne se passe....


    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
    /*
     
    */
    const int bpPin1 = 2;// numéro position bp1
    const int relayPin1 =  13;      // numéro position relay1
     
    // variables will change:
    int bp1 = 0;         // j'ai mis cela car sinon il me met un message d'erreur de non déclaration dans le scope
    int topDepart1=0;  // j'ai mis cela car sinon il me met un message d'erreur de non déclaration dans le scope
     
    void setup() {
      // sortie relay:
      pinMode(relayPin1, OUTPUT);
      // entrée bp:
      pinMode(bpPin1, INPUT);
    }
     
    void loop() {
       bp1 = digitalRead(bpPin1);
     
      if (bp1){ // si bouton appuyé
          digitalWrite(relayPin1, HIGH); // activer le relais
          topDepart1=millis();
        }
     
      if ((millis()-topDepart1)>=3000 && digitalRead(relayPin1)){ // si temps écoulé et relais actif
          digitalWrite(relayPin1, LOW);
        }
     
    }

  9. #9
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    Peut-être avec long int topDepart1=0;.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Points : 1
    Points
    1
    Par défaut beaucoup mieux
    Oui bravo je viens de faire la modif et plus de plantage !

    Il me reste encore un truc bizarre que je ne vous ai pas dit , le relais fait l'inverse... au départ il est collé , quand j'appuie sur le bouton il s’éteint. Alors que je voulais l'inverse.

    J'ai une autre question , je vais mettre maintenant un deuxième bouton avec un 2 ème relais, ou dois je insérer votre bout de code( en mettant des indices 2 au lieu de 1) dans mon code existant?

    Merci bien
    FReddy








    Citation Envoyé par f-leb Voir le message
    Bonsoir,

    Peut-être avec long int topDepart1=0;.

  11. #11
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par freeedy999 Voir le message
    Il me reste encore un truc bizarre que je ne vous ai pas dit , le relais fait l'inverse... au départ il est collé , quand j'appuie sur le bouton il s’éteint. Alors que je voulais l'inverse.
    Cela dépend du relais ou du module relais que tu utilises, du câblage du relais, de sa partie commande... tous ces trucs au niveau du matériel que tu ne nous a pas décris Donne des références du constructeur, un schéma électrique, etc. si tu veux des explications.
    A priori il suffit d'inverser la commande HIGH/LOW, tu mets un digitalwrite(relayPin1, HIGH) dans le setup() et un digitalWrite(relayPin1, LOW) dans le loop() pour fermer le contact.


    Citation Envoyé par freeedy999 Voir le message
    J'ai une autre question , je vais mettre maintenant un deuxième bouton avec un 2 ème relais, ou dois je insérer votre bout de code( en mettant des indices 2 au lieu de 1) dans mon code existant?
    Les déclarations/initialisations des variables globales avant le setup(), la configuration des broches dans le setup(), et le traitement principal dans le loop()...

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour, en faite cela viens de la carte relais(chinoise) , elle fonctionne sur 0 au lieu de 1.... Au lieu d'inverser les commandes j'en ai commandé une autre car sinon au repos les relais sont collé en permanence .

    Merci en tout cas le code fonctionne bien!!!

    Citation Envoyé par f-leb Voir le message
    Cela dépend du relais ou du module relais que tu utilises, du câblage du relais, de sa partie commande... tous ces trucs au niveau du matériel que tu ne nous a pas décris Donne des références du constructeur, un schéma électrique, etc. si tu veux des explications.
    A priori il suffit d'inverser la commande HIGH/LOW, tu mets un digitalwrite(relayPin1, HIGH) dans le setup() et un digitalWrite(relayPin1, LOW) dans le loop() pour fermer le contact.


    Les déclarations/initialisations des variables globales avant le setup(), la configuration des broches dans le setup(), et le traitement principal dans le loop()...

  13. #13
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    Bonsoir,

    C'est donc un relais avec contact normalement fermé, embêtant...

    Merci en tout cas le code fonctionne bien!!!
    Pourrais-tu poster le code final ? Cela pourrait intéresser le lecteur de passage...

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Février 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en sécurité

    Informations forums :
    Inscription : Février 2018
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Le voici.
    Bonjour voici le code réalisé avec l'aide de F-LEB :

    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
    /*            // Système de minuterie, inventé pour desactiver des changements de file
    sur slot pour éviter des accidents. les bp sont en réalité des interrupteurs ILS REED.
     
    */
     
    // constants won't change. They're used here to set pin numbers:
     
    const int bpPin5 = 3;     // the number of the pushbutton pin
    const int relayPin5 =  9;      // the number of the relay pin 
     
     const int bpPin4 = 4;// the number of the pushbutton pin
    const int relayPin4 =  10;      // the number of the relay pin 
     
     const int bpPin3 = 5;     // the number of the pushbutton pin
    const int relayPin3 =  11;      // the number of the relay pin 
     
    const int bpPin2 = 6;     // the number of the pushbutton pin
    const int relayPin2 =  12;      // the number of the relay pin 
     
     const int bpPin1 = 7;// the number of the pushbutton pin
    const int relayPin1 =  13;      // the number of the relay pin
     
     
    // variables will change:
    int bp1 = 0;         // variable for reading the pushbutton status
    long int topDepart1=0;
    int bp2 = 0;         // variable for reading the pushbutton status
    long int topDepart2=0;
    int bp3 = 0;         // variable for reading the pushbutton status
    long int topDepart3=0;
    int bp4 = 0;         // variable for reading the pushbutton status
    long int topDepart4=0;
    int bp5 = 0;         // variable for reading the pushbutton status
    long int topDepart5=0;
     
    void setup() {
      // sortie relay:
      pinMode(relayPin1, OUTPUT);
      // entrée bp:
      pinMode(bpPin1, INPUT);
      // sortie relay:
      pinMode(relayPin2, OUTPUT);
      // entrée bp:
      pinMode(bpPin2, INPUT);
      // sortie relay:
      pinMode(relayPin3, OUTPUT);
      // entrée bp:
      pinMode(bpPin3, INPUT);
      // sortie relay:
      pinMode(relayPin4, OUTPUT);
      // entrée bp:
      pinMode(bpPin4, INPUT);
      // sortie relay:
      pinMode(relayPin5, OUTPUT);
      // entrée bp:
      pinMode(bpPin5, INPUT);
    }
     
    void loop() {
       bp1 = digitalRead(bpPin1);
     
      if (bp1){ // si bouton appuyé
          digitalWrite(relayPin1, HIGH); // activer le relais
          topDepart1=millis();
        }
     
      if ((millis()-topDepart1)>=2000 && digitalRead(relayPin1)){ // si temps écoulé et relais actif
          digitalWrite(relayPin1, LOW);
        }
     
     
       bp2 = digitalRead(bpPin2);
     
      if (bp2){ // si bouton appuyé
          digitalWrite(relayPin2, HIGH); // activer le relais
          topDepart2=millis();
        }
     
      if ((millis()-topDepart2)>=800 && digitalRead(relayPin2)){ // si temps écoulé et relais actif
          digitalWrite(relayPin2, LOW);
        }
     
         bp3 = digitalRead(bpPin3);
     
      if (bp3){ // si bouton appuyé
          digitalWrite(relayPin3, HIGH); // activer le relais
          topDepart3=millis();
        }
     
      if ((millis()-topDepart3)>=800 && digitalRead(relayPin3)){ // si temps écoulé et relais actif
          digitalWrite(relayPin3, LOW);
        }
     
         bp4 = digitalRead(bpPin4);
     
      if (bp4){ // si bouton appuyé
          digitalWrite(relayPin4, HIGH); // activer le relais
          topDepart4=millis();
        }
     
      if ((millis()-topDepart4)>=800 && digitalRead(relayPin4)){ // si temps écoulé et relais actif
          digitalWrite(relayPin4, LOW);
        }
     
         bp5 = digitalRead(bpPin5);
     
      if (bp5){ // si bouton appuyé
          digitalWrite(relayPin5, HIGH); // activer le relais
          topDepart5=millis();
        }
     
      if ((millis()-topDepart5)>=800 && digitalRead(relayPin5)){ // si temps écoulé et relais actif
          digitalWrite(relayPin5, LOW);
        }
    }

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

Discussions similaires

  1. Macro et minuterie
    Par jeanchcom dans le forum Access
    Réponses: 3
    Dernier message: 30/05/2017, 11h06
  2. Champ date avec minuterie
    Par Daniel MOREAU dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/11/2007, 21h32
  3. Minuterie décalée
    Par arnaucobra dans le forum Access
    Réponses: 1
    Dernier message: 17/10/2006, 15h06
  4. [VBA-E]fenetre pop-up à minuterie et toujours au premier plan
    Par Ania dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 16/10/2006, 14h49
  5. Problème minuterie vs. scanf
    Par lhulard dans le forum C
    Réponses: 1
    Dernier message: 10/04/2006, 13h51

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