Rendre deux boutons poussoirs inactifs

Bonjour
je suis débutant sur Arduino.
Je viens de faire un petit programme qui allume une lampe avec un écran LCD et 3 boutons poussoire (+,- et valider).
Mon programme me demande le temps que je veux allumer ma lampe=> je veux donc, à l'aide des bouton poussoirs choisir le temps et je valide. => Ca c'est bon !
Après avoir appuyer sur le bouton validé, je voudrais rendre les deux boutons "+" et "-" inactif. Cela est ce possible??
Et encore mieux je voudrais que, si je ré-appuie sur le bouton valide, ce la fasse un reset de la carte.

Etant débutant je ne sais pas si je me suis bien exprimer et est ce que j'ai donner assez de détails.
Merci de votre aide

Ce que tu demandes, ce n'est que de la programmation, donc oui c'est possible.
Pour le soft reset, tu as un topic sur la première page, bien le lire jusqu'au bout!!!

Ok je vais lire la première page jusqu'au bout..
Pourriez vous m'aider à faire cette programmation? pour rendre ces deux boutons inactifs??

Principe de la machine d'état

Ton programme à 2 états

  • la lampe est éteinte et le programme attend une validation
  • la lampe est allumée pour le temps T et il faut ignorer les boutons

Donc a toi dans ton code d'avoir cette cette information et d'en tenir compte

Et comment dire au programme d'ignorer les boutons??

J'ai lu le topic sur le soft reset mais je ne comprends pas tout. Est ce que le bouton valider peut devenir ensuite un bouton reset??

Si tu as une variable qui indique l'état :

enum ETAT { LAMPE_ETEINTE, LAMPE_ALLUMEE } Etat;

Il suffit de tester les boutons si et seulement si Etat vaut LAMPE_ETEINTE

void loop()
{
  if ( Etat == LAMPE_ETEINTE )
  {
      // ici tu gère les boutons
      // si tu décide d'allumer la lampe alors n'oublie par de faire Etat = LAMPE_ALLUMEE
  }
  if ( Etat == LAMPE_ALLUMEE }
  {
    // ici tu gère ce qu'il y a a gérer quand la lampe est allumée
  }
}

A oui très bonne astuce. Maintenant il me reste à faire le bouton réset. Est possible?? Réutilisé le bouton "validé" pour repartir du setup()?§

Bonjour,

Si tu utilises attachInterrupt() pour tes deux boutons il suffit de faire dettachInterrupt() pour les rendre inactif.
Sinon une simple variable de type booléen avec un if comme le propose barbudor est largement suffisant.

Salut !
À quoi bon rendre les boutons inactifs ? Il suffit de ne plus les tester.
Si après la première pression sur le bouton "valider" tu veux que la carte ne fasse plus rien tant que le bouton n'est pas à nouveau réenclenché, il suffit de mettre

while(digitalRead(VALIDER) == LOW) { //attendre tant que la bouton n'est pas relache apres validation
  ;
}
while(digitalRead(VALIDER) == HIGH) {  //attendre avant la pression du bouton
  if(millis() >= eteindre) { //s'il est temps d'eteindre la lampe
    digitalWrite(LAMPE, LOW); //l'eteindre
    wdt_enable(WDTO_15MS); //Commande de reset
    for(;;);
  }
}
wdt_enable(WDTO_15MS); //Commande de reset
for(;;);
/* A adapter au programme */

après la sélection du temps choisi.

Quelle est la structure du code ? (Où est placé chaque élément ?)
J'aurai fait

//inclusion des librairies
//definition des broches
//definition d'eteindre
void setup() {
  //initialisation des broches
  //selection du temps d'allumage
  eteindre = millis() + temps_d_allumage_en_millisecondes
  //section d'attente
}

void loop() {}

Il se peut que je n'aie pas compris la demande

Pour plus d'infos, voir ce fil de discussion.

Maintenant il me reste à faire le bouton réset. Est possible?? Réutilisé le bouton "validé" pour repartir du setup()?§

Il ne faut pas confondre faire un reset de l'arduino et faire exécuter la fonction setup().

Dans ton cas il suffit juste d'appeler la fonction setup() si on appuie sur le bouton valider lorsque la temporisation est lancée.

Voila le plan de mon programme :

Librairie

setup()
{
J'initialise juste mon lcd en écrivant "Combien de temps voulez vous allumer la lampe?"
Je mets mes sorties en positions haut de la façon suivante :
digitalWrite(10, HIGH); //Valide
digitalWrite(11, HIGH);//incrémentation
digitalWrite(12, HIGH);//décrémentation
}

loop()
{
IF{bouton 11==HIGH; j++}
IF{bouton 12==HIGH; j--}
IF{bouton 10==HIGH; j'écris à l'écran que la lumière sera allumer j secondes
}

Je veux bien croire que ce n'est peux etre pas la meilleur structure de programme mais c'est mon premier avec arduino donc soyez indulgent ^^
Faut-il que je revoie cette structure??

Que fait cette fonction concrêtement :
wdt_enable(WDTO_15MS); //Commande de reset
for(;;);

Merci pour votre aide :slight_smile:

Oui c'est exactement ça :

fdufnews:

Dans ton cas il suffit juste d'appeler la fonction setup() si on appuie sur le bouton valider lorsque la temporisation est lancée.

Comment faire cela simplement??

Je mettrai le contenu du loop() dans une boucle while() tant que "valider" n'est pas pressé;
J'enlèverai ça :

Clemolgre:
IF{bouton 10==HIGH; j'écris à l'écran que la lumière sera allumer j secondes

et mettrai son contenu (affichage seulement) dans chaque autre IF (in/décrémenter), si trop long : -> Nouvelle fonction;
Après le while, démarrage de la lampe et définition de la millis à la quelle on doit l'éteindre (millis() + j * 1000)

Ok j'essaie tout cela demain et je vous retiens au courant merci pour pour aide...

Que fait cette fonction concrêtement :
wdt_enable(WDTO_15MS); //Commande de reset
for(;smiley-wink;

Elle active le watchdog intégré à l'arduino. Oublies ce truc c'est une cause d'emmerdes et en plus c'est inutile dans ton cas.

Bonjour et désolé de mon retard mais je n'ai pas pu m'y remettre avant !
Je pense que je vais vous donnez tout mon programme afin que tout l monde comprenne mieux !

#include <LiquidCrystal.h>

#define valeurMin 0
#define valeurMax 10


int j=0;
//boolean etatRelais=0;
int etatRelais;
LiquidCrystal lcd(7,6,5,4,3,2);

void setup() {
 
  lcd.begin(20, 4);
  pinMode(10,INPUT); //Déclaration des pin en entrées
  pinMode(11,INPUT);
  pinMode(12,INPUT);
  pinMode(9,OUTPUT);
  
  digitalWrite(10, HIGH); //Sortie mis à l'état Haut
  digitalWrite(11, HIGH);
  digitalWrite(12, HIGH);
  j=0;
  lcd.print("Nombre de douche");
  lcd.setCursor(0,1);
  lcd.print(j);
  lcd.setCursor(0,2);
  lcd.print("Validation?");
  etatRelais=!etatRelais;
  digitalWrite(9,etatRelais);
  //lcd.print(j);
 //delay(100);
}

void loop() {
    
  if (digitalRead(11)==HIGH)//Bouton incrémentation
  {
    if (j<valeurMax)j++;
    lcd.setCursor(0,1);
    lcd.print(j);
    delay(100);
    while((digitalRead(11)==HIGH));
  }
  if (digitalRead(12)==HIGH)//Bouton décrémentation
  {
    if (j>valeurMin)j--;
    lcd.setCursor(0,1);
    lcd.print(j);
    delay(100);
    while((digitalRead(12)==HIGH));
  }
  if(digitalRead(10)==HIGH)//Bouton validation
  {
    int val=j;
    lcd.clear();
    lcd.print("Vs avez selectionnez");
    lcd.setCursor(0,1);
    lcd.print(val);
    lcd.print(" douche(s)");
    lcd.setCursor(0,2);
    lcd.print("Temps attente: ");
    lcd.print(val*10);
    lcd.print(" s");
    etatRelais=LOW; // relais état bas
    digitalWrite(9,etatRelais); // met la broche de commande dans l'état voulu
    delay (val*10000);
    etatRelais=HIGH; //relais état haut, éteinte
    digitalWrite(9,etatRelais); 
    //digitalWrite(9,LOW);
    //delay(5000);      
  }
}

Donc voila à partir de cela, je voudrais que l'on m'aide d'une part en corrigeant les erreurs, d'autre part en rendant les boutons inactifs les deux boutons d'incrémentation et enfin lorsque l'on appuie une première fois sur valider cela nous valide notre choix et quand on ré-appuie sur cette touche le programme repars au setup() !
J'espère avoir été le plus clair, si vous avez des question je vous répondrez!
Merci d'avance pour votre aide!

Il suffit d'utiliser des flags : il s'agit de boolean qui font te servir à rajouter une condition. Par exemple quand tu est dans un menu ou tu veux que tes boutons ne soient plus actifs, tu lèves ton drapeau (à TRUE par exemple) et dans ta condition qui gère ton bouton que tu veux désactiver tu rajoutes && Flag==FALSE. Ainsi quand tu seras dans un menu où tu as levé ton flag, ton bouton ne sera plus actif. Ne pas oublier evidement quand tu reviens à un menu où tes boutons doivent être actif de rabaisser le drapeau.