Bonjour a tous,
Projet en cours de developpement sous Uno, carte finale Nano.
Mon projet a 2 boutons et 3 LED. en temps normal, ces bouton ont une fonction geree par la loop. Une fonction settings permet d'enregistrer les parametres dans la carte afin de modifier son fonctionnement normal. ces parametres peuvent etre modifie en entrant a nouveau dans le settings par maintient d'un des deux boutons lors de la mise sous tension.
je developpe actuellement uniquement cette fonction de Settings.
Une fois dans la fonction Settings, un des boutons permet de selectionner la page. la page est visualisee avec le clignotement d'une des LED par cycle repetitifs. Le second bouton permet de modifier la valeur de la page.
par la suite, un enregistrement des valeurs sera effectuee en fin de settings. (pas encore ecrit).
J'ai fait ce code et il fonctionne plus ou moins comme je le souhaite, sauf que je le trouve mal ecrit et donc difficile a maintenir.
J'ai cherche a eviter toute fonction delay() supperieure a 50 ms pour que l'appuie sur les bouttons soient correctement gere.
Je souhaiterai obtenir de l'aide pour soit pouvoir trouver un code mieux ecrit et qui reponde a ce que j'attends, soit modifier ce code pour qu'il soit plus fluide.
Merci pour votre aide. Voici le code, les commentaires sont en Anglais pour le cas ou je post la meme question sur un forum international.
rien de complique mais, si vous avez des questions...
#include <EEPROM.h>
#define BTW 2
#define BTF 3
#define Lre1 8
#define Lre2 9
#define Lgr1 10
#define Lgr2 11
#define Lgr3 12
#define Lre3 13
#define EAdr1 1
#define EAdr2 2
#define EArd3 3
#define EAdr4 4
#define EAdr5 5
#define EAdr6 6
int page = 1;
int maxPage = 6;
void Settings();
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(BTW, INPUT);
pinMode(BTF,INPUT);
pinMode(Lgr1,OUTPUT);
digitalWrite(Lgr1,HIGH);
pinMode(Lgr2,OUTPUT);
digitalWrite(Lgr2,HIGH);
pinMode(Lgr3,OUTPUT);
digitalWrite(Lgr3,HIGH);
pinMode(Lre1,OUTPUT);
digitalWrite(Lre1,HIGH);
pinMode(Lre2,OUTPUT);
digitalWrite(Lre2,HIGH);
pinMode(Lre3,OUTPUT);
digitalWrite(Lre3,HIGH);
/*
digitalWrite(Lgr1,LOW);
Pze();
digitalWrite(Lgr1,HIGH);
digitalWrite(Lgr2,LOW);
Pze();
digitalWrite(Lgr2,HIGH);
digitalWrite(Lgr3,LOW);
Pze();
digitalWrite(Lgr3,HIGH);
digitalWrite(Lre1,LOW);
Pze();
digitalWrite(Lre1,HIGH);
digitalWrite(Lre2,LOW);
Pze();
digitalWrite(Lre2,HIGH);
digitalWrite(Lre3,LOW);
Pze();
digitalWrite(Lre3,HIGH);
*/
if(digitalRead(BTF)==HIGH){
while(digitalRead(BTF)==HIGH){
delay(50);
}
Settings();
}
Settings(); // a retirer en production
}
void Pze(){
delay(1000);
}
void loop() {
if(digitalRead(BTW)==HIGH){
//delay(50);
while(digitalRead(BTW)==HIGH){
delay(50);
}
digitalWrite(Lgr1,!digitalRead(Lgr1));
}
if(digitalRead(BTF)==HIGH){
//delay(500);
while(digitalRead(BTF)==HIGH){
delay(50);
}
digitalWrite(Lgr2,!digitalRead(Lgr2));
}
}
void Settings() {
int n = 0;
int b = 0;
long delay1 = 30000;
long d1 = 30000;
long delay2 = 20000;
long d2 = 20000;
long delayP = 60000;
long dP = 60000;
int optCount = 1;
bool P = false;
bool led3State = false;
bool pauseState = false;
int maxPageValue =8;
int actPage =1;
while (true) {
while (n < page or b < optCount ) {
if (!P) {
if (d1 == delay1 and n < page) { // in this case the page light is ON
digitalWrite(Lre3, LOW);
d2 = delay2;
}
if (d1 == delay1 and b < optCount){
digitalWrite(Lre1,LOW); //this will start the second light
}
if (d2 == delay2) {
d1--;
} else if (d1 == delay1) {
d2--;
}
if (d1 < 1) {
d2--;
digitalWrite(Lre3, HIGH); //put the page light off
digitalWrite(Lre1,HIGH);
}
if (d2 < 1) {
d1 = delay1;
d2 = delay2;
n++;
b++;
}
}
if (digitalRead(BTF) == HIGH) {// change page
while (digitalRead(BTF) == HIGH) {
delay(50);
}
n = page; //define a new page
page++;//increase page number
P = false;//stop waiting timebetween cycle
dP = delayP;//reset the counter for the pause between cycles
optCount = 1;//reset the value of the page
b=1;//reset du compteur
if (page > maxPage) {// if last page, quit
break;
}
}
if (digitalRead(BTW) == HIGH) {
while (digitalRead(BTW) == HIGH) {
delay(50);
}
optCount++;//increase the value of the option for this page
if (optCount > maxPageValue) { //if we arrive at themaximum function for this page ( var to be modified as table matching max var for each page)
optCount = 1;
}
n = page;
P=false;
dP=delayP;
}
if (P) { //get out if the blinking of the page is in pause (between 2 cycles of blinking, the off moment is longer)
break;
}
}
n = 0;
b = 0;
if (page <= maxPage) {
if (!P) {
P = true;
n = 0;
}
dP--;
if (dP < 1) {
P = false;
d1 = delay1;
d2 = delay2;
dP = delayP;
}
}
if (page > maxPage) {
digitalWrite(Lre3, HIGH);
digitalWrite(Lre1, HIGH);
break;
}
}
}
Merci d'avoir pri le temps de le lire.