Go Down

Topic: Projet Projecteur : Probleme Do while (Read 1 time) previous topic - next topic

xMADOX

Mar 21, 2013, 06:38 pm Last Edit: Mar 21, 2013, 06:50 pm by xMADOX Reason: 1
Bonjour à tous,

Tout d'abord, je vous présente brièvement mon projet de Terminale. J'ai un signal d'entrée (audio) qui doit être traduis pour qu'au final nous obtenions une scène à jouer sur le projecteur LED.

Pour ma part je m'occupe du codage sous arduino, et j'arrive a un problème de taille... J'ai terminé le programme mais lorsque je compile dans la carte et que je test sur une plaque labdec, je m'aperçois que mes boucles DO/WHILE sont ignorées!

Quelqu'un aurait une idée pour m'aider? /:

Je joints ci-dessous une partie du code qui ne prends pas en compte le while
Code: [Select]

if(j==1){
       q=0;
       analogWrite(led_scene_1, 255);
       analogWrite(led_scene_2, 0);
       analogWrite(led_scene_3, 0);

       do{
         Scene_1();// La scène dure 1 seconde
         q++;// Compte le nombre de scène jouée
        }while(digitalRead(entree) == LOW && q<10); // Tant que la valeur d'entrée est 0 et que l'on n'as pas joué 10 fois la scène on continue de jouer la scène 1 (La scène 1 durera au moins 10secondes)
       j++;        
       delay(500);
     }


Merci d'avance.

Christian_R

Un Serial.print(); dans le code permettrait de visualiser pas mal de problèmes.

Est ce que le digitalRead(entree) est booléen ?
Christian

fdufnews

#2
Mar 21, 2013, 10:10 pm Last Edit: Mar 21, 2013, 10:13 pm by fdufnews Reason: 1
Code: [Select]
        }while(digitalRead(entree) == LOW && q<10); // Tant que la valeur d'entrée est 0 et que l'on n'as pas joué 10 fois la scène on continue de jouer la scène 1 (La scène 1 durera au moins 10secondes)

Tu restes dans la boucle tant que les 2 conditions sont vrais.
Donc
Si tu tiens l'entrée à zéro 20s, tu arrêtes la boucle au bout de 10s
Si l'entrée remonte au bout de 3s tu quittes la boucle

xMADOX

#3
Mar 21, 2013, 10:51 pm Last Edit: Mar 21, 2013, 11:05 pm by xMADOX Reason: 1
Christian_R étant qu'un petit novice de arduino je ne connais pas encore son utilité mais merci pour l'info je vais me renseigner !
Sinon oui c'est une entrée booléen.

Et fdufnews,
En fait ce que je voudrai faire concrètement c'est que la scene ce répète en boucle tant que l'entrée n'est pas à 1, cependant il faut aussi que la scène ce joue au moins 10secondes avant de passer à une autre. Tu aurais une idée pour faire ça?

EDIT : Ah effectivement la while fait les deux conditions vrai ça reste... Je pensais que c'était tant que les deux ne sont pas bonnes elles continuent..
Comment obtenir l'inverse alors ? :<

Merci en tout cas pour vos réponses rapides!

xMADOX

Bon, j'ai finalement trouvé, je vous poste ma solution mais je pense que niveau optimisation y'a moyen de faire 10fois mieux!
Si quelqu'un voit une autre solution n'hésitez pas.

Code: [Select]
if(j==1){
       q=0;
       continue_boucle=0;
       analogWrite(led_scene_1, 255);
       analogWrite(led_scene_2, 0);
       analogWrite(led_scene_3, 0);
       
       do{
         Scene_1();// La scène dure 1 seconde
        if(digitalRead(entree)==HIGH){
          continue_boucle=1;
        }
        }while(continue_boucle==0); // Tant que la valeur d'entrée est 0 et que l'on n'as pas joué 10 fois la scène on continue de jouer la scène 1 (La scène 1 durera au moins 10secondes)
       j++;        
       delay(500);
     }


PS : Les 10secondes de la scène 1 on été intégrées directement dans la fonction scène 1

fdufnews

Quote
En fait ce que je voudrai faire concrètement c'est que la scene ce répète en boucle tant que l'entrée n'est pas à 1, cependant il faut aussi que la scène ce joue au moins 10secondes avant de passer à une autre. Tu aurais une idée pour faire ça?


Donc si on écrit la chose
tu veux rester dans la boucle SI le bouton est appuyé OU SI la temporisation est inférieure à 10s
ce qui donne avec ton premier code
Code: [Select]
if(j==1){
        q=0;
        analogWrite(led_scene_1, 255);
        analogWrite(led_scene_2, 0);
        analogWrite(led_scene_3, 0);

        do{
          Scene_1();// La scène dure 1 seconde
          q++;// Compte le nombre de scène jouée
         }while(digitalRead(entree) == LOW || q<10); // Tant que la valeur d'entrée est 0 OU que l'on n'as pas joué 10 fois la scène on continue de jouer la scène 1 (La scène 1 durera au moins 10secondes)
        j++;       
        delay(500);
      }



Go Up