Bonjour
J'ai réussi à faire un menu super simple, et sous forme de fonction, qui réponde (presque) à mon besoin.
Il s'agit de régler un chronomètre à faisceau laser.
A terme, les valeurs seront, je pense, stockées dans l'Eeprom.
En attendant, il y a un paradoxe: ce menu permet de régler le contraste et la luminosité de l'afficheur, mais... en différé! On règle la luminosité, mais onn voit pas c'qu'on fait! Bah bravo
Etant donné que je lis partout qu'il faut éviter les variables globales et de les modifier dans des fonctions et tout ça, dois-je utiliser un tableau?
En effet, les variables que ce menu modifie devraient l'être DANS la fonction et non pas après le RETURN...
Si vous avez compris le souci et que vous avez un avis, j'en suis preneur.
Merci
int PinCLK = 4;
int PinDT = 5;
int PinSW = 0;
static long encoderpos;
int PinCLKLast = LOW;
int n = LOW;
void setup() {
pinMode (PinCLK,INPUT);
pinMode (PinDT,INPUT);
pinMode (PinSW,INPUT);
Serial.begin (9600);
//test de la fonction
Serial.println (RoMenu("Contraste", 50, 0, 100, 5, "Minimum", "Maximum"));
delay(1000);
Serial.println (RoMenu("Beep son", 1,0, 1, 1, "Sans", "Avec"));
delay(1000);
Serial.println (RoMenu("Nombre de tours",1,0,999,1,"Infini","999 Maxi"));
delay(1000);
}
void loop() {
}
int RoMenu(String Titre, int encoderpos, int Vmin, int Vmax, int Vinc, String TxtMin, String TxtMax) {
//paramètres; (Titre, Valeur initiale, Valeur Minimale, Valeur Maximale, Valeur d'incrementation, Mot de remplacement pour la valeur min, Mot de remplacement pour la valeur max)
Serial.println(Titre); //affiche le titre
//afficher la valeur indiquée sous la bonne forme
if (encoderpos<=Vmin) {Serial.println(TxtMin);}
else if (encoderpos>=Vmax) {Serial.println(TxtMax);}
else {Serial.println(encoderpos);}
encoderpos=encoderpos-Vinc; //rétablit la vraie valeur au démarrage
while ((digitalRead(PinSW))) { // tant qu'on n'appuie pas sur le bouton
n = digitalRead(PinCLK); //lit la valeur
if ((PinCLKLast == LOW) && (n == HIGH)) {
if (digitalRead(PinDT) == LOW) { //si sens antihoraire
encoderpos=encoderpos-Vinc; //décrémenter
delay(100);
}
else { //sens horaire
encoderpos=encoderpos+Vinc; //incrémenter
delay(100);
}
encoderpos = constrain (encoderpos,Vmin,Vmax); //rétablit la valeur mini ou maxi de la variable si elle a dépassé les limites données par l'utilisateur
//comparer la valeur à cells fournies et adapter l'affichage
if (encoderpos<=Vmin) {Serial.println(TxtMin);}
else if (encoderpos>=Vmax) {Serial.println(TxtMax);}
else {Serial.println(encoderpos);}
//delay(100);
}
PinCLKLast = n;
}
Serial.println("FIN");
return encoderpos;
}