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!!!
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
}
}
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() {}
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(;;);
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)
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.