clignoter leds en cliquant sur bouton et cliquer sur un autre bouton et éteindre

Bonjour est ce que vous pouvez m'aider a faire le codage pour faire ce que je veux s'il vous plait ?
J'ai déjà fait ça:

int ledPin = 3;
int ledPin2 = 4;
int buttonApin = 5;
int buttonBpin = 6;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP);
  pinMode(buttonBpin, INPUT_PULLUP);
}

void loop() {
 if (digitalRead(buttonApin) == LOW)
 {loop()
  ;digitalWrite (ledPin, HIGH);
  delay(20);
  digitalWrite (ledPin, LOW);
  delay(20); 
  digitalWrite (ledPin2, HIGH);
  delay(20);
  digitalWrite (ledPin2, LOW);
  delay(20); 
 }
 if (digitalRead(buttonBpin) == HIGH)
 {
  
 }
}

clignoter_2_led_avec_bouton_TEST.ino (541 Bytes)

Désolé je n'ai pas trouver comment mettre le code comme sa sans le fichier

Ah si c'est bon et le partie que je n'arrive pas a faire c'est celle avec le bouttonBpin

Ton code

int ledPin = 3;
int ledPin2 = 4;
int buttonApin = 5;
int buttonBpin = 6;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP);
  pinMode(buttonBpin, INPUT_PULLUP);
}

void loop() {
 if (digitalRead(buttonApin) == LOW)
 {loop()
  ;digitalWrite (ledPin, HIGH);
  delay(20);
  digitalWrite (ledPin, LOW);
  delay(20); 
  digitalWrite (ledPin2, HIGH);
  delay(20);
  digitalWrite (ledPin2, LOW);
  delay(20); 
 }
 if (digitalRead(buttonBpin) == HIGH)
 {
  
 }
}

Ceci n'a rien à faire dans la loop :

loop()
  ;

Sinon, le reste semble bon, un délai de 20ms c'est très court donc tu risques de ne rien voir. Si tu veux que tes leds clignotent en même temps tu peux faire :

void loop() {
 if (digitalRead(buttonApin) == LOW) {
  digitalWrite (ledPin, HIGH);
  digitalWrite (ledPin2, HIGH);
  delay(200);
  digitalWrite (ledPin, LOW);
  digitalWrite (ledPin2, LOW);
  delay(200); 
 }
}

Si tu veux qu'elles clignotent en opposition:

void loop() {
 if (digitalRead(buttonApin) == LOW) {
  digitalWrite (ledPin, HIGH);
  digitalWrite (ledPin2, LOW);
  delay(200);
  digitalWrite (ledPin, LOW);
  digitalWrite (ledPin2, HIGH);
  delay(200); 
 }
}

Ok merci mais si je ne met pas:

loop()
;

Sa ne le fait pas indéfiniment et je n'arrive pas a faire le code pour le buttonBpin (pour éteindre).

Je lis dans ton titre "clignoter leds en cliquant sur bouton et cliquer sur un autre bouton et éteindre" : tu veux dire

  • Bouton A : appui pour faire clignoter les leds
  • Bouton B : appui pour les faire arrêter ?
    Dans ce cas, c'est différent : tu dois créer une variable booléenne qui conserve l'état des leds : clignotantes ou éteintes. On va l'initialiser à false (éteintes) :
bool cligno = false;

Ensuite, tu vas lire les boutons et c'est l'état des boutons qui mettra cette variable à jour :

if (digitalRead(buttonApin) == LOW) cligno = true;
if (digitalRead(buttonBpin) == LOW) cligno = false;

A partir de là, tu dois faire clignoter ou non les leds. Si tu le fais avec des delay(), ce sera bloquant (le processeur ne fait RIEN tant qu'il attend la fin du delay), et tu risques de louper un appui sur un bouton. Il faut donc le faire de manière non bloquante. Pour cela, tu peux t'inspirer du tuto blink without delay qui est très mal fait à mon avis, ou lire (en anglais) les tutos ici et

Oui je voulais dire
bouton A:faire clignoter les leds
bouton B:éteindre les leds
Et merci j'essaie et je te redis si j'y arrive.

Je n'ai pas réussi :slightly_frowning_face:

Poste ton code...

int ledPin = 3;
int ledPin2 = 4;
int buttonApin = 5;
int buttonBpin = 6;
bool cligno = false;
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP);
  pinMode(buttonBpin, INPUT_PULLUP);
}

void loop() {
  
  if (digitalRead(buttonApin) == LOW) cligno = true;
  if (digitalRead(buttonApin) == LOW)
  {loop()
    ;digitalWrite (ledPin, HIGH);
    delay(200);
    digitalWrite (ledPin, LOW);
    delay(200);
    digitalWrite (ledPin2, HIGH);
    delay(200);
    digitalWrite (ledPin2, LOW);
    delay(200);
  }
  if (digitalRead(buttonBpin) == LOW) cligno = false;

}

Ce n'est pas ce que je voulais dire. Voici un "squelette" pour ton code :

const int ledPin = 3;
const int ledPin2 = 4;
const int buttonApin = 5;
const int buttonBpin = 6;
bool cligno = false;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP);
  pinMode(buttonBpin, INPUT_PULLUP);
}

void loop() {
  // Lecture des boutons
  if (digitalRead(buttonApin) == LOW) cligno = true;
  if (digitalRead(buttonBpin) == LOW) cligno = false;
  delay (30); // debounce

  // Clignotement ou non ?
  if (cligno) {
    // Ici faire le clignotement en fonction du temps passé (voir les tutos)
    
  }
}

Dans le "trou", il faut mettre les instructions qui vont faire clignoter ou non en fonction du temps écoulé. C'est pour ça que je te renvoie vers les tutos dans mon message précédent. Ils te donneront les bases.

Mais il restera un peu de réflexion à faire pour gérer le clignotement. Tu dois de plus définir la période de clignotement, le rapport cyclique (pourcentage du temps allumé pendant cette période) et comment les deux leds clignotent l'une par rapport à l'autre (synchrones, en opposition ou complètement désynchronisées).

... De l'importance d'un bon cahier des charges ...

Voilà est ce que c'est sa ?
Code:

const int ledPin = 3;
const int ledPin2 = 4;
const int buttonApin = 5;
const int buttonBpin = 6;
bool cligno = false;
const unsigned long ledPininterval = 500;
const unsigned long ledPin2interval l = 500;
unsigned long ledPintimer;
unsigned long ledPin2timer;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP);
  pinMode(buttonBpin, INPUT_PULLUP);
  ledPintimer = millis ();
  ledPin2timer = millis ();
}
void toggleledPin ()
{
  if (digitalRead (ledPin) == LOW)
     digitalWrite (ledPin, HIGH);
  else
     digitalWrite (ledPin, LOW);
  ledPintimer = millis ();
}
void toggleledPin2 ()
{
  if (digitalRead (ledPin2) == LOW)
     digitalWrite (ledPin2, HIGH);
  else
     digitalWrite (ledPin2, LOW);
  ledPin2timer = millis ();
}
void loop() {
  // Lecture des boutons
  if (digitalRead(buttonApin) == LOW) cligno = true;
  if (digitalRead(buttonBpin) == LOW) cligno = false;
  delay (30); // debounce

  // Clignotement ou non ?
  if (cligno) {
    // Ici faire le clignotement en fonction du temps passé (voir les tutos)
    if ( (millis() - ledPintimer) >= ledPininterval)
       toggleledPin ();
    if ( (millis() - ledPin2timer) >= ledPin2interval)
       toggleledPin2 ();
  }
}

Ça me semble bon. tu as une petite erreur ici:
const unsigned long ledPin2interval l = 500;qui devrait être
const unsigned long ledPin2interval = 500;et tu peux simplifier tes fonction toggle comme ceci :

void toggleledPin ()
{
  digitalWrite (ledPin, !digitalRead (ledPin));
  ledPintimer = millis ();
}

et tu peux gagner un peu de mémoire en déclarant les const int en const byte (j'aurais dû le dire avant)...

As-tu testé ?

Merci, oui j'ai tester et sa donne pas mal et j'aimerai bien te montrer mais je ne sais pas comment tu saurais ?

A part faire une vidéo et la mettre sur un site de partage, je ne sais pas. Mais es-tu satisfait du résultat ?

Ok et oui je suis satisfait du résultat mais j'aimerais que sa aille un peu plus vite mais bon ce n'est pas grave.

Pour que le clignotement se fasse plus rapidement, il suffit de diminuer les valeurs des intervalles (500)

D'accord merci !