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 avec un BP sous millis


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2020
    Messages : 16
    Par défaut Problème avec un BP sous millis
    Bonjour,

    J'ai une tempo avec un BP fait avec (DELAY) que j'aimerai modifier afin de ne plus utiliser DELAY mais MILLIS.

    Son fonctionnement :
    Si le BP est à 0 la sortie 13 est à 0
    Si le BP est à 1 la sortie 13 passe à 1 après un délai que l'on peut modifier.

    J'ai essayé d'utiliser MILLIS mais, mes compétences en programmation ne m’ont pas permis d'y arriver, pourriez-vous m'aider, 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
     
     const int BP = 2; 
     unsigned long temps;
     int Time =4600;   
     int relais1 = 6; 
     unsigned long randOn1 = 0;
     unsigned long randOnStart1 = 0;
     unsigned long randOff1 = 0;
     unsigned long randOffStart1 = 0;
     
     void setup() {
     Serial.begin(115200);
     pinMode(BP, INPUT);
     pinMode(relais1, OUTPUT);
     }
     
     void loop() {
     if (digitalRead(BP) == HIGH) {                                
         digitalWrite(relais1, LOW);
         delay(Time);
     }   
     if (randOn1 == 0 && randOff1 == 0) {                          // Si le cycle On/Off est termine
         randOn1 = random (150, 3900);
         randOff1 = random (10,500);
         digitalWrite(relais1, HIGH);                              // Le relais est On
         randOnStart1 = millis();                                  // Debut temporisation On
    }
    if (randOn1 !=0 && (millis() - randOnStart1 >= randOn1)) {     //Si temporisation On terminee
        randOn1 = 0;
        digitalWrite(relais1, LOW);                                // Le relais est Off
        randOffStart1 = millis();                                  // Debut temporisation Off
    }
    if (randOn1 ==0 && (millis() - randOffStart1 >= randOff1)) {   // Si temporisation Off terminee
        randOff1 = 0;
    }
    }

  2. #2
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 922
    Par défaut
    Nous (JPBricole et moi ) vous avions déjà rédigé un bout de code à une question exactement sur le même thème.

    il faut analyser ces codes, bien les comprendre et vous pourrez vous débrouiller. Sinon vous ne vous en sortirez jamais (et si ce sont des exercices scolaires on ne va pas les faire pour vous).

  3. #3
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 019
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 019
    Par défaut
    Bonsoir Genisium
    Citation Envoyé par Jay M Voir le message
    ...(et si ce sont des exercices scolaires on ne va pas les faire pour vous)...
    Il est dit dans le profile de Genisium, retraité et il se dit dédutant en Arduino alors, un peu de tolérance!

    Citation Envoyé par Genisium Voir le message
    ..J'ai essayé d'utiliser MILLIS mais, mes compétences en programmation ne m’ont pas permis d'y arriver...
    Je te rassure, j'ai aussi débuté l'Arduino à la retraite et la maîtrise des temporisations avec millis() n'est pas évidente à mettre en oeuvre.
    Un premier "avertissement" à propos de ton programme avec l'usage d'un BP actif à 1
    if (digitalRead(BP) == HIGH)
    Suppose que l'entrée du BP (bpPin dans mon programme) est polarisée "contre" GND avec une résistance dite de PULLDOWN pour bien fonctionner.
    Personnellement, je préfère l'inverse, le BP actif à 0, dans ce cas il faut polariser l'entrée du BP "contre" +5V (PULLUP) et ceci se fait, dans la plus part des cas, avec l'instruction:
    pinMode(bpPin, INPUT_PULLUP);
    L'autre avantage, il n'est pas nécessaire d'amener un potentiel vers le bouton, mais seulement le GND et le fil d'entrée, bien sûre.
    Je te mets les 2 versions du programme, tu pourras comparer.

    BP actif à 1
    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
     const int bpPin = 2;
     int relaisDelai =4600;
     int relais1pin = 13;
     unsigned long randOn1 = 0;
     unsigned long randOnStart1 = 0;
     unsigned long randOff1 = 0;
     unsigned long randOffStart1 = 0;
     
     void setup() 
     {
    	 Serial.begin(115200);
    	 pinMode(bpPin, INPUT);
    	 pinMode(relais1pin, OUTPUT);
     }
     
     void loop() 
     {
    	 if (digitalRead(bpPin) == LOW)                                            // Si BP n'est pas pressé, relais "tombe" 
    	 {
    		 digitalWrite(relais1pin, LOW);
    		 randOnStart1 = 0;                                                     // Et le chrono est vide
    	 }
    	 if (digitalRead(bpPin) == HIGH && randOnStart1 == 0)                      // Si BP presse et chrono pas demarre
    	 {
    		 randOnStart1 = millis();                                              // On demarre le chrono
    	 }
     
    	 if (digitalRead(bpPin) == HIGH && millis()-randOnStart1 >= relaisDelai)   // Si BP est toujours pressé apres relaisDelai millisecondes
    	 {    
    		 digitalWrite(relais1pin, HIGH);                                       // Faire tirer le relais
    	 }
     }
    BP actif à 0

    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
     const int bpPin = 2;
     int relaisDelai = 4600;
     int relais1pin = 13;
     unsigned long randOn1 = 0;
     unsigned long randOnStart1 = 0;
     unsigned long randOff1 = 0;
     unsigned long randOffStart1 = 0;
     
     void setup() 
     {
    	 Serial.begin(115200);
    	 pinMode(bpPin, INPUT_PULLUP);
    	 pinMode(relais1pin, OUTPUT);
     }
     
     void loop() 
     {
    	 if (digitalRead(bpPin) == HIGH)                                            // Si BP n'est pas pressé, relais "tombe" 
    	 {
    		 digitalWrite(relais1pin, LOW);
    		 randOnStart1 = 0;                                                     // Et le chrono est vide
    	 }
    	 if (digitalRead(bpPin) == LOW && randOnStart1 == 0)                      // Si BP presse et chrono pas demarre
    	 {
    		 randOnStart1 = millis();                                              // On demarre le chrono
    	 }
     
    	 if (digitalRead(bpPin) == LOW && millis()-randOnStart1 >= relaisDelai)   // Si BP est toujours pressé apres relaisDelai millisecondes
    	 {    
    		 digitalWrite(relais1pin, HIGH);                                       // Faire tirer le relais
    	 }
     }
    Le relais tire au bout de 4,6 secondes.

    A+
    Cordialement
    jpbbricole

  4. #4
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2020
    Messages : 16
    Par défaut
    Bonjour jpbbricole,

    C'est vrai que ce n'est pas évident pour connaître les tenants et les aboutissants de la fonction Millis.
    J'ai testé les deux programmes que tu m'as donné, le Pulldown fonctionne très bien et fait économiser une résistance et ce qui est aussi intéressant, c'est le tirage à la masse.
    Par contre, je n'ai pas réussi à intégrer la tempo Random Millis, l'entrée se met bien à 0 et à 1 avec le BP, mais la tempo ne démarre pas.
    Je recherche encore et je reviendrai vers toi dès que j'ai trouvé ce qui cloche.
    Encore merci pour ton aide et ta compréhension.

  5. #5
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 922
    Par défaut
    Citation Envoyé par Genisium Voir le message
    Par contre, je n'ai pas réussi à intégrer la tempo Random Millis, l'entrée se met bien à 0 et à 1 avec le BP, mais la tempo ne démarre pas.
    En fait elle démarre mais dans le code de @JP si vous relâchez le bouton le relais s'éteint instantanément. il faut garder le doigt dessus. ça correspond à ce que vous disiez dans le cahier des charges:
    Si le BP est à 0 la sortie 13 est à 0
    Si le BP est à 1 la sortie 13 passe à 1 après un délai que l'on peut modifier.

    Sinon La tempo est "câblée en dur" à 4.6s avec le il n'y a pas de random. Vous pouvez éventuellement changer la valeur de relaisDelai par un nombre aléatoire si c'est ce que vous désirez au même moment où vous enregistrez millis(), dans le if juste après le marquage du chrono
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		 randOnStart1 = millis();                                              // On demarre le chrono


    PS/ le commentaire sur "les projets scolaires" avait un 'Si' car on voit souvent à quelques moment clés de l'année des "petits malins" qui viennent faire faire leur devoirs par d'autres, quitte à créer un faux profil (genre prof débutant, jeune fille sympa qui cherche de l'aide, etc). N'y voyez aucun manque de tolérance, juste une question ouverte qui permet de "faire réagir".

  6. #6
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2020
    Messages : 16
    Par défaut
    Bonjour Jay M,

    Il n'y a pas de soucis, tu m'as juste rajeuni de quelques décennies.

    Pour ce qui est du programme, c'est justement ce qui est difficile pour moi, c'est d'intégrer le programme random millis, comme je l'ai fait dans mon premier message (tempo random millis avec un BP fait avec delay et qui fonctionne).

    J'ai voulu passer du BP fait avec delay en BP fait avec millis afin d'éviter les arrêt du programme.

    Je joint un programme où j'ai intercalé la fonction random millis, je ne vois pas ce qui empêche la tempo random de fonctionner.

    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
     
     
    const int bpPin = 2;
     int relaisDelai = 4600;
     int relais1pin = 13;
     unsigned long randOn1 = 0;
     unsigned long randOnStart1 = 0;
     unsigned long randOff1 = 0;
     unsigned long randOffStart1 = 0;
     
     void setup() 
     {
       Serial.begin(115200);
       pinMode(bpPin, INPUT_PULLUP);
       pinMode(relais1pin, OUTPUT);
     }
     
     void loop() 
     {
       if (randOn1 == 0 && randOff1 == 0) {                                         // Si le cycle On/Off est termine
        randOn1 = random (150, 2900);
        randOff1 = random (10, 500);
        digitalWrite(relaisDelai, HIGH);                                           // Le relais est On
        randOnStart1 = millis();                                                // Debut temporisation On
     }
    if (randOn1 !=0 && (millis() - randOnStart1 >= randOn1)) {                   // Si temporisation On terminee
        randOn1 = 0;
        digitalWrite(relaisDelai, LOW);                                           // Le relais est Off
        randOffStart1 = millis();                                              // Debut temporisation Off
     }
    if (randOn1 ==0 && (millis() - randOffStart1 >= randOff1))  {                  // Si temporisation Off terminee
        randOff1 = 0;
     }
          if (digitalRead(bpPin) == HIGH)                                            // Si BP n'est pas pressé, relais "tombe" 
       {
         digitalWrite(relais1pin, LOW);
         randOnStart1 = 0;                                                     // Et le chrono est vide
       }
       if (digitalRead(bpPin) == LOW && randOnStart1 == 0)                      // Si BP presse et chrono pas demarre
       {
         randOnStart1 = millis();                                              // On demarre le chrono
       }
     
       if (digitalRead(bpPin) == LOW && millis()-randOnStart1 >= relaisDelai)   // Si BP est toujours pressé apres relaisDelai millisecondes
       {    
         digitalWrite(relais1pin, HIGH);                                       // Faire tirer le relais
       }
     }

  7. #7
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 922
    Par défaut
    Maintenant à ce programme tu ajoutes un microswitch (BP) qui va être action manuellement et aléatoirement.
    Quand le BP est à HIGH la TRM est bloqué et le relais passe à LOW.
    Lorsque le BP est à LOW il débloque après un certain temps la TRM le relais passe à HIGH.
    HIGH et LOW dépend du pull-up ou down. Vous voyez cela comme HIGH = appuyé ?

    Sinon le “ qui va être actionné manuellement et aléatoirement.” ça veut dire quoi le aléatoirement? Juste qu’on ne sait pas quand l’utilisateur va appuyer ?

  8. #8
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    comment est géré le rebond du bouton poussoir ?
    A moins qu'il soit géré au niveau matériel (présence d'un condo) ?

  9. #9
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2020
    Messages : 16
    Par défaut
    Bonjour Auteur,

    Ce n'est pas nécessaire dans mon cas.

  10. #10
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 019
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 019
    Par défaut
    Bonjour Genisium

    J'ai enfin compris!

    Voilà ma "prose"
    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
     
    #define bpPinEtatOn LOW                                              // Etat du BP quand On
    const int bpPin = 2;
    int bpDelai = 4600;
    unsigned long bpDelaiStart = 0;
    enum bpEtatIndex {bpEtatOff, bpEtatOn, bpEtatTimout};
    int bpEtat = bpEtatOff;
     
    #define relais1pin 6                                                 // Pin de relais1
     
    unsigned long randOn1 = 0;
    unsigned long randOnStart1 = 0;
    unsigned long randOff1 = 0;
    unsigned long randOffStart1 = 0;
     
     void setup() {
    	Serial.begin(115200);
     
    	pinMode(bpPin, INPUT_PULLUP);
    	pinMode(relais1pin, OUTPUT);
    	digitalWrite(relais1pin, LOW);                                  // Faire tomber le relais
     }
     
     void loop() 
     {
    	if ((digitalRead(bpPin) == bpPinEtatOn) && (bpEtat == bpEtatOff)) 
    	{
    		bpEtat = bpEtatOn;
    		digitalWrite(relais1pin, LOW);                               // Faire tomber le relais
    		bpDelaiStart = millis();
    	}
    	if (digitalRead(bpPin) == !bpPinEtatOn)
    	{bpEtat = bpEtatOff;}
     
    	if (bpEtat == bpEtatOn && (millis() - bpDelaiStart >= bpDelai) && bpDelaiStart > 0)
    	{
    		bpEtat = bpEtatTimout;
    		bpDelaiStart = 0;
    	}
     
    	if (bpEtat == bpEtatOff || bpEtat == bpEtatTimout)               // Si etat BP pas presse (! fonction NON, NOT ou PAS)
    	{
    		relaisrandOnRandOff();
    	}
     }
     
     void relaisrandOnRandOff()
     {
    	if (randOn1 == 0 && randOff1 == 0)                               // Si le cycle On/Off est termine
    	{                          
    		randOn1 = random (150, 3900);
    		randOff1 = random (10,500);
    		digitalWrite(relais1pin, HIGH);                              // Le relais est On
    		randOnStart1 = millis();                                     // Debut temporisation On
    	}
     
    	if (randOn1 !=0 && (millis() - randOnStart1 >= randOn1))         //Si temporisation On terminee
    	{     
    		randOn1 = 0;
    		digitalWrite(relais1pin, LOW);                               // Le relais est Off
    		randOffStart1 = millis();                                    // Debut temporisation Off
    	}
     
    	if (randOn1 ==0 && (millis() - randOffStart1 >= randOff1))       // Si temporisation Off terminee
    	{   
    		randOff1 = 0;
    	}	 
     }
    J'ai utiliser mot-clé enum pour déclarer les etats de BP et rémanégé, un peu, les lignes de code.

    PS: Oublié de préciser, le BP est actif à 0 (#define bpPinEtatOn LOW)
    A+
    Cordialement
    jpbbricole

  11. #11
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 922
    Par défaut
    et j'ai compris autre chose en lisant le code de @JP

    si vous voulez que la TRM se déclenche uniquement quand le bouton est appuyé sinon rien ne se passe alors pour être complet donc et vous présenter une alternative en machine à états finis, le nouveau dessin ressemble à cela:

    Nom : nouvelleMachine.png
Affichages : 517
Taille : 305,6 Ko

    et donc ça modifie un peu notre code, on a rajouté un état et trois transitions qu'il faut représenter dans le code.

    ça donnerait un truc comme cela (non testé, je suis sur mon iPad)
    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
    const byte pinBouton = 2;
    const byte pinRelais = 13;
    const unsigned long delaiBouton = 4600; // attente de 4.6s pour déclencher la TRM
    unsigned long dernierAppuiBouton;
     
    unsigned long derniereBasculeRelais;
    unsigned long deltaT; // intervalle de temps aléatoire pour la TRM
     
     
    enum {REPOS, ATTENTE, ACTIF, PASSIF} etat = REPOS; // nos 4 états
     
    void setup() {
      pinMode(pinBouton, INPUT_PULLUP);
      pinMode(pinRelais, OUTPUT);
    }
     
    void loop() {
      switch (etat) { // dans quel état est o
        case REPOS: // on est dans l'état REPOS, on doit tester T1
          if (digitalRead(pinBouton) == LOW) { // T1
            // si la condition de la transition T1 est validée, alors on fait l'action A1
            dernierAppuiBouton = millis();  // A1: on mémorise le moment de l'appui
            etat = ATTENTE; // et on définit le nouvel état
          }
          break;  // chaque case doit se terminer par break
     
        case ATTENTE: // on est dans l'état ATTENTE, on doit tester T2 ou T3
          if (digitalRead(pinBouton) == HIGH) { // T2
            // si la condition de la transition T2 est validée, alors on fait l'action A2
            // ici A2 n'a pas d'action particulière
            etat = REPOS; // et on définit le nouvel état
          }
          else if (millis() - dernierAppuiBouton >= delaiBouton) { // T3
            // si la condition de la transition T3 est validée, alors on fait l'action A3
            derniereBasculeRelais = millis(); // A3, mémoriser le moment de bascule
            digitalWrite(pinRelais, HIGH); // A3, Activer le relais
            deltaT = random(2000, 5001); // A3, générer un intervalle ∆t aléatoire (ici entre 2 et 5s)
            etat = ACTIF; // et on définit le nouvel état
          }
          break;  // chaque case doit se terminer par break
     
        case ACTIF: // on est dans l'état ACTIF, on doit tester T2 ou T4
          if (digitalRead(pinBouton) == HIGH) { // T2
            // si la condition de la transition T2 est validée, alors on fait l'action A4
            digitalWrite(pinRelais, LOW); // A4, désactiver le relais
            etat = REPOS; // et on définit le nouvel état
          } else if (millis() - derniereBasculeRelais >= deltaT) { // T4
            // si la condition de la transition T4 est validée, alors on fait l'action A5
            derniereBasculeRelais = millis(); // A5, mémoriser le moment de bascule
            digitalWrite(pinRelais, LOW); // A5, désactiver le relais
            deltaT = random(2000, 5001); // A5, générer un intervalle ∆t aléatoire (ici entre 2 et 5s)
            etat = ACTIF; // et on définit le nouvel état
          }
          break;  // chaque case doit se terminer par break
     
        case PASSIF: // on est dans l'état PASSIF, on doit tester T2 ou T4
          if (digitalRead(pinBouton) == HIGH) { // T2
            // si la condition de la transition T2 est validée, alors on fait l'action A2
            // ici A2 n'a pas d'action particulière
            etat = REPOS; // et on définit le nouvel état
          } else if (millis() - derniereBasculeRelais >= deltaT) { // T4
            // si la condition de la transition T4 est validée, alors on fait l'action A3
            derniereBasculeRelais = millis(); // A3, mémoriser le moment de bascule
            digitalWrite(pinRelais, LOW); // A3, désactiver le relais
            deltaT = random(2000, 5001); // A3, générer un intervalle ∆t aléatoire (ici entre 2 et 5s)
            etat = ACTIF; // et on définit le nouvel état
          }
          break;  // chaque case doit se terminer par break
      }
     
      // ici votre code peut continuer et faire autre chose, la machine n'est pas bloquante
     
    }

  12. #12
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2020
    Messages : 16
    Par défaut
    BonjourJay M,

    concernant : "HIGH et LOW dépend du pull-up" oui bien sûr ce sont les états que l'on retrouve sur l'entrée (pin2).

    De même pour "qui va être actionné manuellement et aléatoirement" c'est ce que ou celui qui actionnera le BP

  13. #13
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2020
    Messages : 16
    Par défaut
    Bonjour jpbbricole,

    Pour une meilleur compréhension :
    - Si le BP est appuyé, l'entrée PULLUP (2) est à LOW
    - Si le BP est relâché, l'entrée PULLUP (2) est à HIGH

    Le programme que tu m'as donné fonction différemment de ce que je voulais.
    Si le BP est relâché, le relais est à HIGH (le relais doit-être à LOW)

    J'ajoute cette explication qui peut aider :
    Si le BP est relâché, la TRM est bloqué et le relais passe à LOW.
    Si le BP est appuyé, il débloque après un certain temps la TRM le relais passe à HIGH.

    Si le BP est appuyé le relais est à HIGH après la temporisation, si le BP est relâché et directement le BP est appuyé, le relais repasse à HIGH après la temporisation, donc à chaque fois que le BP est appuyé, la tempo est enclenchée et bloque le relais à LOW pendant la temporisation.


    C'est pourquoi, je conseille d'essayer le programme que j'avais posté à mon premier post.
    Il faut juste mettre un BP sur l'entrée (2), la sortie relais pouvant être visualisée avec la led se trouvant sur la carte Arduino (led bleu correspondant à la sortie 13)
    Je re-poste le programme avec l'entrée (pin2) en Pullup et la sortie relais en (pin13)

    C'est pourquoi, je conseille d'essayer le programme que j'avais posté à mon premier post.
    Il faut juste mettre un BP sur l'entrée (2), la sortie relais pouvant être visualisée avec la led se trouvant sur la carte Arduino (led bleu correspondant à la sortie 13)
    Je re-poste le programme avec l'entrée (pin2) en Pullup et la sortie relais en (pin13)

    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
     
    const int BP = 2; 
     unsigned long temps;
     int Time =4600;   
     int relais1 = 13; 
     unsigned long randOn1 = 0;
     unsigned long randOnStart1 = 0;
     unsigned long randOff1 = 0;
     unsigned long randOffStart1 = 0;
     
     void setup() {
     Serial.begin(115200);
     pinMode(BP, INPUT_PULLUP);
     pinMode(relais1,OUTPUT);
      //pinMode(bpPin, INPUT_PULLUP);
     }
     
     void loop() {
     if (digitalRead(BP) == HIGH) {                                
         digitalWrite(relais1, LOW);
         delay(Time);
     }   
     if (randOn1 == 0 && randOff1 == 0) {                          // Si le cycle On/Off est termine
         randOn1 = random (150, 3900);
         randOff1 = random (10,500);
         digitalWrite(relais1, HIGH);                              // Le relais est On
         randOnStart1 = millis();                                  // Debut temporisation On
    }
    if (randOn1 !=0 && (millis() - randOnStart1 >= randOn1)) {     //Si temporisation On terminee
        randOn1 = 0;
        digitalWrite(relais1, LOW);                                // Le relais est Off
        randOffStart1 = millis();                                  // Debut temporisation Off
    }
    if (randOn1 ==0 && (millis() - randOffStart1 >= randOff1)) {   // Si temporisation Off terminee
        randOff1 = 0;
    }
    }

  14. #14
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 922
    Par défaut
    Citation Envoyé par Genisium Voir le message
    BonjourJay M,

    concernant : "HIGH et LOW dépend du pull-up" oui bien sûr ce sont les états que l'on retrouve sur l'entrée (pin2).
    Salut

    Ce que je voulais suggérer c’est que vous évitiez dans les explications HIGH ou LOW pour parler de l’état du bouton et utilisiez appuyé ou relâché comme ça on ne se posera pas la question de savoir ce que vous voulez dire.

    J’essaye de retraduire ce que vous dites

    - Si bouton relâché le relais est toujours inactif
    - Si le bouton est appuyé,en continu pendant un délai de 4.6 secondes, on démarre un cycle TRM Qui se termine dès relâchement du bouton
    - Un cycle TRM c’est le relais activé pendant un temps aléatoire puis désactivé pendant un autre temps aléatoire.

    C’est ça ? (C’est ce que la machine a états ci dessous fait)

  15. #15
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2020
    Messages : 16
    Par défaut
    Ok Jay M, je corrige ce que tu me demandes dans mon dernier message

  16. #16
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 019
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 019
    Par défaut
    Bonjour Bonjour Genisium

    Je rejoins @Jay M, le BP est Pressé ou Relaché et le relais est Tiré ou Tombé.

    J'essaye encore une explication:

    Le programme "tourne" le relais Tire et Tombe au rythme de randOn1 et randOff1
    Si BP est pressé, le relais est bloqué Tombé mais au maximum du temps de int relaisDelai = 4600;
    Si BP est relaché ou relaisDelai échu, le programme "retourne" normalement.

    Je brûle?


    Cordialement
    jpbbricole

  17. #17
    Expert confirmé

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

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 922
    Par défaut
    Salut

    Oui ce serait bien ce clarifier «*en français*» le fonctionnement attendu

  18. #18
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2020
    Messages : 16
    Par défaut
    J'ai modifié mon message que j'ai fait à 09H52 au post 19 afin d'éviter les post en double, où j'ai tout modifier pour intégrer BP appuyé et BP relâché, , je l'avais déjà envoyé il y a une heure !.

  19. #19
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 019
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 019
    Par défaut
    Bonjour Genisium

    Dernière édition

    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
     
     #define bpAppuye LOW                                              // Etat port entree du BP quand appuye
     #define bpRelache !bpAppuye
     
     #define relaisTire HIGH                                           // Etat port sortie quand relais tire
     #define relaisTombe !relaisTire
     
     const int bpPin = 2;
     int bpDelai = 4600;
     unsigned long bpDelaiStart = 0;
     enum bpEtatIndex {bpEtatOff, bpEtatOn, bpEtatTimout};
     int bpEtat = bpEtatOff;
     
     #define relais1pin 6                                                // Pin de relais1
     
     unsigned long randOn1 = 0;
     unsigned long randOnStart1 = 0;
     unsigned long randOff1 = 0;
     unsigned long randOffStart1 = 0;
     
     void setup() {
    	 Serial.begin(115200);
     
    	 pinMode(bpPin, INPUT_PULLUP);
    	 pinMode(relais1pin, OUTPUT);
    	 digitalWrite(relais1pin, relaisTombe);                          // Faire tomber le relais
     }
     
     void loop()
     {
    	if ((digitalRead(bpPin) == bpAppuye) && (bpEtat == bpEtatOff))
    	{
    		bpEtat = bpEtatOn;
    		digitalWrite(relais1pin, relaisTombe);                       // Faire tomber le relais
    		bpDelaiStart = millis();
    	}
    	if (digitalRead(bpPin) == bpRelache)
    	{
    		bpEtat = bpEtatOff;
    		digitalWrite(relais1pin, relaisTombe);
    	}
     
    	if (bpEtat == bpEtatOn && (millis() - bpDelaiStart >= bpDelai) && bpDelaiStart > 0)
    	{
    		bpEtat = bpEtatTimout;
    		bpDelaiStart = 0;
    	}
     
    	if (bpEtat == bpEtatTimout)                                      // Si BP  presse > bpDelai
    	{
    		relaisrandOnRandOff();
    	}
     }
     
     void relaisrandOnRandOff()
     {
    	 if (randOn1 == 0 && randOff1 == 0)                               // Si le cycle On/Off est termine
    	 {
    		 randOn1 = random (150, 3900);
    		 randOff1 = random (10,500);
    		 digitalWrite(relais1pin, relaisTire);                        // Le relais est On
    		 randOnStart1 = millis();                                     // Debut temporisation On
    	 }
     
    	 if (randOn1 !=0 && (millis() - randOnStart1 >= randOn1))         //Si temporisation On terminee
    	 {
    		 randOn1 = 0;
    		 digitalWrite(relais1pin, relaisTombe);                       // Le relais est Off
    		 randOffStart1 = millis();                                    // Debut temporisation Off
    	 }
     
    	 if (randOn1 ==0 && (millis() - randOffStart1 >= randOff1))       // Si temporisation Off terminee
    	 {
    		 randOff1 = 0;
    	 }
     }
    A+
    Cordialement
    jpbbricole

  20. #20
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2020
    Messages : 16
    Par défaut
    Bingo jpbbricole, ça fonctionne à merveille, il ne me reste plus qu'à éplucher ton programme pour bien comprendre la fonction millis et tout le reste.
    Un très grand merci pour ta patience.

    Très bon WE,
    Très cordialement

Discussions similaires

  1. problème avec formulaire et sous formulaire
    Par Lnjam dans le forum Access
    Réponses: 2
    Dernier message: 28/01/2006, 17h52
  2. Problème avec un diapo sous IE
    Par Mucsy dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 06/01/2006, 00h40
  3. problème avec les div sous Mozilla
    Par MrsFrizz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/10/2005, 11h54
  4. problème avec z-index sous firefox ???
    Par SpaceFrog dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/09/2005, 20h39
  5. [Sybase]Problème avec le BCP sous Solaris
    Par sl dans le forum Sybase
    Réponses: 3
    Dernier message: 09/09/2004, 07h56

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