Bonjour,
J'en suis à l'étape de test d'un photo trigger autonome, avec des réglages affichés sur un écran LCD et contrôlable par un encodeur rotatif cliquable, seul problème la gestion de ce menu est assez laborieuses. Disons que je n'arrive pas a passer d'une fonction a une autre sans avoir un affichage clair :
//librairies
#include <LiquidCrystal.h>
#define PHA 9
#define PHB 8
#define Bouton 10
//déclaration
//entrées sorties
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int Actionneur = 13;
int APN = 7;
int Flash = 6;
int CapteurAnalogique = A1 ;
//Sensor Analogique
int etatAnalogique;
int etat_A = LOW;
//valeurs
unsigned long pushTime; //Le pushtime en MS
long pushDelay = 500; //La variable de référence du push en MS
int Reglage;
int Mode;
int Set;
int Dispositif;
int Variable;
int PotVal;
int etat_A_avant = LOW;
//initialisation des réglages à 0
int ValeurDelaisAPN;
int ValeurSensibilite;
int ValeurDelaisFlash;
int ValeurDelaisBoucle;
int ValeurDelaisAction;
int Defaut = 0;
void setup() {
pinMode(Bouton, INPUT); //met la broche en entree
digitalWrite(Bouton, HIGH); // activation du pullup de la broche en entrée
pinMode(Actionneur, OUTPUT); //Sortie
digitalWrite(Actionneur, LOW);
pinMode(PHA, INPUT);
pinMode(PHB, INPUT);
lcd.begin(16, 2);
}
void loop(){
etat_A = digitalRead(PHA);
if((etat_A_avant== LOW) && (etat_A==HIGH)){
if (digitalRead (PHB) == HIGH){
PotVal++;
}
else {
PotVal--;
}
}
etat_A_avant = etat_A;
if ((digitalRead(Bouton)==LOW) && (millis() - pushTime >> pushDelay) ){ //on temporise avec millis pour accuenter la protection contre les rebonds.
Variable++; // Valide
pushTime = millis();
while(digitalRead(Bouton)==LOW); // Evite le rebond
}
Menu();
}
void Menu(){
Reglage = Variable;
switch (Reglage) {
case 0: //cas de repos quand la variable parametre est a 0, ici on protège les réglage en ne faisant rien si on tourne le codeur
Accueil();
break;
case 1: //quand la variable parametre est sur 1 (ici le délais)
Modemenu();
break;
case 2:
DelaisAPN();
break;
DelaisFlash();
case 3:
DelaisAction();
break;
case 4:
Sensibilite();
break;
case 5:
DelaisBoucle();
break;
case 6:
Ready();
break;
case 7:
Reglage = 1;
break;
}
}
void Accueil(){
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Photo Trigger");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Based on Arduino");
}
void Modemenu(){
PotVal = 0;
Mode = PotVal;
switch (Mode) {
case 0: //cas de repos quand la variable parametre est a 0
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Selection Mode");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Select");
break;
case 1:
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Selection Mode");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Par PUSH");
break;
case 2:
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Selection Mode");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Capteur OFF->ON");
break;
case 3: //cas de repos quand la variable parametre est a 0, ici on protège les réglage en ne faisant rien si on tourne le codeur
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Selection Mode");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Capteur ON->OFF");
break;
case 4:
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Selection Mode");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print("Par PUSH Boucle");
break;
}
}
void DelaisAPN(){
PotVal = 0;
ValeurDelaisAPN = PotVal;
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("Delais APN");
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(ValeurDelaisAPN);
}
Je coince un peu sur la structure imbriquée de ce menu, et a cette heure je ne vois pas de solutions.