Menu pour réglages des paramètres, besoin d'aide

Bonjour nemesis47

Pour faire simple, sans le F("ABCDE"), ton texte est stocké en SRAM, avec, ton texte est stocké à la même place que le programme, dans la mémoire flash. Or cette SRAM est précieuse, c'est là que "tourne", il y en a très peu et ton programme plus il en a, plus il sera à l'aise.

J'ai essayé de faire quelque chose pour ton programme, comme je n'ai pas de clavier analogique comme sur ton shield, j'au dû "jongler" avec un potentiomètre, pas facile.
Pour faciliter la lecture du fonctionnement du programme j'ai ajouté des print dans la console à 115200. Tu pourras les supprimer quand tu veux. Il y a un timer, prgrEtatMenuChrono, qui sort de l'état prgEtatMenu après prgrEtatMenuTemps milliSecondes d'inaction des boutons, dans l'état prgEtatMenu

Le programme:

#include "LiquidCrystal.h"
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int commande_monter = 0;
int commande_retour = 1;
int securite = 2;
int contact_moteur = 3;
enum {
  BUTTON_NONE,
  BUTTON_UP,
  BUTTON_DOWN,
  BUTTON_LEFT,
  BUTTON_RIGHT,
  BUTTON_SELECT
};
//------------------------------------- Etat du programme
enum {prgEtatFonctionnement, prgEtatMenu};
int programmeEtat = prgEtatFonctionnement;

unsigned long prgrEtatMenuChrono = millis();     // Timout du mode prgEtatMenu
unsigned long prgrEtatMenuTemps = 8000;     // Temps du timout du mode prgEtatMenu en milliSecondes

void setup() {
  Serial.begin(115200);

  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.write("Digital Dock");
  delay (1000);
  lcd.setCursor(0, 1);
  lcd.write("v1.10");
  delay(5000);
  pinMode(commande_monter, INPUT);
  pinMode(commande_retour, INPUT);
  pinMode(securite, INPUT);
  pinMode(contact_moteur, OUTPUT);
  lcd.clear();

}

void loop()
{
  while ((digitalRead(securite) == HIGH) && (digitalRead(commande_monter) == HIGH))
  {
    commande_monter_levre();
  }
  while ((digitalRead(commande_retour) == HIGH) && (digitalRead(securite) == HIGH))
  {
    commande_retour_auto();
  }
  if (digitalRead(securite) == LOW)
  {
    affichage_securites();
  }
  if ((digitalRead(securite) == HIGH) && (digitalRead(commande_monter) == LOW) && (digitalRead(commande_retour) == LOW))
  {
    commande_relache();
  }

  if (programmeEtat == prgEtatFonctionnement) {
    switch (getPressedButton()) {
      case BUTTON_NONE:
        lcd.print(F("      "));
        break;

      case BUTTON_UP:
        lcd.print(F("UP    "));
        Serial.println(F("UP"));
        break;

      case BUTTON_DOWN:
        lcd.print(F("DOWN  "));
        Serial.println(F("DOWN"));
        break;

      case BUTTON_LEFT:
        lcd.print(F("LEFT  "));
        Serial.println(F("LEFT"));
        break;

      case BUTTON_RIGHT:
        lcd.print(F("RIGHT "));
        Serial.println(F("RIGHT"));
        break;

      case BUTTON_SELECT:
        lcd.print(F("SELECT"));
        Serial.println(F("SELECT Etat Menu"));
        programmeEtat = prgEtatMenu;     // Changement d'état
        prgrEtatMenuChrono = millis();     // Faire un restart du timer à chaque action en mode prgEtatMenu
        break;
    }
  }

  if (programmeEtat == prgEtatMenu) {
    switch (getPressedButton()) {
      case BUTTON_NONE:
        lcd.print(F("      "));
        break;

      case BUTTON_UP:
        lcd.print(F("Var ++"));
        Serial.println(F("Variable ++"));
        break;

      case BUTTON_DOWN:
        lcd.print(F("Var --  "));
        Serial.println(F("Variable --"));
        break;

      case BUTTON_LEFT:
        lcd.print(F("ANNULER  "));
        Serial.println(F("Annuler"));
        break;

      case BUTTON_RIGHT:
        lcd.print(F("ACCEPTEER "));
        Serial.println(F("Accepter"));
        break;

      case BUTTON_SELECT:
        lcd.print(F("SELECT"));
        Serial.println(F("SELECT Etat Fonctionnement"));
        programmeEtat = prgEtatFonctionnement;     // Changement d'état
        break;
    }
    if (getPressedButton() != BUTTON_NONE)     // Si une touche a été pressée
    {
      Serial.println(F("Redemarrage timer"));
      prgrEtatMenuChrono = millis();     // Faire un restart du timer à chaque action en mode prgEtatMenu
    }
  }
  delay(500);

  //     Si plus d'activité en mode prgEtatMenu
  if ((millis() - prgrEtatMenuChrono >= prgrEtatMenuTemps) && programmeEtat == prgEtatMenu)
  {
    Serial.println(F("Retour automatique etat en fonctionnement"));
    programmeEtat = prgEtatFonctionnement;
  }
}


byte getPressedButton() {
  int value = analogRead(A0);
  if (value < 50)
    return BUTTON_RIGHT;
  else if (value < 250)
    return BUTTON_UP;
  else if (value < 410)
    return BUTTON_DOWN;
  else if (value < 570)
    return BUTTON_LEFT;
  else if (value < 850)
    return BUTTON_SELECT;
  else
    return BUTTON_NONE;
}

void commande_monter_levre()
{
  lcd.setCursor(0, 0);
  lcd.print("MONTER          ");
  lcd.setCursor(0, 1);
  lcd.print("                ");
  digitalWrite(contact_moteur, HIGH);
}

void commande_retour_auto()
{
  lcd.setCursor(0, 0);
  lcd.print("RETOUR          ");
  lcd.setCursor(0, 1);
  lcd.print("AUTOMATIQUE     ");
  digitalWrite(contact_moteur, HIGH);
  delay (8000);
}

void commande_relache()
{
  lcd.clear();
  digitalWrite(contact_moteur, LOW);
}

void affichage_securites()
{
  lcd.setCursor(0, 0);
  lcd.print("SECURITES       ");
  lcd.setCursor(0, 1);
  lcd.print("P1              ");
  digitalWrite(contact_moteur, LOW);
}

A ta disposition pour toute question, je ne suis pas sûre à 100% de mon programme :wink:.

Cordialement
jpbbricole

1 Like