problème de décision Arduino

Bonjour à tous voilà j'ai un soucis sur un problème de décision sur mon programme
Je vous remercie par avance pour votre aide

const int led2R = 3 ;
const int led2V = 5 ;
const int led2B = 6 ;

const int bouton = 10;

long selection;




void setup() {

pinMode (led2R,OUTPUT);
pinMode (led2V,OUTPUT);
pinMode (led2B,OUTPUT);
pinMode(bouton, INPUT);


Serial.begin (9600);
selection = millis();
digitalWrite (led2B,255);

}

void loop() {


if (digitalRead (bouton)==1){

digitalWrite (led2R,102);
digitalWrite (led2V,0);
digitalWrite (led2B,153);

 
 }
else
{

if ((millis() - selection) > 5000)
{
digitalWrite (led2R,255);
digitalWrite (led2V,255);
digitalWrite (led2B,0); 
selection = millis();

}
}
}

composant utiliser:

arduino uno
un bouton
led rgb

L'algorithme que je veux réaliser est le suivant:

début du programme: led bleu s'allume

si j'appuie sur un bouton la led devient violet et le reste
par contre si je n'est pas appuyer sur le bouton dans un temps de 10sec alors la led devient jaune.

Le problème:

quand j'appuie sur le bouton la led change bien de couleur (du bleu au violet)
mais au bout de 10sec elle rechange en jaune alors qu'elle doigt rester violet car il y a eu un appuie sur le bouton avant.

bonjour,
il faut que tu mémorises l’appui sur le bouton pour valider ta couleur, sinon elle finit par passer au jaune au bout de la tempo de 10s dès que tu relâches le bouton.

Oui je vois, mais je ne sais pas dutout comment faire...

tu peux créer une 2ème variable,

ex:
int memoire_bouton = 0 ;
ou:
bool memoire_bouton = FALSE ;

qui prend la valeur '1' ou 'TRUE' quand tu détectes un appui, et tu la testes en parallèle (ou à la place) du bouton.

tu peux aussi tourner en rond (boucle infinie) quand tu as appuyé.

vu que tu n'as que ça à faire, tu n'as même pas besoin de gérer le relâchement.

même si c'est un peu démesuré pour un truc simple, c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états qui est un concept à bien maîtriser. (cf mon tuto éventuellement)

const int led2R = 3 ;
const int led2V = 5 ;
const int led2B = 6 ;
const int bouton = 10;

int memoire_bouton = 0 ;
long selection;




void setup() {

pinMode (led2R,OUTPUT);
pinMode (led2V,OUTPUT);
pinMode (led2B,OUTPUT);
pinMode(bouton, INPUT);


Serial.begin (9600);
selection = millis();
digitalWrite (led2B,255);

}

void loop() {

digitalRead(memoire_bouton);
Serial.print(memoire_bouton);


if (digitalRead (bouton)==1){

digitalWrite (led2R,102);
digitalWrite (led2V,0);
digitalWrite (led2B,153);
memoire_bouton=1;
Serial.print(memoire_bouton);

 
 }
else
{

digitalRead(memoire_bouton);
if (((millis() - selection) > 5000) && (memoire_bouton==0))
{
digitalWrite (led2R,255);
digitalWrite (led2V,255);
digitalWrite (led2B,0); 
selection = millis();

}
}
}

je te remercie ! j'a remarqué un deuxième problème c'est que je veux que le bouton ne soit plus utilisable après!

Je vous remercie de votre aide j’ai réussi à régler tous mes problèmes

Voici le code

const int led2R = 3 ;
const int led2V = 5 ;
const int led2B = 6 ;
const int bouton = 10;

int memoire_bouton = 0 ;
long selection;




void setup() {

pinMode (led2R,OUTPUT);
pinMode (led2V,OUTPUT);
pinMode (led2B,OUTPUT);
pinMode(bouton, INPUT);


Serial.begin (9600);
selection = millis();
digitalWrite (led2B,255);

}

void loop() {

digitalRead(memoire_bouton);
Serial.print(memoire_bouton);


if ((digitalRead (bouton)==1) && (memoire_bouton<2)) {

digitalWrite (led2R,102);
digitalWrite (led2V,0);
digitalWrite (led2B,153);
memoire_bouton=1;
Serial.print(memoire_bouton);

 
 }
else
{

digitalRead(memoire_bouton);
if (((millis() - selection) > 10000) && (memoire_bouton==0))
{
digitalWrite (led2R,255);
digitalWrite (led2V,255);
digitalWrite (led2B,0); 
memoire_bouton=2;
selection = millis();

}
}
}

Bonne fin de journée à vous!

souvent un peu de réflexion amène à des solutions simples et opérationnelles, quand d'autres prônent l'utilisation d'usines à gaz ...

5_cylindres:
souvent un peu de réflexion amène à des solutions simples et opérationnelles, quand d'autres prônent l'utilisation d'usines à gaz ...

Si c'est pour l'usage d'une machine à état que je mentionnais — oui comme je l'avais écrit c'est un peu le marteau pour écraser une mouche dans ce cas.

Il n'en reste pas moins que maîtriser la structuration d'une machine à état c'est pas mal et que ça crée une structure de code propre et largement évolutive.


D'autre part le code posté ci dessus, c'est quand même un peu n'importe quoi quand je vois desdigitalRead(memoire_bouton);qui trainent et des

int memoire_bouton = 0 ;
...
memoire_bouton=1;
...
memoire_bouton=2;

il y a aussi le problème d'AnalogWrite versus digitalWrite...

ça prouve que @fabienrvl n'a pas encore tout capté et que faire des tutos ça n'est jamais du temps perdu....

"Rome ne s'est pas ... etc" : il débute et finira par bien apprendre en expérimentant.

Je trouve que son approche est intelligente : il discrimine bien les 3 états possibles (attente, appuyé, délai dépassé) et gère ainsi correctement le fonctionnement dicté par son cahier des charges.
En fait il a réinventé les machines à états tout seul.

Bonne journée à toi aussi.

Je trouve que son approche est intelligente

Je n'ai pas dit le contraire. Oui il y a des états mais pas formalisés. et son code ne respecte pas le cahier des charges (bugs).

A titre éducatif, et pour montrer que ce n'est pas non plus l'usine à gaz que vous imaginez, voici un dessin qui représente la machine (infernale) à état et le code associé.

const byte pinBouton = 10;
const byte pinLedRouge = 3 ;
const byte pinLedVerte = 5 ;
const byte pinLedBleue = 6 ;

enum : byte {BOOT, BLEU, VIOLET, JAUNE} etat = BOOT;

void setup()
{
  pinMode (pinLedRouge, OUTPUT);
  pinMode (pinLedVerte, OUTPUT);
  pinMode (pinLedBleue, OUTPUT);
  pinMode(pinBouton, INPUT);        // idéalement en INPUT_PULLUP, on évite une résistance
  digitalWrite (pinLedBleue, HIGH);
  etat = BLEU;
}

void loop()
{
  switch (etat) {
    case BLEU: // on est toujours en bleu
      if (millis() > 10000) { // si le temps est écoulé on passe Jaune
        digitalWrite (pinLedRouge, HIGH);
        digitalWrite (pinLedVerte, HIGH);
        digitalWrite (pinLedBleue, LOW);
        etat = JAUNE;
      } else if (digitalRead(pinBouton) == HIGH) {// si le bouton est enfoncé on passe Violet
        analogWrite (pinLedRouge, 102);
        digitalWrite (pinLedVerte, LOW);
        analogWrite (pinLedBleue, 153);
        etat = VIOLET;
      }
      break;
    default:;
  }
}

(code tapé ici donc non vérifié, moi aussi j'ai pu mettre des bugs :slight_smile: )

Personnellement, mais ça n'engage que moi, je préfère très largement lire cette version. et si on devait évoluer pour faire autre chose quand on est devenu jaune ou violet, ce serait simple à ajouter (sinon on peut faire sauter le switch est simplement faire un test sur if (etat == BLEU) {...} puisque c'est le seul état qui importe

J-M-L, avec quoi fais-tu de si beaux schémas, avec ombres et tout et tout ?

Avec keynote sur mon mac/iPhone/iPad/internet (logiciel gratuit fourni avec l’écosystème Apple - en gros c’est le PowerPoint ou Impress de OpenOffice et la suite LibreOffice sur Linux mais fait/Optimisé pour le monde Apple et simple d’emploi sans doute moins d’une minute montre en main pour faire le png ci dessus ).