Interruption et changement d'état d'une LED

Bonjour à tous,

Je cherche à changer l'état d'une LED avec un bouton poussoir.
En fonctionnement normal elle s'allume simplement, si on appuie sur le bouton,
la luminosité varie., puis si on réappuie de nouveau, la LED reprend son état normal.

Pour le code je me suis inspiré des vidéos sur les interruption d'Eric Peronnin.




#define PIN_BP 2
#define PIN_LED_ROUGE 3
int comptage=0;
#define DELAI_SANS_REBOND 10000

void setup() {
pinMode(PIN_LED_ROUGE,OUTPUT);
pinMode (PIN_BP, INPUT_PULLUP);
digitalWrite(PIN_LED_ROUGE, HIGH);
}

void loop() {



digitalWrite(PIN_LED_ROUGE, HIGH);
  // exectution oucle debut
static uint8_t dernierBP = HIGH;
uint8_t BP = digitalRead(PIN_BP);
static unsigned long derniereTransition = 0;
unsigned long _micros;

    if (BP==LOW){
      ledvariable();
    }
  //presence d'un front

if (dernierBP!= BP){
    _micros=micros();
if ((_micros-derniereTransition)>= DELAI_SANS_REBOND){
   //Presence front descendant
 derniereTransition =_micros;
// Fin de l'execution de la boucleSCR
dernierBP=BP;
}
}
}   
void ledvariable(){{

    for (comptage=0; comptage <=230; comptage +=1)
                                // LED va s'allumer de 0 au 2nd chifre <=xxx 255 etant son max 
  {analogWrite(PIN_LED_ROUGE, comptage);  //fix lum LED pour chaque incrementation 
delay(5);                      // pause de ms pour stabiliser lum dee chaque increment
}

for (comptage=230; comptage >=0; comptage -=1)
                             // LED va s'eteindre de 0 au 2nd chifre <=xxx 255 etant son max 
  {analogWrite(PIN_LED_ROUGE, comptage);  //fix lum LED pour chaque decrementation 
delay(5);                      // pause de ms pour stabiliser lum dee chaque deincreme;
}
}
}


Après avoir revu et changé la forme du code tous s'exécute en continue dès que j'appuie sur le bouton, je ne vois pas comment séparer les deux états de ma LED

Le but de tous ça est d'éclairer un diorama style garage de vaisseaux spatiaux pour donner
un coté plus réaliste à cette maquette.

Merci d'avance pour vos réponses.

Je pense que tu n'as pas besoin d'interruption pour ça, une machine d'états suffit, comme tu l'as d'ailleurs dessine.
J-M-L a publié un tuto sur le sujet dans le section tutoriels.

Bonjour,

Tout d'abord ton bouton est mal câblé. La résistance doit être entre la pin d'entrée et GND (pulldown) ou entre la pin d'entrée et le 5V (pullup). Il est aussi possible d'utiliser le pullup interne. Comme tu utilises le pullup interne supprime cette résistance.
Ta led est aussi mal câblée, il faut une résistance de limitation de courant.

Ensuite je n'ai pas très bien compris ce que tu veux faire. Tu veux que la luminosité de la led varie quand tu appuies sur le bouton et reste à la luminosité sélectionnée lorsque tu relâches?

Remarques:

  • formates ton code (avec ctrl t), tel quel c'est illisible.
  • ta question et ton programme n'ont rien à voir avec les interruptions.

Bonjour gears01

Je suppose que ton schéma n'est pas le reflet de la réalité, un PULL-DOWS se câble ainsi et la LED, ainsi. Dans ces exemples, il faut, bien sûre, adapter les pin à ton montage :wink:.
Pour résoudre ton problème, il te faut une variable booléenne (ledMarcheVariable) qui s'inverse à chaque pression du bouton. Ensuite, en fonction de cet état, quand ledMarcheVariable est vraie (true) on va à void ledvariable(), quand ledMarcheVariable est fausse (false) on allume la LED en fixe (digitalWrite(PIN_LED_ROUGE, HIGH)).
Dans void ledvariable(), dans chaque boucle, il y a une lecture du bouton, pour, en cas de pression, de sortir immédiatement de la fonction. Le programme donne ça:

#define PIN_BP 2
#define PIN_LED_ROUGE 3
int comptage=0;

boolean ledMarcheVariable = false;      // Si true la LED est fixe, sinon variable, au départ, fixe

void setup() {
	pinMode(PIN_LED_ROUGE,OUTPUT);
	pinMode (PIN_BP, INPUT_PULLUP);
	digitalWrite(PIN_LED_ROUGE, HIGH);
}

void loop() {
	if (digitalRead(PIN_BP) == HIGH)
	{
		ledMarcheVariable = !ledMarcheVariable; // On inverse ledMarcheVariable
		delay(100);                             // Un "petit antirebond"
		while (digitalRead(PIN_BP) == HIGH){}   // Attente du relachement du bouton
	}
	
	if (ledMarcheVariable == true)
	{
		ledvariable();
	} 
	else
	{
		digitalWrite(PIN_LED_ROUGE, HIGH);
	}
	digitalWrite(PIN_LED_ROUGE, HIGH);
}

void ledvariable(){

	for (comptage=0; comptage <=230; comptage +=1)
	// LED va s'allumer de 0 au 2nd chifre <=xxx 255 etant son max
	{
		analogWrite(PIN_LED_ROUGE, comptage);  //fix lum LED pour chaque incrementation
		delay(5);                      // pause de ms pour stabiliser lum dee chaque increment
		if (digitalRead(PIN_BP) == HIGH){return;}    // Pour sortire de la boucle au cas où le BP est pressé
	}

	for (comptage=230; comptage >=0; comptage -=1)
	// LED va s'eteindre de 0 au 2nd chifre <=xxx 255 etant son max
	{
		analogWrite(PIN_LED_ROUGE, comptage);  //fix lum LED pour chaque decrementation
		delay(5);                      // pause de ms pour stabiliser lum dee chaque deincreme;
		if (digitalRead(PIN_BP) == HIGH){return;}    // Pour sortire de la boucle au cas où le BP est pressé
	}
}

Cordialement
jpbbricole

Merci à tous pour vos réponses, la machine d'état semble plus correspondre à ce que je cherchais mais je n'ai pas encore eu le temps de mis plonger.
@jpbbricole merci bcp ton code fonctionne nickel quand je maintiens le bouton enfoncé, je voulais que le variation continu une fois relâché ton code m'a pas mal inspiré en tout cas.

Personnellement je n'ai pas très bien compris ce que tu veux faire.
Est ce que tu veux faire la même chose que certains variateurs:

  • un appui court allume à fond
  • un autre appui court éteint
  • un appui long fait varier l'intensité et l'intensité reste telle que sélectionnée quand on relâche.

Bonsoir gears01

c'était le but :wink:, s'inspirer des autres est un excellent moyen d'avancer.
Bonne continuation.

Cordialement
jpbbricole

Bonjour Kamill,

en fait de base la LED reste allumé, je cherche à faire varié la LED en un appuis court, puis si l'on réappuie de nouveau elle reprend son état initial.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.