Partage
  • Partager sur Facebook
  • Partager sur Twitter

3 bp et 1 afficheur 7 segment

    9 novembre 2020 à 19:07:03

    Bonjour a tous,

    je m apel gael et j ai un probleme

    j ai 3 bp cablé et un afficheur 7 segment sur un arduino
    j ai mon code qui marche bien: quand j appui sur le bp1 il s affiche 1 sur le 7 segment pendant un certain temps quand j appui sur le bp2 il s affiche 2 sur le 7 segment pendant un certain temps et quand j appui sur le bp3 il s affiche 3 sur le 7 segment pendant un certain temps, j utilise delays pour tout ca mais je voudrais faire evoluer mon code car je voudrais que quand j appui sur bp1 il s affiche 1 sur le 7 segment mais si j appui pendant le temps d affichage de 1 sur le bp2 il saffiche en alternance 1 et 2 mais comme j utiliuse delay je suis bloquer.
    j ai bien vue la fonction millis mais j ai du mal a l assimiler alors que je pense que la base que je doit coder doit etre simple.

    un petit coup de main serais le bien venu

    je mets mon code de base qui marche bien

    merci a tous
    const int led1A=14;
    const int led1B=15;
    const int led1C=16;
    const int led1D=17;
    const int led1E=18;
    const int led1F=19;
    const int led1G=20;
    
    const int bp_1=A2;
    const int bp_2=A3;
    const int bp_3=A4;
    
    boolean etatbp1=LOW;
    boolean etatbp2=LOW;
    boolean etatbp3=LOW;
    
    int time=30000;
    
    void setup()
    
    {
      pinMode(led1A, OUTPUT);
      pinMode(led1B, OUTPUT);
      pinMode(led1C, OUTPUT);
      pinMode(led1D, OUTPUT);
      pinMode(led1E, OUTPUT);
      pinMode(led1F, OUTPUT);
      pinMode(led1G, OUTPUT);
        
      pinMode(bp_1, INPUT);
      pinMode(bp_2, INPUT);
      pinMode(bp_3, INPUT);
         
    boolean etatbp1=LOW;
    boolean etatbp2=LOW;
    boolean etatbp3=LOW;
    
     int bp_1=LOW;
     int bp_2=LOW;
     int bp_3=LOW;
      
    }
    
    
    void loop(){
      etatbp1=digitalRead(bp_1);  // on memorise l'etat des bp
      etatbp2=digitalRead(bp_2);
      etatbp3=digitalRead(bp_3);
      
    if (etatbp1==HIGH)
         
    {
    allume1();
    }
    
    else if (etatbp2==HIGH)
    {   
    allume2();
    }
    else if (etatbp3==HIGH)
    {   
    allume3();
    }
    
    else
    {
    eteind();
    }
    }
    
    void allume1()
    {
    digitalWrite(led1A, LOW); 
    digitalWrite(led1B, HIGH); 
    digitalWrite(led1C, HIGH); 
    digitalWrite(led1D, LOW); 
    digitalWrite(led1E, LOW); 
    digitalWrite(led1F, LOW); 
    digitalWrite(led1G, LOW); 
    delay(time);
    }
    
    void allume2()
    {
    digitalWrite(led1A, HIGH); 
    digitalWrite(led1B, HIGH); 
    digitalWrite(led1C, LOW); 
    digitalWrite(led1D, HIGH); 
    digitalWrite(led1E, HIGH); 
    digitalWrite(led1F, LOW); 
    digitalWrite(led1G, HIGH); 
    delay(time);
    }
    
    void allume3()
    {
    digitalWrite(led1A, HIGH); 
    digitalWrite(led1B, HIGH); 
    digitalWrite(led1C, HIGH); 
    digitalWrite(led1D, HIGH); 
    digitalWrite(led1E, LOW); 
    digitalWrite(led1F, LOW); 
    digitalWrite(led1G, HIGH); 
    delay(time);
    }
    void eteind()
    {
    digitalWrite(led1A, LOW);
    digitalWrite(led1B, LOW); 
    digitalWrite(led1C, LOW); 
    digitalWrite(led1D, LOW); 
    digitalWrite(led1E, LOW); 
    digitalWrite(led1F, LOW); 
    digitalWrite(led1G, LOW); 
    digitalWrite(hp1, LOW);
    }
    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2020 à 7:14:55

      Bonjour,

      le principe consiste à retirer dans le programme les 

      delay(time);


      en début de 

      void loop(){

      on teste l'appui sur un bouton, il faut maintenant enregistrer si un bouton est actionné ou non et lequel. Ceci va servir à  vérifier au tour de boucle suivant si cela à changer ou non. Par ex 

      boutonEnregistre = 1;  //# si appui sur le BP 1


      Si il y a eu un appui sur un bouton on va lire le temps

      captureDuTemps = millis();

      en fin de boucle par exemple on va vérifier si l'on a dépasser le temps alloué et éteindre l'afficheur

      if (  millis() > captureDuTemps + time)
      {
      
        eteind()
      
      }





      -
      Edité par clgbzh 22 novembre 2020 à 7:15:40

      • Partager sur Facebook
      • Partager sur Twitter
        22 novembre 2020 à 18:29:43

        clgbzh a écrit:

        if (  millis() > captureDuTemps + time)
        {
        
          eteind()
        
        } 

        Ce serait plutôt 

        millis() - captureDuTemps > time

        parce qu'arrivé à 2^32-1 ms (49.7 jours), les unsigned long utilisés pour stocker le temps rebouclent à 0, donc "captureDuTemps + time" va être immédiatement inférieur à millis() jusqu'à ce que millis() dépasse également cette limite. En utilisant la différence plutôt que la somme, même en cas de rebouclage de millis(), la différence tiendra toujours dans un unsigned long (sauf si on essaye de mesurer des intervalles de temps de plus de 49 jours).

        • Partager sur Facebook
        • Partager sur Twitter

        3 bp et 1 afficheur 7 segment

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown