Défi de @J-M-L - discussion

Bonjour, je crée ce topic pour que @flix09 et moi puissions poser nos questions en terme de programmation pour le défi de @J-M-L .
Voir ici : Moquez vous de moi, parce que je me moque un peu des autres (dont les platistes)! - #171 by J-M-L
Ne m'en voulez pas si je pose beaucoup de questions... :wink:
Cordialement
Pandaroux007 ( ou Rémi ) :fox_face:

Merci pour la création de ce topic!
Tiens:premiére question:j'ai réussi a faire allumer mes quatres led alléatoirement,maintement,comment faire pour savoir quel bouton presser?
Genre:la led rouge s'allume:OKMais comment savoir lorsque je presse le bon bouton,que ma carte dois valider le round?

Ba c'est justement ce que le défi te demande, comment ferais tu ?

:face_with_symbols_over_mouth:

Bon,je vais réfléchir :wink:

Attend, attend, attend. Chaque chose en son temps. Déjà, pour commencer par un bout, peux-tu poster le début de ton code, stp ?
Moi, je pense qu'il faut commencer par les boutons. Genre, faire un code qui permet de savoir sur quel bouton on a appuyé, dans le moniteur série. Et en plus, intégrer au programme un code pour démarrer les testes des boutons quand on appuie sur le Btn noir.

Bon,j'ai fait un Ctrl+v au lieu d'un Ctrl+c pour te montere mon code.
Il s'est donc éffacé.Recommencerais demain.
Pour l'aléatoire,j'ai choisi random()
Pour les boutons,un test if
Bon,je vais faire du judo... Ça va me calmer d'avoir supprimé mon code :wink:
Rhaaa...
A ce soir.

A mince. Tu peux faire CTRL-Z pour anuller :slightly_smiling_face:
Moi, je viens de commencer le code, donc je poste le début je pense ce soir...

Voici le début de code :

// Avec l'aide des vidéos suivantes : 
// Pour la fonction "random()" -> https://www.youtube.com/watch?v=Y-Mp6BJoY_k
// Pour la fonction "millis()" -> https://www.youtube.com/watch?v=MsfIsHX3AvY

#define pinBTNdemarage  12
#define pinBTN1  11
#define pinBTN2  10
#define pinBTN3  9
#define pinBTN4  8

#define pinLED1  7
#define pinLED2  6
#define pinLED3  5
#define pinLED4  4

bool valBTNdemarage = 0;
bool valBTN1 = 0;
bool valBTN2 = 0;
bool valBTN3 = 0;
bool valBTN4 = 0;
long randomNumber;

bool ledstate = 0;

long prevMillis = 0;
int led_delay = 100;

void setup() 
{
  Serial.begin(115200);
  while(!Serial);
  Serial.println("Demarage du systeme :");
  Serial.println("Demarage de la nouvelle sequence de nombres aleatoires...");

  pinMode(pinLED1, OUTPUT);
  pinMode(pinLED2, OUTPUT);
  pinMode(pinLED3, OUTPUT);
  pinMode(pinLED4, OUTPUT);

  pinMode(pinBTNdemarage, INPUT_PULLUP);
  pinMode(pinBTN1, INPUT_PULLUP);
  pinMode(pinBTN2, INPUT_PULLUP);
  pinMode(pinBTN3, INPUT_PULLUP);
  pinMode(pinBTN4, INPUT_PULLUP);

  randomSeed(analogRead(A0));
}

void loop() 
{
  randomNumber = random(5);
  Serial.print("Le nombre aleatoire est : ");
  Serial.println(randomNumber);

  if (millis() - prevMillis > led_delay)
  {
    ledstate != ledstate;
    digitalWrite(randomNumber, ledstate);
    prevMillis = millis();  
  }
}

Mais j'obtiens ce message d'erreur :

/home/baptiste/Bureau/Defi_de_J-M-L/Defi_de_J-M-L.ino: In function 'void setup()':
Defi_de_J-M-L:11:17: error: expected primary-expression before '=' token
 #define pinLED1 = 7;
                 ^
/home/baptiste/Bureau/Defi_de_J-M-L/Defi_de_J-M-L.ino:35:11: note: in expansion of macro 'pinLED1'
   pinMode(pinLED1, OUTPUT);
           ^~~~~~~
Defi_de_J-M-L:35:18: error: expected primary-expression before ',' token
   pinMode(pinLED1, OUTPUT);
                  ^
Defi_de_J-M-L:12:17: error: expected primary-expression before '=' token
 #define pinLED2 = 6;
                 ^
/home/baptiste/Bureau/Defi_de_J-M-L/Defi_de_J-M-L.ino:36:11: note: in expansion of macro 'pinLED2'
   pinMode(pinLED2, OUTPUT);
           ^~~~~~~
Defi_de_J-M-L:36:18: error: expected primary-expression before ',' token
   pinMode(pinLED2, OUTPUT);
                  ^
Defi_de_J-M-L:13:17: error: expected primary-expression before '=' token
 #define pinLED3 = 5;
                 ^
/home/baptiste/Bureau/Defi_de_J-M-L/Defi_de_J-M-L.ino:37:11: note: in expansion of macro 'pinLED3'
   pinMode(pinLED3, OUTPUT);
           ^~~~~~~
Defi_de_J-M-L:37:18: error: expected primary-expression before ',' token
   pinMode(pinLED3, OUTPUT);
                  ^
Defi_de_J-M-L:14:17: error: expected primary-expression before '=' token
 #define pinLED4 = 4;
                 ^
/home/baptiste/Bureau/Defi_de_J-M-L/Defi_de_J-M-L.ino:38:11: note: in expansion of macro 'pinLED4'
   pinMode(pinLED4, OUTPUT);
           ^~~~~~~
Defi_de_J-M-L:38:18: error: expected primary-expression before ',' token
   pinMode(pinLED4, OUTPUT);
                  ^
Defi_de_J-M-L:5:24: error: expected primary-expression before '=' token
 #define pinBTNdemarage = 12;
                        ^
/home/baptiste/Bureau/Defi_de_J-M-L/Defi_de_J-M-L.ino:40:11: note: in expansion of macro 'pinBTNdemarage'
   pinMode(pinBTNdemarage, INPUT_PULLUP);
           ^~~~~~~~~~~~~~
Defi_de_J-M-L:40:25: error: expected primary-expression before ',' token
   pinMode(pinBTNdemarage, INPUT_PULLUP);
                         ^
Defi_de_J-M-L:6:17: error: expected primary-expression before '=' token
 #define pinBTN1 = 11;
                 ^
/home/baptiste/Bureau/Defi_de_J-M-L/Defi_de_J-M-L.ino:41:11: note: in expansion of macro 'pinBTN1'
   pinMode(pinBTN1, INPUT_PULLUP);
           ^~~~~~~
Defi_de_J-M-L:41:18: error: expected primary-expression before ',' token
   pinMode(pinBTN1, INPUT_PULLUP);
                  ^
Defi_de_J-M-L:7:17: error: expected primary-expression before '=' token
 #define pinBTN2 = 10;
                 ^
/home/baptiste/Bureau/Defi_de_J-M-L/Defi_de_J-M-L.ino:42:11: note: in expansion of macro 'pinBTN2'
   pinMode(pinBTN2, INPUT_PULLUP);
           ^~~~~~~
Defi_de_J-M-L:42:18: error: expected primary-expression before ',' token
   pinMode(pinBTN2, INPUT_PULLUP);
                  ^
Defi_de_J-M-L:8:17: error: expected primary-expression before '=' token
 #define pinBTN3 = 9;
                 ^
/home/baptiste/Bureau/Defi_de_J-M-L/Defi_de_J-M-L.ino:43:11: note: in expansion of macro 'pinBTN3'
   pinMode(pinBTN3, INPUT_PULLUP);
           ^~~~~~~
Defi_de_J-M-L:43:18: error: expected primary-expression before ',' token
   pinMode(pinBTN3, INPUT_PULLUP);
                  ^
Defi_de_J-M-L:9:17: error: expected primary-expression before '=' token
 #define pinBTN4 = 8;
                 ^
/home/baptiste/Bureau/Defi_de_J-M-L/Defi_de_J-M-L.ino:44:11: note: in expansion of macro 'pinBTN4'
   pinMode(pinBTN4, INPUT_PULLUP);
           ^~~~~~~
Defi_de_J-M-L:44:18: error: expected primary-expression before ',' token
   pinMode(pinBTN4, INPUT_PULLUP);
                  ^
exit status 1
expected primary-expression before '=' token

Je ne comprend pas.... J'ai tenté de mettre des points virgules a la fin des #define ... , même si je sais que c'est pas la bonne syntaxe, rien n'y fait :roll_eyes: D'après le message d'erreur, c'est juste sur la définition des valeurs avec les #define...Quelqu'un sait il ce qui ce passe ?

Il faut apprendre, faire des tutos :
#define pinBTNdemarage 12

Je suis débile... Comment j'ai pu passer a côté de ça !? Merci beaucoup pour le lien, @hbachetti . En plus je le savais, c'est ça qui me rend dingue ! :scream: :sweat:

Bonjour pandaroux007

Quand il y a répétition du même type d'objet, comme des boutons ou des LED, il est préférable de les mettre en tableaux, c'est plus facile à manipuler.

Il est préférable d'utiliser, à la place de
#define pinBTN1 11
const byte pinBTN1 = 11;

Bonne continuation
Cordialement
jpbbricole

Je dirais que comme il s'agit de définitions préprocesseur, un enum serait plus adapté.

Bonjour hbachetti

Oui, pour autant que la numérotation soit continue, enum serai plus pratique, mais ça rend les possibilités d'attribuer des ports trop "rigide", le tableau est préférable.
L'habitude d'utiliser, pour l'attribution de ports, entre autre, const int, à la place de #define m'a été conseillée par @J-M-L

Cordialement
jpbbricole

Non, on fait comme on veut :

enum pinBtn {btnStart=12, btn1=11, btn2=10, btn3=9, btn4=8};

La quantité de mémoire utilisée, aussi bien en FLASH qu'en RAM est la même.
Un enum fait partie des directives du pré-processseur, au même titre que #define. Elles sont remplacées par leur valeur avant la compilation.

enum pinBtn {btnStart=12, btn1=11, btn2=10, btn3=9, btn4=8};
//const int pinBtn[] = {12, 11, 10, 9, 8};

void setup() {
  Serial.begin(115200);
  Serial.println(btn1);
//  Serial.println(pinBtn[1]);
}

void loop() {
}

Le croquis utilise 1696 octets (5%) de l'espace de stockage de programmes. Le maximum est de 30720 octets.
Les variables globales utilisent 188 octets (9%) de mémoire dynamique, ce qui laisse 1860 octets pour les variables locales. Le maximum est de 2048 octets.

//enum pinBtn {btnStart=12, btn1=11, btn2=10, btn3=9, btn4=8};
const int pinBtn[] = {12, 11, 10, 9, 8};

void setup() {
  Serial.begin(115200);
//  Serial.println(btn1);
  Serial.println(pinBtn[1]);
}

void loop() {
}

Le croquis utilise 1696 octets (5%) de l'espace de stockage de programmes. Le maximum est de 30720 octets.
Les variables globales utilisent 188 octets (9%) de mémoire dynamique, ce qui laisse 1860 octets pour les variables locales. Le maximum est de 2048 octets.

Je dois dire que je préfère la deuxième version, c'est plus intuitif visuellement :

const int pinBtn[] = {12, 11, 10, 9, 8};

A l'utilisation, ensuite, l'enum me semble plus concis :

Au lieu de :

  Serial.println(pinBtn[1]);

Moi je pense qu'il faut commencer avec papier, crayon et cerveau.

  1. définir la structure l'architecture du programme
  2. définir les principaux "modules" qui composeront le programme
  3. faire un organigramme du programme (ou un pseudo-code si vous préférez). Pour voir comment tout ça va s'organiser.
  4. "dérouler" ce pseudo-code à la main pour voir s'il couvre bien les exigences du cahier des charges

Après on peut commencer à envisager de coder....

ah, oui, pas faut...
Je m'y met ! :slightly_smiling_face:

Y a juste ça que je comprend pas. C'est a dire "la structure" ?