comprendre un bout de code

Bonsoir à tous,

Voilà, je souhaite comprendre ce bout de code, il fonctionne, fait ce que je souhaite mais je ne le comprend pas complètement. Le but finale est de faire un compte a rebours programmable, j’y vais pas à pas.

Alors ce code il affiche du texte sur la 1er ligne (temps ?) ca, je sais faire. Ensuite sur la deuxième ligne il affiche ce que je tape a l’aide d’un keypad, pour le moments seulement les heures sur deux colonnes et c’est la que je bloque je comprends pas trop ce qu’on lui dis pour qu’il le fasse. Ensuite une fois ces deux colonnes taper il affiche “:” et on pourras passer au minutes.

Ce code met aussi certainement les heures dans une variable appelé hours (enfin je pense).

Ecran

Clavier

carte: Elegoo Carte MEGA 2560 R3 ATmega2560 ATMEGA 16U2

Voilà le code

#include <LiquidCrystal_I2C.h>
#include <Key.h>
#include <Keypad.h>LiquidCrystal_I2C lcd(0x27,16,2);
const byte ROWS = 4; //4 lignes
const byte COLS = 4; //4 colonnes
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = {22,23,24,25}; 
byte colPins[COLS] = {26,27,28,29};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );


void setup(){
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  
}

void loop(){
  char key = keypad.getKey();
  int hours;
  boolean cancel;

  lcd.setCursor(0,0);
  lcd.print("temps ?");
  lcd.setCursor(4,1);
  hours=readHours();
    if (hours == -1)
      cancel = true;
    else
      lcd.print(":");
  }

//--------------------------------- Heures --------------------------------
int readHours ()
{
  char key;
  char hour[3];
  int hours;
  for (int i=0; i<2; ++i)
  {
    do
    {
      key = keypad.waitForKey();
      if (key != NO_KEY);
    }
    while (key == NO_KEY || key == '#');

    if (key == '*')
      return -1;
      
    hour[i] = key;
    lcd.print(key);
  }
  hour[2] = '\0';
  hours = atoi(hour);
  return hours; 
}

Merci de votre aide
Bonne soirée

Le code attend que tu tapes sur 2 touches du clavier, qui est organisé pour les chiffres de 0 à 9 et affiche ces chiffres suivis de ":". Si tu tapes # il ne prend pas l'appui en compte, si tu tapes * il n'affiche rien

bonsoir,

Merci,
Oui ça je suis d'accord (c'est ce qu'il fait) mais en fait ce que je voudrais, c'est savoir ce que veulent dire les lignes ou comment il en ait arriver à écrire ces ligne de code ( la démarche en faite) car mon but n'est pas forcement de recopier bêtement mais plutôt d'être capable de le refaire en sachant ce que je tape et pourquoi.

je m'était peut être mal exprimer au départ.
Il y'as des des char (tableau) a quoi il servent?
et la booléenne "cancel" a quoi elle sert (à l'annulation?)
Merci

Le tableau

char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

sert à définir les significations des touches. C'est uniquement pour simplifier la vie du programmeur, l'Arduino se contente des numéros de colonne et de ligne de la touche appuyée pour savoir de quelle touche il s'agit. Toi, avec ce tableau, tu sais que c'est un 2 ou un 4, c'est plus confortable.

et la booléenne "cancel" a quoi elle sert (à l'annulation?)En l'état du programme : à rien. Je suppose que ça peut servir plus tard, si tu affiches d'autres choses (minutes, secondes).

Merci,

char hour[3];
hour*;*
hour[2];
et ca, ca veut dire quoi, il y'as un tableau mais je comprends pas trop. A priori il servirait a mettre les heures (hour) dans un tableau ? mais pourquoi, les utiliser pour le décompte par la suite?

L'instruction

key = keypad.waitForKey();

renvoie un char puisque c'est ce qui a été déclaré dans le tableau. Tu pourrais afficher des char sur ton écran, mais celui qui a codé a décidé d'afficher des nombres (int) : il passe donc par une variable intermédiaire (hours) dans laquelle il stocke l'heure et qu'il affichera ensuite.

L'indice d'un tableau commence à 0, donc un tableau de dimension 3 contient un élément numéroté 0, puis un 1 puis un 2. Il met le caractère \0 dans le dernier élément pour indiquer que la chaîne de caractère est terminée et traduit en int via la commande atoi.
Cette manière de faire n'est pas forcément la plus optimale, mais c'est son choix...

Ah super merci je commence à comprendre un peu mieux.

Comment peut-on faire autrement sachant que les valeurs entrées a l'aide du keypad seront les valeurs utiliser pour le décompte?

Merci

Si tu tapes un '8', Tu obtiens un char, comme on l'a vu. Il peut devenir un byte en lui ôtant la valeur '0'. Je dis bien "la valeur" : en fait c'est la soustraction du code ASCII du 0 de celui du 8.

56 - 48 = 8

Tu peux donc simplement transformer le char obtenu par la lecture du clavier en un byte. Comme tu veux entrer des chiffres entre 0 et 99, ça tient bien dans un byte (qui plafonne à 256).

Lors de l'appui sur la seconde touche, il suffit de calculer :
10 * touche_1 + touche_2et tu obtiens le nombre voulu (en byte).

Ça me semble plus simple que l'usine à gaz qui passe par un tableau de char puis transforme en int...

Oh la vache !!! :o

Faut que je potasse tout ça,parceque la j’ai du mal :wink:
ca veut dire que lors du premier chiffre taper, il faut faire le calcul (chiffre - le zero) puis sur le second chiffre pareil et ensuite faire l’addition (pas au sens mathématique mais logique) des deux c’est bien ca?

en fait, debut du code la ou j’ai :

Char hour [3]

je le remplace par un byte

void loop(){
  char key = keypad.getKey();
  int hours;
  //char hour[3];// a remplacer par un byte
  byte(hour);
  boolean cancel;

  lcd.setCursor(0,0);
  lcd.print("temps ?");
  lcd.setCursor(4,1);
 
  for (int i=0; i<2; i++)
  {
  	do
  	{
  		key = keypad.waitForKey();
  		if (key != NO_KEY);
  	}
  	while(key == NO_KEY || key == "#");
  	    
  	if (key == "#")
  		return -1;

  	//hour[i] = key; remplacer par la ligne du dessous
    hour = key;
  	lcd.print(key);
  }
  //hour[2] = '\0'; remplacer par la ligne du dessous
   hour ='\0';
   hours = atoi(hours);
   return hours;

      if (hours == -1)
      cancel = true;
    else
      lcd.print(":");
    
  }

alors la ca me mets bien deux chiffres et il sont bon (si je tape “1” c’est bien le 1 qui s’affiche) comme avant sauf que si j’ai bien compris au lieu que ca aille dans un tableau ca va dans un byte.

Mais j’ai pas le calcul (présenter avant) du coup je comprend pas trop.

En tous cas c'est cool d'avoir de l'aide comme ça merci.

ca veut dire que lors du premier chiffre taper, il faut faire le calcul (chiffre - le zero) puis sur le second chiffre pareil et ensuite faire l’addition (pas au sens mathématique mais logique) des deux c’est bien ca?

Presque : quand tu as tes deux chiffres, tu calcules comme je te l’ai dit

10*chiffre1+chffre2

Si tu avais besoin d’un troisième chiffre pour obtenir un nombre entre 100 et 999, tu pendrais le résultat (disons X) et tu ferais de même :

10*X+chiffre3

Etc.

Le byte c’est le résultat de la soustraction :

chiffre = key - '0';