Boutons pour dfebutants

Bonjour
la semaine dernière, j’ai posté un message pour avoir des infos pour ce type de montage :

1 Bp
2 leds
2 sorties “génération d’une impulsion”

Au repos : leds eteintes
On appuye sur le BP
Une impulsion est générée sur une sortie de l’arduino, puis la led verte s’allume. (et reste allumée).
On appuie sur le Bp a nouveau :
une impulsion est générée sur une autre sortie de l’arduino, puis la led rouge s’allume (et reste allumée).
On appuie à nouveau sur le BP, et le cycle continue…
Voici le programme que j’ai fait grâce à vos indications et modifications que j’ai apportées.
Tout fonctionne sauf : après avoir pressé une fois, puis 2 fois, il faut que j’appuie une troisième fois sur le BP (a vide) pour que le cycle reparte à la la 4ème pression. Je ne comprends pas pourquoi?
Voici le programme
Je rappelle : je suis débutant en programmation.
Merci d’avance

#include <OneButton.h>
const byte buttonPin = 4; // notre bouton est sur la pin 4
OneButton button(buttonPin, true); // true pour le mettre en INPUT_PULLUP

// les pins utilisées pour les LEDs
const byte pinLedRouge = 8;
const byte pinLedVerte = 2;
const byte pinAig = 12;
const byte pinAig2 = 7;

// la liste des états possible de notre système
// ainsi qu'une variable etatCourant prenant une de ces valeurs
enum {REPOS, ETAT_R, ETAT_A, ETAT_V} etatCourant;

// ------------------------------------------------------
// Cette fonction installe l'état initial
// ------------------------------------------------------
void mettreAuRepos()
{

  digitalWrite(pinLedRouge,  LOW);
  digitalWrite(pinLedVerte, LOW);
  digitalWrite(pinAig, LOW);
  digitalWrite(pinAig2, LOW);
  etatCourant = REPOS;
}

// ------------------------------------------------------
// La fonction de call back, appellée automatiquement quand on clique
// ------------------------------------------------------
void simpleclick()
{
  switch (etatCourant) {
    case REPOS: // on était au repos et on a un appui, on allume la rouge
      digitalWrite(pinAig, HIGH);
      delay (200);
      digitalWrite(pinAig, LOW);
      digitalWrite(pinLedRouge, HIGH); // LED rouge alimentée
      etatCourant = ETAT_R; // on note le nouvel état de notre système
      break;


    case ETAT_R:// rouge allumées, on a un appui,ETEINTE
      digitalWrite(pinLedRouge, LOW); // LED rouge ETEINTE

      digitalWrite(pinAig2, HIGH);
      delay (200);
      digitalWrite(pinAig2, LOW);
      digitalWrite(pinLedVerte, HIGH); // LED verte alimentée
      etatCourant = ETAT_V; // on note le nouvel état de notre système
      break;

    case ETAT_V:// verte allumées,

      mettreAuRepos(); // on retourne à l'état initial
      break;
  }
}

// ------------------------------------------------------
// On initialise notre système dans le setup
// ------------------------------------------------------
void setup() {
  pinMode (pinLedRouge, OUTPUT);
  pinMode (pinAig, OUTPUT);
  pinMode(pinLedVerte, OUTPUT);
  pinMode (pinAig2, OUTPUT);


  //conditions Initiales
  mettreAuRepos();

  // On attache la fonction simpleClick() comme callBack
  button.attachClick(simpleclick);
}

void loop() {
  // On vérifie l'état des boutons, ce qui déclenche l'appel de la fonction callBack si nécessaire
  button.tick();

  // ici on peut faire autre chose du moment que ça ne prend pas trop longtemps

}

[/code]

la troisième pression exécute mettreAuRepos(); qui remet l'état à l'état repos et éteint tout

void mettreAuRepos()
{
  digitalWrite(pinLedRouge,  LOW);
  digitalWrite(pinLedVerte, LOW);
  digitalWrite(pinAig, LOW);
  digitalWrite(pinAig2, LOW);
  etatCourant = REPOS;
}

donc vous avez comme cycle:
REPOS --> ROUGE --> VERT --> REPOS --> ROUGE --> VERT --> ...

si vous voulez:
REPOS --> ROUGE --> VERT --> ROUGE --> VERT --> ...

il ne faut pas revenir à repos une fois atteint l'état VERT mais aller vers un état rouge

Merci pour cette réponse ultra rapide
mais je ne connais pas la ligne de code qui indique au programme de revenir au début????
cordialement

merci

demandez vous ce qu'il faut faire dans

    case ETAT_V:// verte allumées,
      mettreAuRepos(); // on retourne à l'état initial
      break;

puisqu'il ne faut pas mettre au repos

effectivement
il faut enlever

mettreAuRepos();

mais dans ce cas la derniere led allumée reste allumée ???

bien sûr puisque vous avez fait le cycle REPOS → ROUGE → VERT
donc vous êtes VERT, vous voulez devenir ROUGE… que faut-il faire ? (indice - vous avez déjà le code dans la transition REPOS → ROUGE :)) )

j'ai essayé plusieurs choses

j'ai donc enlevé la ligne

mettreAuRepos(); // on retourne à l'état initial

j'ai essayé de remplacer par

etatCourant = ETAT_R

mais cela ne fonctionne toujours pas >:( >:( >:(

ben non. Quand vous recevez l'appui bouton et que vous êtes dans l'état VERT, quelles actions faut-il réaliser AVANT de noter que l'on est dans l'état rouge ? autrement dit quelles sont les commandes à envoyer aux PINS pour passer de l'état VERT à ROUGE ?

Je ne trouve pas…
j’essaye plein de possibilités mais aucune ne fonctionnent >:(

[code] 
#include <OneButton.h> 
const byte buttonPin = 4; // notre bouton est sur la broche 4 
OneButton button (buttonPin, true); // true pour le mettre en INPUT_PULLUP 

// les pins utilisés pour les LEDs 
const byte pinLedRouge = 8; 
octet const pinLedVerte = 2; 
octet const pinAig = 12; 
octet const pinAig2 = 7; 

// la liste des états possibles de notre système 
// ainsi qu'une variable etatCourant prenant une de ces valeurs 
enum {REPOS, ETAT_R, ETAT_A, ETAT_V} etatCourant; 

// ------------------------------------------------ ------ 
// Cette fonction installe l'état initial 
// --------------------------------- --------------------- 
void mettreAuRepos () 
{

digitalWrite (pinLedRouge, LOW); 
digitalWrite (pinLedVerte, LOW); 
digitalWrite (pinAig, LOW); 
digitalWrite (pinAig2, LOW); 
etatCourant = REPOS; 
} 

// ----------------------------------------------- ------- 
// La fonction de call back, appelée automatiquement quand on clique 
// ---------------------------- -------------------------- 
void simpleclick () 
{ 
switch (etatCourant) { 
case REPOS: // on était au repos et on a un appui , sur allume la rouge 
digitalWrite (pinAig, HIGH); 
retard (200); 
digitalWrite (pinAig, LOW); 
digitalWrite (pinLedRouge, HIGH); // LED rouge alimentée 
etatCourant = ETAT_R; // on note le nouvel état de notre système
Pause; 


case ETAT_R: // rouge allumées, sur un appui, ETEINTE 
digitalWrite (pinLedRouge, LOW); // LED rouge ETEINTE 
digitalWrite (pinAig2, HIGH); 
retard (200); 
digitalWrite (pinAig2, LOW); 
digitalWrite (pinLedVerte, HIGH); // LED verte alimentée 
etatCourant = ETAT_V; // on note le nouvel état de notre système 
break; 

case ETAT_V: // verte allumées, sur un appui, ETEINTE 
digitalWrite (pinLedVerte, LOW); // LED verte eteinte 
digitalWrite (pinAig, HIGH); 
retard (200); 
digitalWrite (pinAig, LOW); 
digitalWrite (pinLedRouge, HIGH); // LED rouge tout 
etatCourant = REPOS; // on note le nouvel état de notre système 
break; 

} 
}

[/code]

EPOS; // on note le nouvel état de notre système

break;

}
}

[/code]

expliquez pourquoi alors que vous envoyez toutes les commandes pour passer à l'état ROUGE vous finissez le case par etatCourant = REPOS;

Si j'enlève

etatCourant = REPOS; // on note le nouvel état de notre système

les led se bloquent lors de la 3eme pression

Il faut bin dire au programme de repartir au début ???

on va y arriver... si vous configurez le système pour être à l'état ROUGE alors que vous étiez en état VERT, pensez vous qu'il est pertinent de dire que l'état ne change pas ou qu'il est passé au repos ? ou ne semble-t-il pas plus naturel de dire que maintenant on est dans l'état .... suspens.... rouge ?

J’ai donc rajouté

etatCourant=ETAT_R;
break;

Et cela fonctionne

Un grand merci pour votre aide et pour votre patience

et bien voilà :slight_smile: bravo (en espérant que vous ayez compris pourquoi il faut mettre cet état)

J’ai retranscrit le programme pour attiny 45 et cela fonctionne très bien
Encore merci

cool!