Clignoter led avec commande bouton poussoir

Bonjour, je suis un débutant en programmation Arduino.
Ma requête peut paraitre simple, mais je ne sais pas comment procéder.

Pour faire simple, je dispose d'une carte arduino, d'une led et d'un bouton poussoir.
Je souhaite faire en sorte qu'un première click sur le boutton puisse faire clignoter (en boucle) une led, et ainsi, lors d'un seconde click sur ce bouton, la led s'éteindra.
Ainsi de suite...

Je vous remercie vraiment pour une future aide !

Un peu de recherche ou de lecture du sujet épinglé : "le guide arduino" et tu obtiens 100 fois plus que ce que tu cherches .

Deux endroits à privilégier
http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.TousLesProgrammes
Openclass room

et la BIBLE ABSOLUE :

Non mais j'ai déjà cherché sur le net, et cela ne correspond pas à ce que je cherche précisément.

Évidement si tu cherches du tout cuit tu ne trouvera pas sur le net et surtout pas ici.

Les indications que je t'ai donné correspondent à ce que tu as demandé. Maintenant si ce que tu as écrit ne correspond pas a ce que tu pensais je n'y suis pour rien.

Tu as de quoi commencer à faire quelque chose, et de le proposer.
Attention si tu ne proposes rien tu n'aura rien, pour le tout cuit ce n'est pas la bonne adresse.

Bonjour

....
void loop()
{

...

if (digitalRead(pinIN ,HIGH) && e1==1)

     {  action; e1=0; delay( ); }

if (digitalRead(pinIN ,HIGH) && e1==0)

     {  action; e1=1; delay( ); }

....
}

bell-far:
Bonjour

....

void loop()
{

...

if (digitalRead(pinIN ,HIGH) && e1==1)

{  action; e1=0; delay( ); }

if (digitalRead(pinIN ,HIGH) && e1==0)

{  action; e1=1; delay( ); }

....
}

Bonsoir, je souhaite ainsi garder une boucle dans la commande "action" or, du coup, il ne lira jamais l'état ?

Mets systématiquement le code en entier les erreurs sont souvent facécieuses et se cachent là où on ne les attends pas.

Il faudrait revoir la documentation de la fonction delay
Mettre un code qui compile ou alors donne les message d'erreurs.
Je ne veux pas dire mais c'est un peu léger comme travail personnel, il n'y a pas du y avoir un essais de compilation.

je souhaite ainsi garder une boucle dans la commande "action" or, du coup, il ne lira jamais l'état ?

Tu peux détailler stp.
Parce que si tu ne dis pas tout on ne pourra pas avancer.
Si c'est secret ici c'est pas le bon endroit.

PS1: un bouton ça à des rebonds, les rebonds c'est pas bon pour la programation alors quand tu testera met un condensateur de 100 nF environ en parallèle sur les contacts.

PS2 : Si c'est pour le bac autant le dire tout de suite parce qu'on est pas aveugle, je dirais même que je suis un peu éblouît :grin:

Disons que c'est pour le bac alors.

Ainsi, la led et le bouton poussoir sont juste des exemples, je compte changer ce bouton en capteur infrarouge. :slight_smile:
Lorsque la led clignote, je souhaite l'arrêter mais je n'y arrive pas !

void setup()  
{
pinMode(1,OUTPUT)
pinMode(2,INPUT)
}

void loop()
{
StopLoop()
if (digitalRead(1)==HIGH)
{
loop()
digitalWrite(1,HIGH);
delay(1000);
digitaWrite(1,LOW);
delay(1000);


if digitalRead(2)==HIGH)
{
digitalWrite(1,LOW);
goto StopLoop;
}
goto loop;
}
}
1 Like

C'est quoi ces "goto" ?

Il y a des 10zaines d'années que c'est déconseillé et en plus la syntaxe ne me parait pas la bonne, mais comme je n'utilise jamais.

Par contre j'ai essayé de compiler :*

sketch_apr08a.ino: In function 'void setup()':
sketch_apr08a.ino:5:1: error: expected ';' before 'pinMode'
sketch_apr08a.ino: In function 'void loop()':
sketch_apr08a.ino:10:10: error: 'StopLoop' was not declared in this scope
sketch_apr08a.ino:11:1: error: expected ';' before 'if'
sketch_apr08a.ino:27:1: error: expected '}' at end of input
Erreur lors de la compilation.

J'ai l'impression que tu n'as pas compris alors je met les points sur les I :
C'est du foutage de gueule que de donner un code de 20 lignes qui ne compile pas.

Je m'excuse, je vais trop, vite. Je suis assez débordé. Mais, ne vous forcez pas à me répondre... :frowning:
Les goto sont pour moi une chose dont j'ai l'habitude d'utiliser.

void setup()  
{
pinMode(1,OUTPUT);
pinMode(2,INPUT);
}

void loop()
{
StopLoop:
if (digitalRead(1)==HIGH)
{
loop:
digitalWrite(1,HIGH);
delay(1000);
digitalWrite(1,LOW);
delay(1000);


if (digitalRead(2)==HIGH)
{
digitalWrite(1,LOW);
goto StopLoop;
}
goto loop;
}
}

Je te dis tout de suite : je ne connais pas la programation avec des goto et je ne veux pas la connaître.
La possibilité d'utiliser les goto a été conservée pour des cas ultra particuliers qui dépassent mes capacités.

Tu devrais apprendre le C avec le tuto d'Eskimon.
Tu devrais, pour t'aider, écrire en français ce que doit faire ton programme.
La transcription en ligne de code en sera grandement facilitée.
Ensuite quelques variables utilisées dans quelques conditions if devraient remplacer avantageusement les goto antédiluviens.

Tu peux aussi utiliser les interruptions.
Quand l'état change sur une pin d'interruption (exemple suite à l'appui sur un bouton poussoir) cela déclenche une action décrite dans une fonction. Voir la doc du site arduino.

Petite question : c'est voulu de lire une pin configurée en sortie ?
pinMode(1,OUTPUT);
if (digitalRead(1)==HIGH)

bonjour,

Ainsi, la led et le bouton poussoir sont juste des exemples, je compte changer ce bouton en capteur infrarouge. :slight_smile:
Lorsque la led clignote, je souhaite l'arrêter mais je n'y arrive pas !

heu je suis, comment dire, en interrogation devant ca.

tu souhaite arrêter comment le clignotement?
en repassant devant le capteur?

si c'est ca, c'est un changement d'état et il y même un exemple dans l'ide de mémoire

led off au départ
bouton boolean sur false
si passage led on et boolean true
si repassage led of boolean false

oui, c'est voulu, et si c'est facultatif, ça m'aide à me repérer.

Les goto, comme son nom l'indique, permettent juste de renvoyer à la valeur attribuée.

Si je change de code: marche toujours pas.

int e = 0;

void setup()  
{
pinMode(1,OUTPUT);
pinMode(2,INPUT);
}

void loop()
{
if (digitalRead(2)==HIGH) //si on appui sur le btn
{ 
 e=1;
 while (e=1) //tant que (clignotement de la led jusqu'au prochain appui sur le btn)
 {
 digitalWrite(1,HIGH);
 delay(1000);
 digitalWrite(1,LOW);
 delay(1000);
 if (digitalRead(2)==HIGH) //si appui sur le btn
 {
 digitalWrite(1,LOW); // led éteinte
 e=0;
 break; //interruption
 }
 }
}
}

Si je change de code: marche toujours pas.

ca nous avance bien, qu'est ce qui marche pas?

dans les exemples, tu as debounce qui correspond à ce que tu veux faire

heu attends 2s, les pins utilisées 1 et 2, c'est les A1 et A2?

infobarquee:
ca nous avance bien, qu'est ce qui marche pas?

dans les exemples, tu as debounce qui correspond à ce que tu veux faire

heu attends 2s, les pins utilisées 1 et 2, c'est les A1 et A2?

J'arrive à enclencher la boucle du clignotement de la led, mais je n'arrive toujours pas à l'éteindre.
Les pins utilisés sont connectés via D1 et D2.

essaye ca et change les pins
tu ouvre la console et regarde si e change ou pas

int e = 0;
int antirebond = 500;
#define bouton 3
#define led 13
void setup()
{
  Serial.begin(9600);
  pinMode(1, OUTPUT);
  pinMode(2, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(bouton) == HIGH && e == 0) //si on appui sur le btn
  {
    e = 1;
    Serial.println(e);
    delay(antirebond);
    while (e = 1) //tant que (clignotement de la led jusqu'au prochain appui sur le btn)
    {
      digitalWrite(led, HIGH);
      delay(1000);
      digitalWrite(led, LOW);
      delay(1000);
      if (digitalRead(bouton) == HIGH && e==1) //si appui sur le btn
      {
        delay(antirebond);
        digitalWrite(led, LOW); // led éteinte
        e = 0;
        Serial.println(e);
        delay(2000);
        break; //interruption
      }
    }
  }
}

Bonjour, merci car votre code semble fonctionner, mais le problème c'est qu'il faut resté appuyer sur le bouton.
Si cela est possible, je souhaiterai qu'elle s'éteigne directement.

normal puisque la pinbouton est a l'etat haut (pull up) quand le bouton n'est pas appuyé

faut changer le digitalread en low

int e = 0;
int antirebond = 500;
#define bouton 2  // pin2 de l'arduino uno
#define led 13  // led de la carte sur pin13
void setup()
{
  pinMode(led, OUTPUT);
  pinMode(bouton, INPUT_PULLUP);  // pull up interne activé 
}

void loop()
{
  if (digitalRead(bouton) == LOW && e == 0) //si on appui sur le btn on lit etat bas vu pullup interne
  {
    e = 1;
    
    delay(antirebond);
    while (e = 1) //tant que (clignotement de la led jusqu'au prochain appui sur le btn)
    {
      digitalWrite(led, HIGH);
      delay(200);
      digitalWrite(led, LOW);
      delay(250);
      if (digitalRead(bouton) == LOW && e==1) //si appui sur le btn
      {
        delay(antirebond);
        digitalWrite(led, LOW); // led éteinte
        e = 0;
      
        break; //interruption
      }
    }
  }
}

Non, ce n'est pas ça.

chez moi çà marche comme çà : appui bp 1ere fois la led clignote, 2eme fois elle s'arrete, et ainsi de suite

je ne sais pas vraiment ce que tu veux exactement