Problème avec le LCD keypad shield

Bonjour alors voila je souhaiterai dire à mon programme que lorsque j’appui sur l’une des touche du shield intégré, cela me fait l’action que je veux sauf que je ne me rappelle plus la commande pour cela. Merci à vous

// Charger la librairie LiquidCrystal
#include <LiquidCrystal.h>

// Définir les pins utilisées par le LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Définir les variables globales
char message[16] = "";
int fin = 0;
int heure;
int heures;
int minute;
int minutes;
int seconde;
int secondes;
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5

// Fonction lire les boutons
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // Lire les valeurs du capteurs
// Les valeurs renvoyées sont sensés être: 0, 144, 329, 504, 741
// Il y a une erreur possible de 50
if (adc_key_in > 1000) return btnNONE; // Nous découpons les valeurs possibles en zone pour chaque bouton
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 250) return btnUP;
if (adc_key_in < 450) return btnDOWN;
if (adc_key_in < 650) return btnLEFT;
if (adc_key_in < 850) return btnSELECT;
return btnNONE; // On renvoie cela si l'on est au dessus de 850
}

void setup() // Initialisation
{
lcd.begin(16, 2); // Démarrer la librairie
lcd.setCursor(5,0);
lcd.print("Timer"); // Afficher un message simple
secondes = 0;
minutes = 0;
heures = 0;
}

void loop() // Fonction principale
{
lcd_key = read_LCD_buttons();
while (adc_key_in != btnSELECT)
{
if (adc_key_in == btnUP)
{
  seconde = seconde + 1;
  delay(200);
}
if (adc_key_in == btnDOWN)
{
  seconde = seconde - 1;
  delay(200);
}
sprintf(message,"%2d:%2d:%2d",heure,minute,seconde);
lcd.setCursor(3,1);
lcd.write(message);
}
lcd.clear();
lcd.setCursor(3,0);
lcd.print("done");

/*lcd.setCursor(0,1); // Placer le curseur au début de la seconde ligne
lcd_key = read_LCD_buttons(); // Lire les boutons
while (fin != 1)
{
if (seconde == secondes)
{
  if (minute == minutes)
  {
    if (heure == heures)
    {
      fin = fin + 1;
    }
  }
}
if(secondes ==60)
{
  secondes = 0;
  minutes++;
}
if(minutes == 60)
{
  minutes == 0;
  heures ++;
}
if(heures == 24)
{
  heures = 0;
}
sprintf(message,"%2d:%2d:%2d",heures,minutes,secondes);
lcd.setCursor(3,1);
lcd.write(message);
delay(1000);
secondes++;
}*/
}

dans votre code il y a une fonction qui s'appelle

// Fonction lire les boutons
int read_LCD_buttons()

cette fonction retourne une valeur genre btnNONE, btnRIGHT etc..

dans votre loop vous faites

[color=red]lcd_key[/color] = read_LCD_buttons(); mais ensuite comme test vous faites

if ([color=red][b]adc_key_in[/b][/color] == btnUP)

ça ne peut pas fonctionner si vous n'utilisez pas la bonne variable...

PS

1/ faites ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement
2/ adc_key_in devrait être locale à la fonction read_LCD_buttons et pas globale. comme ça vous n'auriez pas eu la confusion
3/ mettez des else entre vos if ou mieux utilisez un switch/case pour tester les boutons

J-M-L:
dans votre code il y a une fonction qui s'appelle

// Fonction lire les boutons

int read_LCD_buttons()




cette fonction retourne une valeur genre btnNONE, btnRIGHT etc..

dans votre loop vous faites

`[color=red]lcd_key[/color] = read_LCD_buttons();` mais ensuite comme test vous faites



if (adc_key_in == btnUP)




ça ne peut pas fonctionner si vous n'utilisez pas la bonne variable...

PS

1/ faites ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement
2/ adc_key_in devrait être locale à la fonction read_LCD_buttons et pas globale. comme ça vous n'auriez pas eu la confusion
3/ mettez des `else` entre vos if ou mieux utilisez un `switch/case` pour tester les boutons

et du coup je dois mettre quoi à la place de adc_key_in? Parce qu'en cours on avait un truc du genre LCD_buttons_btnUP = 1 ou un truc dans le genre mais j'arrive vraiment plus à me souvenir

ça fait quoi d'après vous ?

[b]lcd_key[/b] = read_LCD_buttons();

Je suppose que sa insère dans lcd_key le adc_key_in que lis read_LCD_buttons ?

Malik13:
Je suppose que sa insère dans lcd_key le adc_key_in que lis read_LCD_buttons ?

non…

lcd_key = read_LCD_buttons();

ça veut dire "stocker dans la variable lcd_key ce que retourne l’appel à la fonction read_LCD_buttons()"

la structure du corps du programme pourrait être comme cela (c’est plus joli sans les #define et avec une énumération)

// On définit des symboles pour les boutons
// cf https://fr.wikibooks.org/wiki/Programmation_C/Types_avancés#.C3.89num.C3.A9rations
enum choixBouton {btnRIGHT, btnUP, btnDOWN, btnLEFT, btnSELECT, btnNONE};

// Fonction lire les boutons
choixBouton read_LCD_buttons()
{
  int adc_key_in;
  adc_key_in = analogRead(0); // Lire les valeurs du capteurs
  // Les valeurs renvoyées sont sensés être: 0, 144, 329, 504, 741
  // Il y a une erreur possible de 50
  if (adc_key_in > 1000) return btnNONE; // Nous découpons les valeurs possibles en zone pour chaque bouton
  if (adc_key_in < 50) return btnRIGHT;
  if (adc_key_in < 250) return btnUP;
  if (adc_key_in < 450) return btnDOWN;
  if (adc_key_in < 650) return btnLEFT;
  if (adc_key_in < 850) return btnSELECT;
  return btnNONE; // On renvoie cela si l'on est au dessus de 850
}

void setup() // Initialisation
{
   // le code
}

void loop() // Fonction principale
{
  switch (read_LCD_buttons()) {

    // le code pour le bouton RIGHT
    case btnRIGHT:

      break;

    // le code pour le bouton UP
    case btnUP:

      break;

    // le code pour le bouton DOWN
    case btnDOWN:

      break;

    // le code pour le bouton LEFT
    case btnLEFT:

      break;

    // le code pour le bouton SELECT
    case btnSELECT:

      break;

    // le code pour pas de bouton
    case btnNONE:

      break;
  } // fin du switch
} // fin de loop()

et la fonction elle retourne quoi? (regardez le code source, c’est ce qui se trouve après le mot clé return)