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
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
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.
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);
[....]
}
[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.
Retrouvez moi sur mon blog et ma chaine Youtube !