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
}
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 :)) )
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;
}
}
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 ?