Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Bloqué dans une boucle

Petit programme sur l'llumination d'une LED RGB

Sujet résolu
    1 mai 2012 à 21:50:39

    Bonjour Bonjour!
    Toujours en plein apprentissage avec Mon petit Arduino, je me suis attaqué hier à un programme pour faire fonctionner une led RGB sur plusieurs motifs

    Après plusieurs heures à forcer pour programmer le tout moi-même, j’obtiens ça :
    //Illumination d'une Led RGB
    
    const int rouge=9; //broche rouge au pin 9
    const int vert=10; //broche vert au pin 10
    const int bleu=11; //broche bleue au pin 11
    
    //Variables pour le Vert
    unsigned int vv=255;
    unsigned int vv1=255;
    unsigned int vv2=255;
    
    //Variables pour le Rouge
    unsigned int vr=255;
    unsigned int vr1=255;
    unsigned int vr2=255;
    
    //Variables pour le Bleu
    unsigned int vb=255;
    unsigned int vb1=255;
    unsigned int vb2=255;
    
    unsigned int maxi=0;//Borne d'intensité max de l'illumination
    
    void setup() //Initialisation
    {
      pinMode(vert,OUTPUT);
      pinMode(rouge,OUTPUT);
      pinMode(bleu,OUTPUT);
      
      analogWrite(vert,255);
      analogWrite(rouge,255);
      analogWrite(bleu,255);
    }
    
    
    void loop ()
    {  
      for (unsigned int i=0 ; i<240 ; i++)
     //Un cycle est fait de 240 itérations, donc un cycle pour une couleur dure 80 tops
      {
        
        // VERT
        vv1=map(i,20,80,255,maxi); //vv1 représente la phase de croissance du vert (40tops)
        vv2=map(i,80,140,maxi,255); //vv2phase décroissante
        vv=min(vv1,vv2);  //On prend le min de vv1 et vv2
        vv=min(vv,255); //On borne à un max de 255 (cf. fction Borne() )
        
        // ROUGE
        vr1=map(i,0,60,maxi,255);
        vr2=map(i,180,240,255,maxi);
        vr=min(vr1,vr2);
        vr=min(vr,255);
        
        // BLEU
        vb1=map(i,100,160,255,maxi);
        vb2=map(i,160,220,maxi,255);
        vb=min(vb1,vb2);
        vb=min(vb,255);
       
        analogWrite(bleu,vb); //on envoie les valeurs respectives aux Cathodes
        analogWrite(vert,vv);
        analogWrite(rouge,vr);
        
        delay(20);  //pause de 20ms
      }
    
    }
    


    Je partage parce que j'en suis plutôt content et qu'il fonctionne bien!

    Maintenant le problème, j'ai créer un nouveau programme dans lequel je voudrais qu'il y ait plusieurs modes d'affichage, pour commencer simplement : Led éteinte ou "Couleur tournante"
    le changement se faisant à chaque appuie sur un BP.

    void loop ()
    {
      vbp=digitalRead(bp); //Lecture de l'état du BP
      
      
      if (vbp != HIGH) //si on appuie sur le BP
      {
        mode++; //On incrémente la variable mode
      }
      
      if (mode == nbrmode) //Qd la variable mode vaut nbrmode on la repasse à zéro (ie quand on attend le dernier mode)
      {
        mode=0; 
      }
      
      switch (mode) //Application du mode
      {
        case 0:
        eteindre; //passe toutes les leds à 255 donc éteintes
        break;
        case 1:
        mode1(); //lance le programme de "couleur tournante"
        break;
      }
    }
    


    Le programme démarre donc bien en mode 0, c'est à dire Led éteinte, et passe en mode 1 "couleur tournante" à l'appui sur le BP, mais ensuite il reste bloqué dans ce mode, alors qu'il devrait (j'aimerais ^^ du moins) repasser à éteint à l'appui du BP.
    J'ai tenté avec l'interruption matérielle, mais ca ne va pas non plus, et je pense qu'il y a un autre moyen de sortir de cette boucle mais je ne trouve pas comment!
    Si vous pouvez donc m'aider, s'il vous plait :)

    Bonne soirée!
    • Partager sur Facebook
    • Partager sur Twitter
      1 mai 2012 à 22:38:13

      Bonsoir, d’après ce que j'ai comprit, il faudrait que tu sorte de ta boucle quand le bouton est relâché, donc un while(digitalRead(bp) == HIGH) devrait marcher

      J’espère t'avoir aidé ^^

      PS : à mon avis j'ai pas compris ton pb :/
      • Partager sur Facebook
      • Partager sur Twitter
      2b||!2b   sqrt(4b²)
        1 mai 2012 à 23:13:23

        Non on n'a pas dû se comprendre ^^,
        Mais c'est vrai que je n'ai peut être pas été clair!

        Je voudrais qu'à chaque appuie sur le BP je passe du mode "éteint()" au mode "mode1()" puis "éteint()", puis "mode1()" etc...

        mais je reste bloqué dans le premier "mode1()"
        • Partager sur Facebook
        • Partager sur Twitter
          1 mai 2012 à 23:35:08

          A mon avis tu as un souci avec ta détection de passage à l'état bas de ton bouton.
          Si tu veux détecter que le bouton vient de passer à l'état haut, alors il faut aussi que tu sache qu'à la mesure précédente il était à l'état bas (besoin d'une variable stockant l'état à t-1)

          Dans l'état, la variable mode s'incrémente tant que le bouton est appuyé... ce qui n'est pas forcément le comportement attendu.
          • Partager sur Facebook
          • Partager sur Twitter

          Retrouvez moi sur mon blog et ma chaine Youtube !

            2 mai 2012 à 12:02:29

            J'ai fait quelques essais et je ne pense pas qu'il s'agisse d'un problème de détection de l'état du bouton. (J’ai quand même améliorer le tout avec une petite fonction de mémoire)

            Mais j'ai fais le test suivant :
            Mon programme était réglé pour commencer en mode (éteint()" et à l'appuie passer à "Couleur()"
            Cela marche

            J'ai donc inversé le tout :
            Commencer en mode "couleur()" puis à l’appuie passer à "éteint()"
            Mais la on reste toujours en mode couleur

            Deuxième chose dont je me suis aperçu, si je reste appuyé sur le bouton jusqu'à ce qu'on cycle "couleur()" se finisse, alors je passe bien en mode éteint.

            Le problème est donc bien qu'il me faudrait un moyen de quitter la boucle for() de couleur(), avant la fin de celle ci si j'appuie sur le bp

            Pour résumer : Comment terminer une boucle for() à l'appuie sur mon bp

            edit :
            C'est bon j'ai réussi, dans ma boucle for(), j'ai ajouté une condition pour vérifier si le bouton changeait d'état
            for (unsigned int i=0 ; (i<240)&&(vbp2==vbpmem) ; i++)
              //Un cycle est fait de 240 itérations, donc un cycle pour une couleur dure 80 tops
              { 
                vbp2= digitalRead(bp);
            [....]
              }
            
            • Partager sur Facebook
            • Partager sur Twitter

            [Arduino] Bloqué dans une boucle

            × 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