Bonjour, le tuto m'a permit de faire quelques projets mais je bloque sur un point.
J'ai dans mon programme void loop qui mène soit à void reglage soit void programme selon l'état haut ou bas d'une entrée.
On sortant de void reglages je ne reviens pas forcement sur etat_programme pour enuméré plus haut.
auriez vous une idée pour quelque soit le dernier etat sur void reglages, lorsque je reviens sur void reglages je reviennes à l'état_réglages ?
Cordialement
#include <LiquidCrystal.h>
#include <EEPROM.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
/*-----ENTREES-ET-SORTIES----*/
int bouton_p1 = 22;
int bouton_p2 = 30;
int clavier_p1 = 28;
int clavier_p2 = 36;
int contact_p1 = 26;
int contact_p2 = 34;
int menus = 38;
int contactrelais_p1 = 24;
int contactrelais_p2 = 32;
int relais_p1 = 49;
int relais_p2 = 51;
/*----VALEURS-RETROECLAIRAGE----*/
const byte retroeclairage = 10;
int retro_bas;
int retro_haut;
/*-----TEMPORISATIONS------*/
int tempo_retro;
int tempo_ouv_p1;
int tempo_ouv_p2;
int verif_blocage_p1;
int verif_blocage_p2;
/*-----LISTING-ETATS-----*/
enum etat : byte {
BUTTON_NONE,
BUTTON_UP,
BUTTON_DOWN,
BUTTON_LEFT,
BUTTON_RIGHT,
BUTTON_SELECT,
PROGRAMME_DEBUT,
PROGRAMME_EN_ATTENTE,
OUVERTURE_P1,
OUVERTURE_P2,
PROGRAMME_P1_OUVERTE,
PROGRAMME_P2_OUVERTE,
VERIFICATION_P1,
VERIFICATION_P2,
REGLAGES_EN_ATTENTE,
MENU_T_OUV1,
REGLAGE_T_OUV1,
MENU_T_OUV2,
REGLAGE_T_OUV2,
MENU_T_RETRO,
REGLAGE_T_RETRO,
MENU_RETRO_H,
REGLAGE_RETRO_H,
MENU_RETRO_B,
REGLAGE_RETRO_B
};
etat etat_programme = PROGRAMME_DEBUT;
etat etat_reglages = REGLAGES_EN_ATTENTE;
void setup() {
lcd.begin(16, 2);
EEPROM.get(10, tempo_retro);
EEPROM.get(30, tempo_ouv_p1);
EEPROM.get(50, tempo_ouv_p2);
EEPROM.get(70, verif_blocage_p1);
EEPROM.get(90, verif_blocage_p2);
EEPROM.get(100, retro_bas);
EEPROM.get(110, retro_haut);
delay(5000);
pinMode(bouton_p1, INPUT);
pinMode(bouton_p2, INPUT);
pinMode(clavier_p1, INPUT);
pinMode(clavier_p2, INPUT);
pinMode(contact_p1, INPUT);
pinMode(contact_p2, INPUT);
pinMode(contactrelais_p1, INPUT);
pinMode(contactrelais_p2, INPUT);
pinMode(menus, INPUT);
pinMode(relais_p1, OUTPUT);
pinMode(relais_p2, OUTPUT);
lcd.clear();
}
byte getPressedButton() {
int value = analogRead(A0);
if (value < 50)
return BUTTON_RIGHT;
else if (value < 250)
return BUTTON_UP;
else if (value < 380)
return BUTTON_DOWN;
else if (value < 550)
return BUTTON_LEFT;
else if (value < 850)
return BUTTON_SELECT;
else
return BUTTON_NONE;
}
void loop() {
if (digitalRead(menus) == HIGH) {
reglages();
}
else {
if (digitalRead(menus) == LOW) {
programme_normal();
}
}
}
void programme_normal() {
static unsigned long lancement_retro;
static unsigned long lancement_blocage_p1;
static unsigned long lancement_blocage_p2;
switch (etat_programme) {
case PROGRAMME_DEBUT:
analogWrite(retroeclairage, retro_haut);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" EN ATTENTE ");
lcd.setCursor(0, 1);
lcd.print(" D'UNE COMMANDE ");
digitalWrite(relais_p1, LOW);
digitalWrite(relais_p2, LOW);
lancement_retro = millis();
etat_programme = PROGRAMME_EN_ATTENTE;
break;
case PROGRAMME_EN_ATTENTE:
if (millis() - lancement_retro >= tempo_retro) {
analogWrite(retroeclairage, retro_bas);
etat_programme = PROGRAMME_EN_ATTENTE;
}
if (digitalRead(bouton_p1) == HIGH) {
digitalWrite(relais_p1, LOW);
digitalWrite(relais_p2, LOW);
analogWrite(retroeclairage, retro_haut);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BOUTON ");
lcd.setCursor(0, 1);
lcd.print("PORTE 1 ");
delay (1000);
etat_programme = OUVERTURE_P1;
}
if (digitalRead(clavier_p1) == HIGH) {
digitalWrite(relais_p1, LOW);
digitalWrite(relais_p2, LOW);
analogWrite(retroeclairage, retro_haut);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CLAVIER ");
lcd.setCursor(0, 1);
lcd.print("PORTE 1 ");
delay (1000);
etat_programme = OUVERTURE_P1;
}
if (digitalRead(bouton_p2) == HIGH) {
digitalWrite(relais_p2, LOW);
digitalWrite(relais_p1, LOW);
analogWrite(retroeclairage, retro_haut);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("BOUTON ");
lcd.setCursor(0, 1);
lcd.print("PORTE 2 ");
delay (1000);
etat_programme = OUVERTURE_P2;
}
if (digitalRead(clavier_p2) == HIGH) {
digitalWrite(relais_p2, LOW);
digitalWrite(relais_p1, LOW);
analogWrite(retroeclairage, retro_haut);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CLAVIER ");
lcd.setCursor(0, 1);
lcd.print("PORTE 1 ");
delay (1000);
etat_programme = OUVERTURE_P2;
}
if ((digitalRead(contact_p1) == LOW) || (digitalRead(contactrelais_p1) == LOW)) {
digitalWrite(relais_p1, LOW);
digitalWrite(relais_p2, LOW);
analogWrite(retroeclairage, retro_haut);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ANOMALIE ");
lcd.setCursor(0, 1);
lcd.print("FERMETURE P1 ");
delay (500);
etat_programme = VERIFICATION_P1;
}
if ((digitalRead(contact_p2) == LOW) || (digitalRead(contactrelais_p2) == LOW)) {
digitalWrite(relais_p1, LOW);
digitalWrite(relais_p2, LOW);
analogWrite(retroeclairage, retro_haut);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ANOMALIE ");
lcd.setCursor(0, 1);
lcd.print("FERMETURE P2 ");
delay (500);
etat_programme = VERIFICATION_P2;
}
break;
case OUVERTURE_P1:
digitalWrite(relais_p1, HIGH);
digitalWrite(relais_p2, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("OUVERTURE ");
lcd.setCursor(0, 1);
lcd.print("PORTE 1 ");
delay (tempo_ouv_p1);
etat_programme = PROGRAMME_P1_OUVERTE;
break;
case OUVERTURE_P2:
digitalWrite(relais_p2, HIGH);
digitalWrite(relais_p1, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("OUVERTURE ");
lcd.setCursor(0, 1);
lcd.print("PORTE 2 ");
delay (tempo_ouv_p2);
etat_programme = PROGRAMME_P2_OUVERTE;
break;
case PROGRAMME_P1_OUVERTE:
if ((digitalRead(contact_p1) == HIGH) && (digitalRead(contactrelais_p1) == HIGH)) {
etat_programme = PROGRAMME_DEBUT;
}
if ((digitalRead(contact_p1) == LOW) || (digitalRead(contactrelais_p1) == LOW)) {
digitalWrite(relais_p1, LOW);
digitalWrite(relais_p2, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ATTENTE ");
lcd.setCursor(0, 1);
lcd.print("FERMETURE P1 ");
delay (500);
}
break;
case PROGRAMME_P2_OUVERTE:
if ((digitalRead(contact_p2) == HIGH) && (digitalRead(contactrelais_p2) == HIGH)) {
etat_programme = PROGRAMME_DEBUT;
}
if ((digitalRead(contact_p2) == LOW) || (digitalRead(contactrelais_p2) == LOW)) {
digitalWrite(relais_p1, LOW);
digitalWrite(relais_p2, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ATTENTE ");
lcd.setCursor(0, 1);
lcd.print("FERMETURE P2 ");
delay (500);
}
break;
case VERIFICATION_P1:
if ((digitalRead(contact_p1) == LOW) || (digitalRead(contactrelais_p1) == LOW)){
digitalWrite(relais_p1, LOW);
digitalWrite(relais_p2, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ANOMALIE ");
lcd.setCursor(0, 1);
lcd.print("FERMETURE P1 ");
delay (500);
}
else {
etat_programme = PROGRAMME_DEBUT;
}
break;
case VERIFICATION_P2:
if ((digitalRead(contact_p2) == LOW) || (digitalRead(contactrelais_p2) == LOW)){
digitalWrite(relais_p1, LOW);
digitalWrite(relais_p2, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ANOMALIE ");
lcd.setCursor(0, 1);
lcd.print("FERMETURE P2 ");
delay (500);
}
else {
etat_programme = PROGRAMME_DEBUT;
}
break;
}
}
void reglages() {
switch (etat_reglages) {
case REGLAGES_EN_ATTENTE:
analogWrite(retroeclairage, retro_haut);
delay (500);
if (digitalRead(menus) == LOW) {
delay (500);
loop();
}
else {
etat_reglages = MENU_T_OUV1;
}
break;
case MENU_T_OUV1:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TEMPORISATION ");
lcd.setCursor(0, 1);
lcd.print("PORTE 1 ");
delay (200);
if (getPressedButton() == BUTTON_RIGHT) {
lcd.clear();
etat_reglages = REGLAGE_T_OUV1;
}
if (getPressedButton() == BUTTON_DOWN) {
lcd.clear();
etat_reglages = MENU_T_OUV2;
}
if (getPressedButton() == BUTTON_SELECT) {
lcd.clear();
delay (500);
loop();
}
if (digitalRead(menus) == LOW) {
lcd.clear();
delay (500);
loop();
}
break;
case REGLAGE_T_OUV1:
lcd.setCursor(0, 0);
lcd.print("TEMPORISATION ");
lcd.setCursor(14, 1);
lcd.print(tempo_ouv_p1 / 1000);
if (getPressedButton() == BUTTON_UP) {
delay (200);
tempo_ouv_p1 = tempo_ouv_p1 + 1000;
tempo_ouv_p1 = constrain(tempo_ouv_p1, 1000, 60000);
lcd.clear();
etat_reglages = REGLAGE_T_OUV1;
}
if (getPressedButton() == BUTTON_DOWN) {
delay (200);
tempo_ouv_p1 = tempo_ouv_p1 - 1000;
tempo_ouv_p1 = constrain(tempo_ouv_p1, 1000, 60000);
lcd.clear();
etat_reglages = REGLAGE_T_OUV1;
}
if (getPressedButton() == BUTTON_LEFT) {
EEPROM.put(30, tempo_ouv_p1);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" REGLAGES ");
lcd.setCursor(0, 1);
lcd.print(" ENREGISTRES ");
delay(1500);
etat_reglages = MENU_T_OUV1;
}
if (digitalRead(menus) == LOW) {
lcd.clear();
delay (500);
loop();
}
break;
case MENU_T_OUV2:
lcd.setCursor(0, 0);
lcd.print("TEMPORISATION ");
lcd.setCursor(0, 1);
lcd.print("PORTE 2 ");
delay (200);
if (getPressedButton() == BUTTON_UP) {
lcd.clear();
etat_reglages = MENU_T_OUV1;
}
if (getPressedButton() == BUTTON_RIGHT) {
lcd.clear();
etat_reglages = REGLAGE_T_OUV2;
}
if (getPressedButton() == BUTTON_DOWN) {
lcd.clear();
etat_reglages = MENU_T_RETRO;
}
if (digitalRead(menus) == LOW) {
lcd.clear();
delay (500);
loop();
}
break;
case REGLAGE_T_OUV2:
lcd.setCursor(0, 0);
lcd.print("TEMPORISATION ");
lcd.setCursor(14, 1);
lcd.print(tempo_ouv_p2 / 1000);
if (getPressedButton() == BUTTON_UP) {
delay (200);
tempo_ouv_p2 = tempo_ouv_p2 + 1000;
tempo_ouv_p2 = constrain(tempo_ouv_p2, 1000, 60000);
lcd.clear();
etat_reglages = REGLAGE_T_OUV2;
}
if (getPressedButton() == BUTTON_DOWN) {
delay (200);
tempo_ouv_p2 = tempo_ouv_p2 - 1000;
tempo_ouv_p2 = constrain(tempo_ouv_p2, 1000, 60000);
lcd.clear();
etat_reglages = REGLAGE_T_OUV2;
}
if (getPressedButton() == BUTTON_LEFT) {
EEPROM.put(50, tempo_ouv_p2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" REGLAGES ");
lcd.setCursor(0, 1);
lcd.print(" ENREGISTRES ");
delay(1500);
etat_reglages = MENU_T_OUV2;
}
if (digitalRead(menus) == LOW) {
lcd.clear();
delay (500);
loop();
}
break;
case MENU_T_RETRO:
lcd.setCursor(0, 0);
lcd.print("TEMPORISATION ");
lcd.setCursor(0, 1);
lcd.print("RETRO-ECLAIRAGE ");
delay (200);
if (getPressedButton() == BUTTON_UP) {
lcd.clear();
etat_reglages = MENU_T_OUV2;
}
if (getPressedButton() == BUTTON_RIGHT) {
lcd.clear();
etat_reglages = REGLAGE_T_RETRO;
}
if (getPressedButton() == BUTTON_DOWN) {
lcd.clear();
etat_reglages = MENU_RETRO_H;
}
if (digitalRead(menus) == LOW) {
lcd.clear();
delay (500);
loop();
}
break;
case REGLAGE_T_RETRO:
lcd.setCursor(0, 0);
lcd.print("TEMPORISATION ");
lcd.setCursor(13, 1);
lcd.print(tempo_retro / 1000);
if (getPressedButton() == BUTTON_UP) {
delay (200);
tempo_retro = tempo_retro + 1000;
tempo_retro = constrain(tempo_retro, 1000, 120000);
lcd.clear();
etat_reglages = REGLAGE_T_RETRO;
}
if (getPressedButton() == BUTTON_DOWN) {
delay (200);
tempo_retro = tempo_retro - 1000;
tempo_retro = constrain(tempo_retro, 1000, 120000);
lcd.clear();
etat_reglages = REGLAGE_T_RETRO;
}
if (getPressedButton() == BUTTON_LEFT) {
EEPROM.put(10, tempo_retro);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" REGLAGES ");
lcd.setCursor(0, 1);
lcd.print(" ENREGISTRES ");
delay(1500);
etat_reglages = MENU_T_RETRO;
}
if (digitalRead(menus) == LOW) {
lcd.clear();
delay (500);
loop();
}
break;
case MENU_RETRO_H:
lcd.setCursor(0, 0);
lcd.print("RETRO-ECLAIRAGE ");
lcd.setCursor(0, 1);
lcd.print("VALEUR ACTIVE ");
delay (200);
if (getPressedButton() == BUTTON_UP) {
lcd.clear();
etat_reglages = MENU_T_RETRO;
}
if (getPressedButton() == BUTTON_RIGHT) {
lcd.clear();
etat_reglages = REGLAGE_RETRO_H;
}
if (getPressedButton() == BUTTON_DOWN) {
lcd.clear();
etat_reglages = MENU_RETRO_B;
}
if (digitalRead(menus) == LOW) {
lcd.clear();
delay (500);
loop();
}
break;
case REGLAGE_RETRO_H:
lcd.setCursor(0, 0);
lcd.print("VALEUR ACTIVE ");
lcd.setCursor(13, 1);
lcd.print(retro_haut);
if (getPressedButton() == BUTTON_UP) {
delay (200);
retro_haut = retro_haut + 1;
retro_haut = constrain(retro_haut, 150, 255);
lcd.clear();
etat_reglages = REGLAGE_RETRO_H;
}
if (getPressedButton() == BUTTON_DOWN) {
delay (200);
retro_haut = retro_haut - 1;
retro_haut = constrain(retro_haut, 150, 255);
lcd.clear();
etat_reglages = REGLAGE_RETRO_H;
}
if (getPressedButton() == BUTTON_LEFT) {
EEPROM.put(110, retro_haut);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" REGLAGES ");
lcd.setCursor(0, 1);
lcd.print(" ENREGISTRES ");
delay(1500);
etat_reglages = MENU_RETRO_H;
}
if (digitalRead(menus) == LOW) {
lcd.clear();
delay (500);
loop();
}
break;
case MENU_RETRO_B:
lcd.setCursor(0, 0);
lcd.print("RETRO-ECLAIRAGE ");
lcd.setCursor(0, 1);
lcd.print("VALEUR PASSIVE ");
delay (200);
if (getPressedButton() == BUTTON_UP) {
lcd.clear();
etat_reglages = MENU_RETRO_H;
}
if (getPressedButton() == BUTTON_RIGHT) {
lcd.clear();
etat_reglages = REGLAGE_RETRO_B;
}
if (getPressedButton() == BUTTON_DOWN) {
lcd.clear();
etat_reglages = MENU_RETRO_B;
}
if (digitalRead(menus) == LOW) {
lcd.clear();
delay (500);
loop();
}
break;
case REGLAGE_RETRO_B:
lcd.setCursor(0, 0);
lcd.print("VALEUR PASSIVE ");
lcd.setCursor(13, 1);
lcd.print(retro_bas);
if (getPressedButton() == BUTTON_UP) {
delay (200);
retro_bas = retro_bas + 1;
retro_bas = constrain(retro_bas, 0, 100);
lcd.clear();
etat_reglages = REGLAGE_RETRO_B;
}
if (getPressedButton() == BUTTON_DOWN) {
delay (200);
retro_bas = retro_bas - 1;
retro_bas = constrain(retro_bas, 0, 100);
lcd.clear();
etat_reglages = REGLAGE_RETRO_B;
}
if (getPressedButton() == BUTTON_LEFT) {
EEPROM.put(100, retro_bas);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" REGLAGES ");
lcd.setCursor(0, 1);
lcd.print(" ENREGISTRES ");
delay(1500);
etat_reglages = MENU_RETRO_B;
}
if (digitalRead(menus) == LOW) {
lcd.clear();
delay (500);
loop();
}
break;
}
}