bouton et millis (resolu)

Arduino

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, je voudrais allumer 2 leds avec un bouton et ensuite allumer une 3eme led après un délais de 5 seconde a l'aide de la fonction millis puis l'éteindre 5 seconde après .Pour les 2 premières sa fonctionne mais pour la 3eme c'est plus compliqué. au premier appuis du bouton les 2 leds s'allument comme voulu par contre après 5 seconde la 3eme reste éteinte et lorsque j’appuie une seconde fois sur le bouton les 2 première s’éteignent et la 3eme s'allume sans délais pourriez vous m'expliquer se que je n'ai pas du comprendre merci

 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
const int L1 = 8;     //initialisation de la led pin 8
const int L2 = 9;     //initialisation de la led pin 9
const int L3 = 10;    //initialisation de la led pin 10
const int BT1 = 2;    //initialisation du bouton pin 2
unsigned long temps;  //Variable qui stoke le temps***

int etat_BT1;         //variable qui stoke l'etat du bouton
int etat_Leds;          //variable qui stoke l'etat de la led

void setup()
{
  pinMode(L1, OUTPUT);  //initialisation de la led en que sortie
  pinMode(L2, OUTPUT);
  pinMode(L3, OUTPUT);
  pinMode(BT1, INPUT);  //initialisation du bouton en tant qu'entré

  Serial.begin(9600);   //initialisation sortie serie(écran)

  //temps = millis(); //initialisation du temps***
}

void loop()
{ 
/*********************Allumage led 1 et 2 avec le bouton*******************/

 Serial.print(digitalRead(etat_Leds));  //affichage a l'écran
 etat_BT1 = digitalRead(BT1);  //enregistre l'état du bouton dans la variable etat_BT1

  if(etat_BT1 == LOW)          //Si le bouton est a l'état bas
  {

    if(etat_Leds == HIGH)
    {
      digitalWrite(L1, HIGH);  
      digitalWrite(L2, HIGH);  
      etat_Leds = LOW;

      delay(10);

    }
    else
    {
      digitalWrite(L1, LOW);  
      digitalWrite(L2, LOW);  
      etat_Leds = HIGH;
      delay(10);      
    }
    temps = millis();
  }

  while(digitalRead(BT1)==LOW);

/********************Allumage Led 3 avec millis***************************/ 

  if(etat_Leds == LOW)
  {
     if(millis()-temps > 5000)
      { 
      digitalWrite(L3, HIGH);
      temps = millis();                     
      }
  }

}

Édité par chris

+0 -0
Auteur du sujet

Bonsoir Natalya merci de t’être intéressé a mon message alors je voudrais allumer 2 leds avec le bouton et 5 secondes après elles soient allumées que la 3éme s'allume reste un certain temps et se coupe tout sa juste une fois mais en utilisant la fonction millis. Je ne pense pas être très loin mais la je bloque. j'espère que j'ai été assez claire

+0 -0

Un formalisme pratique pour ce genre de cas, c'est celui des machines à états finies. Ici, j'ai un nombre fini d'états:

  • attente bouton
  • bouton pressé
  • timer de 5s

Il n'y a qu'à coder les conditions de changement d'état et ce qu'il y a à faire quand on change d'état. En bonus: il n'y a aucune attente bloquante dans le code.

 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
/*
0 = attente bouton
1 = bouton pressé
2 = timer de 5s
*/

int etat = 0;

void loop()
{
    if(etat == 0) // attente bouton
    {
        // si le bouton est pressé
        if(digitalRead(BT1) == LOW)
        {
            // on passe à l'état bouton pressé
            etat = 1;
            // et on allume les LEDs
            digitalWrite(L1, HIGH);
            digitalWrite(L2, HIGH);
        }
    }
    else if(etat == 1) // bouton pressé
    {
        // si le bouton est relâché
        if(digitalRead(BT1) == HIGH)
        {
            // On note quand le bouton a été relâché
            temps = millis();
            // on passe à l'état attente de 5s
            etat = 2;
            // on éteint les LEDs de l'état bouton pressé
            digitalWrite(L1, LOW);
            digitalWrite(L2, LOW);
            // et on allume L3
            digitalWrite(L3, HIGH);
        }
    }
    else if(etat == 2) // attente 5s
    {
        // si on est dans cet état depuis 5s
        if((millis() - temps) > 5000)
        {
            // on éteint la LED
            digitalWrite(L3, LOW);
            // et on passe à l'état attente bouton
            etat = 0;
        }
    }
    else
    {
        // Si etat ne vaut ni 0 ni 1 ni 2, on a un bug
        // On réinitialise tout
        etat = 0;
        digitalWrite(L1, LOW);
        digitalWrite(L2, LOW);
        digitalWrite(L3, LOW);
    }
}

Édité par Natalya

+4 -0
Auteur du sujet

Bonjour Natalya merci pour se que tu a fait sa ma beaucoup aider seulement se n'est pas se que je souhaitais j'ai du mal m'expliquer désolé se que je voulais c'est quand j’appuie sur le bouton L1 et L2 s'allume. sans rien toucher L3 s'allume 5 secondes après que L1 et L2 soit allumées et encore sans rien toucher L3 s'éteint après encore 5 secondes

Je n'ai pas eu trop le temps de m'y camper mais avec ton code je devrais y arriver enfin j’espère merci encore

+0 -0

En relisant les messages avant de poster le miens, j'ai vu que je ne faisais pas ce que tu attendais, néanmoins, le principe est le même, tu as juste les conditions de changement d'état à faire évoluer. J'ai donc sciemment posté le code en l'état, puisque avoir à le modifier est la meilleure façon pour toi de te l'approprier.

Essaye, et quand tu auras un résultat qui, selon toi, devrait marcher mais ne marche pas, publie le, on le reverra ensemble (et si ça marche, publie le pour les gens qui trouveront ce topic à l'avenir).

+0 -0
Auteur du sujet

Bonsoir Natalya, Voilà j'ai enfin fini le code pour se que je voulais faire le but était appui sur le bouton allumer 2 leds attendre 5 seconde et en allumer une 3ème automatiquement (avec millis) attendre encore 5 seconde puis éteindre cette dernière toujours avec millis et pour finir appui sur le bouton et éteindre les 2 premières et recommencer au début pour certain sa peut sembler simple mais pour moi qui débute j'ai pas mal ramé Merci encore Natalya sans toi je chercherai toujours voici le code

  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
const int L1 = 8;     //initialisation de la led pin 8
const int L2 = 9;     //initialisation de la led pin 9
const int L3 = 10;    //initialisation de la led pin 10
const int BT1 = 2;    //initialisation du bouton pin 2
long temps=0;  //Variable qui stoke le temps***

void setup()
{
  pinMode(L1, OUTPUT);  //initialisation des leds en que sortie
  pinMode(L2, OUTPUT);
  pinMode(L3, OUTPUT);
  pinMode(BT1, INPUT);  //initialisation du bouton en tant qu'entrée

  Serial.begin(9600);   //initialisation sortie serie(écran)
}
/*Un formalisme pratique pour ce genre de cas, c'est
 celui des machines à états finies. Ici, j'ai un nombre fini d'états:

 attente bouton
 bouton pressé
 timer de 5s

 Il n'y a qu'à coder les conditions de changement d'état et ce qu'il y a à faire quand on change d'état.
 En bonus: il n'y a aucune attente bloquante dans le code.

 0 = attente bouton
 1 = bouton pressé
 2 = timer de 5s
 */

int etat = 0;

void loop()
{

  /////////////////////// ETAT 0 (ETAPE 1) ///////////////////////////////
  // On appui sur le bouton les leds L1 et L2 s'allumes //////////////////
  ////////////////////////////////////////////////////////////////////////
  if(etat == 0) // bouton pressé
  {

    // si le bouton est relâché
    if(digitalRead(BT1) == HIGH)
    {
      // On note quand le bouton a été relâché
      temps = millis();
      // on passe à l'état attente de 5s
      etat = 1;
      // on allume les Leds de l'état bouton pressé
      digitalWrite(L1, HIGH);
      digitalWrite(L2, HIGH);
      Serial.println("leds 1 et 2 Allumee");
      }
    }

  /////////////////////// ETAT 1 (ETAPE 2) /////////////////////////////
  // La led L3 s'allume après un delais de 5 secondes //////////////////
  //////////////////////////////////////////////////////////////////////

  else if(etat == 1) // attente 5s//////////*******
  {
    // si on est dans cet état depuis 5s
    if((millis() - temps) > 5000)
    {
      // on Allume la LED L3
      digitalWrite(L3, HIGH);
      //on note le temps
      temps=millis();
      Serial.println("L3 allumee");

      // et on passe à l'état eteindre L3 5s
      etat = 2;
    }
  }
  /////////////////////// ETAT 2 ///////////////////////////////////////
  // La led L3 s'éteint après un delais de 5 secondes //////////////////
  //////////////////////////////////////////////////////////////////////
  else if(etat == 2) // attente 5s
  {
    // si on est dans cet état depuis 5s
    if((millis() - temps) > 5000)
    {
      // on éteint la LED L3
      digitalWrite(L3, LOW);
      Serial.println("L3 eteinte");
      etat = 3;


    }
///////////////////////////////////////////////////////////////////////////
//Eteindre L1 et L2 après un appui sur le bouton et retourner a l'état O //
///////////////////////// ETAT 3 //////////////////////////////////////////    
  }
  else if(etat == 3) // bouton pressé
  {
    // si le bouton est relâché on éteint les leds
    if(digitalRead(BT1) == HIGH)
    {
      digitalWrite(L1, LOW);
      digitalWrite(L2, LOW);
      Serial.println("leds 1 et 2 sont eteinte");
    //Tant que le bouton est a l'état Haut on ne fait rien  
      while(digitalRead(BT1)==HIGH);
    //on passe a l'état 0  
      etat = 0;
      }
    }
  ///////////////////////////etat nul///////////////////////////
  else
  {
    // Si etat ne vaut ni 0 ni 1 ni 2 ni 3, on a un bug
    // On réinitialise tout
    etat = 0;
    digitalWrite(L1, LOW);
    digitalWrite(L2, LOW);
    digitalWrite(L3, LOW);
    Serial.println("etat Nul");

  }
}
+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte