Test de rapidité

Bonjour à tous, je cherche à réaliser un système basé sur une carte Nano, 2 coups de poing et 2 voyants pour signaler qui, de 2 concurrents, aurait appuyer sur un des 2 boutons en premier.
Merci de me faire part de vos suggestions.
Merci

Tu n'a pas de suggestions personnel à nous proposer ?
Il faudrait aussi que tu nous dise un peu ton niveau de connaissance sur le monde Arduino.

la suggestion la plus simple, chaque bouton étant connecté à un Arduino, lorsque l'un des deux joueurs appuis, tu note l'heure, celui qui à l'heure la plus petit voit son voyant s'allumer.
Tu avais pensé à quelque chose de différent?

Bonjour castres

Dans un Arduino, dès son démarrage, il y a une horloge qui tourne, les millis().
Dès qu'un bouton est pressé tu lui attribue la valeur de millis() de l'instant, celui qui a la plus petite valeur a gagné.

Cordialement
jpbbricole

Bonjour @jpbbricole
Je pense que je vais faire le code que vous proposez a @castres :slightly_smiling_face:
( juste pour le fun, je vous le poste après... :wink: )

Cordialement
Pandaroux007

P.S : pour @castres , petite vidéo sur millis(); :

Bonsoir pandaroux007

Oui, bonne initiative :wink:
Mais, surtout, avec plein d'explications et de commentaires.

Cordialement
jpbbricole

Ça par contre je ne sais pas comment faire...
Auriez vous une piste ? :wink:
pour l'instant, je pense que je vais faire ça :

void setup(){}
void loop(){
  teste de la valeur de chacun des boutons, que l'on stocke
dans des "bool valBUTON = digitalRead(pinBUTON);"
puis on dit que chaque valeur est égale a millis();
}

Mais ça veux dire que on fait avec des if() ?
Mon code jusqu’à maintenant :

// Pour la fonction "millis()" -> https://www.youtube.com/watch?v=MsfIsHX3AvY
// Pour la demande de base sur le forum : https://forum.arduino.cc/t/test-de-rapidite/1109970/4

long Millis1 = 0;
long Millis2 = 0;

#define PINbouton1 12
#define PINbouton2 11

void setup() {
  Serial.begin(115200);
  Serial.println("Demarage !");

  pinMode(PINbouton1, INPUT_PULLUP);
  pinMode(PINbouton2, INPUT_PULLUP);
}

void loop() {
  
}

Je sais , je suis pas encore très avancé... :wink:

Cordialement
Pandaroux007 / Rémi

Et bien par exemple:

unsigned long temps1, temps2 ecart;
temps1 = milis(); // cela affecte "l'heure" actuelle à la variable temps1
// ici on fait quelque chose qui dure un certain temps
une_fonction_qui_prend_du_temps();
temps2 = milis(); // cela affecte "l'heure" actuelle à la variable temps2
ecart = temps2 - temps2;  // ecart donne le temps qui s'est écoulé pendant que l'on exécutait une_fonction_qui_prend_du_temps()

Bonsoir pandaroux007

unsigned long Millis1 = 0;
est mieux.

Si bouton1 est pressé, Millis1 = millis();

A+
Cordialement
jpbbricole

En même temps, @castres se fiche du temps, il veut juste savoir qui a appuyé en premier.
Il suffit juste de tester les 2 entrées dans une boucle d'attente et d'indiquer lequel a déclenché la sortie de la boucle.

Bonsoir fdufnews

Oui, bien sûre, mais travailler avec les millis() ajoute du "charme" à l'exercice :wink:

Cordialement
jpbbricole

En faite, le temps à quand même une importance, bien que @castres ne le spécifie pas.
Si on ne prend pas le temps, on ne peut pas vraiment savoir qui appuis le premier, on aura plutôt qui à appuyer le dernier :slight_smile: ou alors le jeu ne marche qu'une fois et il faut éteindre le jeu, des qu'une LED est allumée.
Surtout qu'il ne spécifie pas comment il veut réinitialiser le jeu.

Ok, je teste des que j'ai l'IDE sous la main, sur téléphone c'est trop long :weary: :innocent:

Sans millis()

const int bouton1 = 4;
const int bouton2 = 5;

void setup(void){
    pinMode(bouton1, INPUT_PULLUP);
    pinMode(bouton2, INPUT_PULLUP);
    
    Serial.begin(115200);
}

void loop(void){
    int tempo = random(5000);
    int E_btn1, E_btn2;
    delay(tempo);
    Serial.println("GO");
    do{
        E_btn1 = digitalRead(bouton1);
        E_btn2 = digitalRead(bouton2);
    }while(E_btn1==HIGH && E_btn2==HIGH);
    
    Serial.print(E_btn1==LOW?"Bouton1":"Bouton2");
    Serial.println(" a appuyé le premier");
    delay(5000);
}

Sans millis avec un temps :frowning:

Ce serait sympas de vérifier que personne n'a appuyé avant le "GO", sinon, c'est toujours le UN qui gagne.

[ Blague ] C'est le bouton qui appui sur le joueur? Sinon sur quoi appuie le bouton? [ /Blague]

Pas compris?

Bonsoir fdufnews

C'est bien joli, mais ça "casse le coup" de @pandaroux007 :woozy_face:

Cordialement
jpbbricole

Tu n'utilises pas la fonction millis, mais tu es obligé de faire intervenir un temps, avec ton delay de 5s.

bonsoir,

je pense (mais cela n'engage que moi) qu'il n'y a que trois solutions :

1:
effectuer une surveillance ("polling" en anglais, et malheureusement même en français en langage informatique) des BPs, qui détectera celui qui a été activé le premier en ne prenant pas en compte le suivant (activation d'un flag -ou drapeau, en français-), sachant que la surveillance dans la boucle peut éventuellement ne pas détecter celui qui a effectivement été le "vrai" premier effectif à cause des temps d'exécution de ladite boucle;

2:
utiliser les fonctions millis.. ou micros.. , qui présentent le même risque, puisqu'utilisables uniquement par "polling", qui fournissent un horodatage de l'événement, mais avec le même problème que ci-dessus;

3:
savoir gérer les interruptions, et donc détecter la première touche appuyée "à la volée", avec utilisation (à nouveau) d'un flag ou de l'info d'horodatage, peu importe, du moment que le premier est correctement acquis.

Ce "temps" n'a strictement rien à voir avec la détection de qui a appuyé le premier. Si on utilisait millis() Les deux delay)( seraient toujours là.