Reaction game - avec capteur KY036 - ne fonctionne pas

Bonjour,

j'ai crée un jeu de réaction il y a quelque temps composé de:
6 LEDs
1 bouton
1 ecran LCD ( pour afficher le temps de réaction)
1 carte arduino uno

et aujourd'hui je souhaite remplacer le bouton par un capteur KY-036 aussi appelé metal touch sensor ou human body sensor.
J'ai donc essayé de modifié mon programme de différente manière,
mais sa bloque toujours au même endroit : une led aléatoire s'allume et pas de réaction dans je touche le capteur.

pouvez vous m'aider svp ?

// OBJECTIF ALLUMER 6 LED EN DELAY ALEATOIRE;
// AFFICHER LE TEMPS DE REACTION "TOUCHE/LED ALLUME" (SUR 1MIN OU 20 CYCLES).

//PARAMETRAGE LED/BOUTON & DUREE
const byte led1 = 10;
const byte led3 = 7;
const byte led2 = 6;
const byte led4 = 9;
const byte led5 = 0;
const byte led6 = 1;
const unsigned long dureeDuJeu = 60000UL; // 60 secondes

//metal touch sensor
int pinBouton = 8; // define Metal Touch Sensor Interface
int Analog = A0;

//PARAMETRAGE ECRAN LCD 16X2
#include <LiquidCrystal.h>      // inclusion de la bibliothèque
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // Initialisation de la bibliothèque par rapport au cablage

void setup() {
  //LEDs comme OUTPUT
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);

  //Boutontouch comme INPUT
  pinMode(pinBouton, INPUT_PULLUP) ; // define metal touch sensor output interface
  pinMode (Analog, INPUT);

  // EXPLICATION TEXTE DU PROGRAMME ................................................

  lcd.begin(16, 2);              // réglage du nombre de ligne et de colonne
  lcd.print("SPEED TEST"); // Affiche un message
  delay(3000);
  lcd.clear();
}

void loop()
{
  float Analog;
  int Digital;
  int lamp_aleatoire;

  //Enregistrer le temps de depart ( allumage led1)
  unsigned long tempsDebut;
  unsigned long cumulDesTemps = 0;
  unsigned long nombreDeTentatives = 0;
  unsigned long startLed;

  Digital = digitalRead(pinBouton);

  //attendre tant le bouton ( boutontouch pin8) n'est pas fermé
  //while (digitalRead(pinBouton) == HIGH);
  tempsDebut = millis();
  delay(2000);

  while (millis() - tempsDebut <= dureeDuJeu) {
    unsigned long tempsCourant = 0;
    lamp_aleatoire = random(6);
    switch (lamp_aleatoire) {

      case 0 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led1, HIGH);  //Allumer la led1
        while (Digital == 1); // When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led1, LOW);
        cumulDesTemps += tempsCourant;
        while (Digital == 0);
        break;

      case 1 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led2, HIGH);  //Allumer la led1
        while (Digital == 1); // When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led2, LOW);
        cumulDesTemps += tempsCourant;
        while (Digital == 0);
        break;

      case 2 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led3, HIGH);  //Allumer la led1
        while (Digital == 1); // When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led3, LOW);
        cumulDesTemps += tempsCourant;
        while (Digital == 0);
        break;

      case 3 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led4, HIGH);  //Allumer la led1
        while (Digital == 1); // When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led4, LOW);
        cumulDesTemps += tempsCourant;
        while (Digital == 0);
        break;

      case 4 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led5, HIGH);  //Allumer la led1
        while (Digital == 1); // When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led5, LOW);
        cumulDesTemps += tempsCourant;
        while (Digital == 0);
        break;

      case 5 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led6, HIGH);  //Allumer la led1
        while (Digital == 1); // When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led6, LOW);
        cumulDesTemps += tempsCourant;
        while (Digital == 0);
        break;
    }

    //Afficher le temps
    nombreDeTentatives++;
    lcd.clear();
    lcd.print("Temps : ");
    lcd.print(tempsCourant / 1000.0);
    lcd.print(" s  "); // pour effacer s'il y a des caractères en trop
  }

  //Afficher le temps moyen
  lcd.clear();
  lcd.print("Temps Moyen :");
  lcd.setCursor(0, 1);
  if (nombreDeTentatives == 0) {
    lcd.print("Echec");
  }
  if (millis() > 1 * dureeDuJeu) {
    digitalWrite(led1, LOW);
    lcd.clear();
    lcd.print("fin!!");
    tone(13, 1000, 1000);
    delay(3000);
    lcd.clear();
    tone(13, 1000, 1000);
    lcd.print("Temps Moyen :");
    lcd.setCursor(0, 1);
    lcd.print((cumulDesTemps / (nombreDeTentatives)) / 1000.0 );
    delay(5000);
  }

  // ici on remonte au début de la loop et donc on va attendre pour recommencer le jeu
  lcd.clear();
  lcd.print("Recommencer ?");
  lcd.setCursor(0, 1);
  lcd.print("FRAPPER SI OK!");
  delay(3000);

}

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Oops

Bonjour

J'ai pas compris le oops ^^

Jai essayé == HIGH mais sa ne marche pas non plus.

(Je suis novice en prog ^^)

Merci

Bonjour,

Tu ne relies pas ton entrée donc la valeur de Digital ne varie pas.
Il faudrait faire:
while (digitalRead(pinBouton)==HIGH);

Remarque: Cette série de while() n'est pas la meilleure façon de traiter le problème. Il vaudrait mieux faire uniquement une lecture et traiter l'enfoncement du bouton (ou le touché du capteur).

Bonjour kamill,
Ok merci!
je vais essayer ça!

Bonjour,

du coup j'ai essayé
pas de changement,

une LED aléatoire s'allume
je touche mais pas de réaction

pour info jai re testé ce programme (+câblage) avec un bouton poussoir et sa fonctionne bien,
je pense que sa vient de la méthodes de programmation du capteur KY 036

d'autre idée ? :slight_smile:

merci en tout cas,

programme modifié ci dessous:


// OBJECTIF ALLUMER 6 LED EN DELAY ALEATOIRE;
// AFFICHER LE TEMPS DE REACTION "TOUCHE/LED ALLUME" (SUR 1MIN OU 20 CYCLES).

//PARAMETRAGE LED/BOUTON & DUREE
const byte led1 = 10;
const byte led3 = 7;
const byte led2 = 6;
const byte led4 = 9;
const byte led5 = 0;
const byte led6 = 1;
const unsigned long dureeDuJeu = 60000UL; // 60 secondes

//metal touch sensor
int pinBouton = 8; // define Metal Touch Sensor Interface
int Analog = A0;

//PARAMETRAGE ECRAN LCD 16X2
#include <LiquidCrystal.h>      // inclusion de la bibliothèque
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // Initialisation de la bibliothèque par rapport au cablage

void setup() {
  //LEDs comme OUTPUT
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);

  //Boutontouch comme INPUT
  pinMode(pinBouton, INPUT_PULLUP) ; // define metal touch sensor output interface
  pinMode (Analog, INPUT);

  // EXPLICATION TEXTE DU PROGRAMME ................................................

  lcd.begin(16, 2);              // réglage du nombre de ligne et de colonne
  lcd.print("SPEED TEST"); // Affiche un message
  delay(3000);
  lcd.clear();
}

void loop()
{
  float Analog;
  int Digital;
  int lamp_aleatoire;

  //Enregistrer le temps de depart ( allumage led1)
  unsigned long tempsDebut;
  unsigned long cumulDesTemps = 0;
  unsigned long nombreDeTentatives = 0;
  unsigned long startLed;

  //Digital = digitalRead(pinBouton); màj 23/06

  //attendre tant le bouton ( boutontouch pin8) n'est pas fermé
  //while (digitalRead(pinBouton) == HIGH);
  tempsDebut = millis();
  delay(2000);

  while (millis() - tempsDebut <= dureeDuJeu) {
    unsigned long tempsCourant = 0;
    lamp_aleatoire = random(6);
    switch (lamp_aleatoire) {

      case 0 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led1, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); // màj 23/06, When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led1, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW); //màj 23/06
        break;

      case 1 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led2, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); // màj 23/06 When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led2, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW); //màj 23/06
        break;

      case 2 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led3, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); //màj 23/06 When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led3, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW); //màj 23/06
        break;

      case 3 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led4, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); //màj 23/06, When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led4, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW); //màj 23/06
        break;

      case 4 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led5, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); //màj 23/06 When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led5, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW);//màj 23/06
        break;

      case 5 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led6, HIGH); //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); // màj 23/06, When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led6, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW); //màj 23/06
        break;
    }

    //Afficher le temps
    nombreDeTentatives++;
    lcd.clear();
    lcd.print("Temps : ");
    lcd.print(tempsCourant / 1000.0);
    lcd.print(" s  "); // pour effacer s'il y a des caractères en trop
  }

  //Afficher le temps moyen
  lcd.clear();
  lcd.print("Temps Moyen :");
  lcd.setCursor(0, 1);
  if (nombreDeTentatives == 0) {
    lcd.print("Echec");
  }
  if (millis() > 1 * dureeDuJeu) {
    digitalWrite(led1, LOW);
    lcd.clear();
    lcd.print("fin!!");
    tone(13, 1000, 1000);
    delay(3000);
    lcd.clear();
    tone(13, 1000, 1000);
    lcd.print("Temps Moyen :");
    lcd.setCursor(0, 1);
    lcd.print((cumulDesTemps / (nombreDeTentatives)) / 1000.0 );
    delay(5000);
  }

  // ici on remonte au début de la loop et donc on va attendre pour recommencer le jeu
  lcd.clear();
  lcd.print("Recommencer ?");
  lcd.setCursor(0, 1);
  lcd.print("FRAPPER SI OK!");
  delay(3000);

}

Faudrait peut-être commencer par tester le capteur tout seul.
Déjà, tu exploites quelle sortie du capteur?

Bonjour, Les 4 sorties du capteur sont connectées
A0 sur A0 ( sur arduino uno)
G sur ground (sur arduino uno)
"+" sur 5v
D0 sur la sortie 8 de la carte arduino

Jai testé le capteur avec un programme simple avant de l'utiliser pour le reaction game ,

1 Led a allumer quand le capteur est touché et tt fonctionnait bien.

Voir programme ci dessous :

int led = 13;

int val;

int sensorpin = 9;

 

void setup() {

pinMode (led,OUTPUT);

pinMode (sensorpin,INPUT);

 

}

 

void loop() {

val= digitalRead(sensorpin);

if (val==HIGH)

{

  digitalWrite (led, HIGH);

  }

  else

  {

      digitalWrite (led, LOW);

 

    }

}


Merci de votre aide

AKA

digitalWrite (led, digitalRead (sensorPin));

Ce bouton ne se programme pas. En plus tu l'as déjà fait fonctionner.
Éventuellement tu peux jouer sur le potentiomètre pour changer le seuil de déclenchement.
D'ailleurs la LED sur le capteur doit s'allumer normalement lorsque tu touches la partie métallique.
Maintenant, je n'ai pas trouvé de schéma de ce truc mais à vu de nez je dirais que c'est un FET et un comparateur. C'est pas le capteur tactile le plus fiable de la planète. Et il doit être assez sensible à son environnement donc il peut fonctionner correctement à un moment et moins bien 5 minutes plus tard parce que ton téléphone vient de borner.

Avec le programme simple je n'ais pas eu de probleme de fiabilité mais je note quand mm ça dans un coin

Merci

Tu veut dire que je peux utiliser le capteur metal touch en tant qu'interrupteur pour allumer une LED mais pas en interrupteur dans le reaction game ?

Merci en tt cas
Si quelqu'un a d'autres infos ?

Programme actuel voir ci dessous:

// OBJECTIF ALLUMER 6 LED EN DELAY ALEATOIRE;
// AFFICHER LE TEMPS DE REACTION "TOUCHE/LED ALLUME" (SUR 1MIN OU 20 CYCLES).

//PARAMETRAGE LED/BOUTON & DUREE
const byte led1 = 10;
const byte led3 = 7;
const byte led2 = 6;
const byte led4 = 9;
const byte led5 = 0;
const byte led6 = 1;
const unsigned long dureeDuJeu = 60000UL; // 60 secondes

//metal touch sensor
int pinBouton = 8; // define Metal Touch Sensor Interface
int Analog = A0;

//PARAMETRAGE ECRAN LCD 16X2
#include <LiquidCrystal.h>      // inclusion de la bibliothèque
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // Initialisation de la bibliothèque par rapport au cablage

void setup() {
  //LEDs comme OUTPUT
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);

  //Boutontouch comme INPUT
  pinMode(pinBouton, INPUT_PULLUP) ; // define metal touch sensor output interface
  pinMode (Analog, INPUT);

  // EXPLICATION TEXTE DU PROGRAMME ................................................

  lcd.begin(16, 2);              // réglage du nombre de ligne et de colonne
  lcd.print("SPEED TEST"); // Affiche un message
  delay(3000);
  lcd.clear();
}

void loop()
{
  float Analog;
  int Digital;
  int lamp_aleatoire;

  //Enregistrer le temps de depart ( allumage led1)
  unsigned long tempsDebut;
  unsigned long cumulDesTemps = 0;
  unsigned long nombreDeTentatives = 0;
  unsigned long startLed;

  //Digital = digitalRead(pinBouton); màj 23/06

  //attendre tant le bouton ( boutontouch pin8) n'est pas fermé
  //while (digitalRead(pinBouton) == HIGH);
  tempsDebut = millis();
  delay(2000);

  while (millis() - tempsDebut <= dureeDuJeu) {
    unsigned long tempsCourant = 0;
    lamp_aleatoire = random(6);
    switch (lamp_aleatoire) {

      case 0 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led1, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); // màj 23/06, When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led1, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW); //màj 23/06
        break;

      case 1 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led2, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); // màj 23/06 When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led2, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW); //màj 23/06
        break;

      case 2 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led3, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); //màj 23/06 When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led3, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW); //màj 23/06
        break;

      case 3 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led4, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); //màj 23/06, When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led4, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW); //màj 23/06
        break;

      case 4 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led5, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); //màj 23/06 When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led5, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW);//màj 23/06
        break;

      case 5 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led6, HIGH); //Allumer la led1
        while (digitalRead(pinBouton) == HIGH); // màj 23/06, When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led6, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == LOW); //màj 23/06
        break;
    }

    //Afficher le temps
    nombreDeTentatives++;
    lcd.clear();
    lcd.print("Temps : ");
    lcd.print(tempsCourant / 1000.0);
    lcd.print(" s  "); // pour effacer s'il y a des caractères en trop
  }

  //Afficher le temps moyen
  lcd.clear();
  lcd.print("Temps Moyen :");
  lcd.setCursor(0, 1);
  if (nombreDeTentatives == 0) {
    lcd.print("Echec");
  }
  if (millis() > 1 * dureeDuJeu) {
    digitalWrite(led1, LOW);
    lcd.clear();
    lcd.print("fin!!");
    tone(13, 1000, 1000);
    delay(3000);
    lcd.clear();
    tone(13, 1000, 1000);
    lcd.print("Temps Moyen :");
    lcd.setCursor(0, 1);
    lcd.print((cumulDesTemps / (nombreDeTentatives)) / 1000.0 );
    delay(5000);
  }

  // ici on remonte au début de la loop et donc on va attendre pour recommencer le jeu
  lcd.clear();
  lcd.print("Recommencer ?");
  lcd.setCursor(0, 1);
  lcd.print("FRAPPER SI OK!");
  delay(3000);

}

Je n'ai jamais dit ça. Je dis simplement qu'il n'y a rien qui se programme dans cet interrupteur. C'est tout.
Tu le raccordes à ton Arduino et tu le gères comme un inter classique.

Tu es certain des valeurs que tu testes dans tes 2 while.
De ce que j'ai compris de la doc du capteur la sortie digital est LOW tant que le capteur n'est pas touché et il passe a HIGH lorsqu'on le touche.
Dans ton code tu fais le contraire.

Il faudrait aussi gérer un hors temps dans ces tests car si on ne touche pas le capteur, le programme reste bloqué dans la boucle d'attente.

OK je vais essayé d'inverser ce soir mais je crois que je l'ai deja fait.
Je te tiens courant.

Merci

Bonjour fdufnews

C'est un darlington KSP13.

Cordialement
jpbbricole

Bonjour manuellinki

A voire ton programme tu travailles en PULL_UP:

pinMode(pinBouton, INPUT_PULLUP) ; // define metal touch sensor output interface

C'est à dire que ton bouton était connecté au GND et à pinBouton, donc actif LOW, juste?
Or il semble que ton module KY-036 fasse l'inverse, il est actif à HIGH, d'après l'exemple.

void loop() {
	val= digitalRead(sensorpin);

	if (val==HIGH)
	{
		digitalWrite (led, HIGH);
	}
	else
	{
		digitalWrite (led, LOW);
	}
}

donc tu devrais inverser les conditions dans tes test et initialiser l'entrée ainsi:

pinMode(pinBouton, INPUT) ; // define metal touch sensor output interface

le KY-036 a une PULL_UP de 10K.

Cordialement
jpbbricole

Bonjour à tous,

j'ai inversé les conditions mais ça ne fonctionne toujours pas,
la LED reste allumé sans réaction et l'ecran n'affiche rien.

j'ai aussi re re testé le capteur (sans touché au câblage) avec le programme simple et ça fonctionne. (je touche et la LED s'allume)

Je comprend pas ce qui se passe , ça semble simple pourtant mais ...^^

j'ai quand mm une remarque: apparement c'est tout le temps la même led qui s'allume en 1er o_o "la LED2 de la sortie 6"


// OBJECTIF ALLUMER 6 LED EN DELAY ALEATOIRE;
// AFFICHER LE TEMPS DE REACTION "TOUCHE/LED ALLUME" (SUR 1MIN OU 20 CYCLES).

//PARAMETRAGE LED/BOUTON & DUREE
const byte led1 = 10;
const byte led3 = 7;
const byte led2 = 6;
const byte led4 = 9;
const byte led5 = 13;
const byte led6 = 1;
const unsigned long dureeDuJeu = 60000UL; // 60 secondes

//metal touch sensor
int pinBouton = 8; // define Metal Touch Sensor Interface
//int Analog = A0;

//PARAMETRAGE ECRAN LCD 16X2
#include <LiquidCrystal.h>      // inclusion de la bibliothèque
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // Initialisation de la bibliothèque par rapport au cablage

void setup() {
  //LEDs comme OUTPUT
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);

  //Boutontouch comme INPUT
  pinMode(pinBouton, INPUT) ; // define metal touch sensor output interface
  //pinMode (Analog, INPUT);

  // EXPLICATION TEXTE DU PROGRAMME ................................................

  lcd.begin(16, 2);              // réglage du nombre de ligne et de colonne
  lcd.print("SPEED TEST"); // Affiche un message
  delay(3000);
  lcd.clear();
}

void loop()
{
 // float Analog;
  //int Digital;
  int lamp_aleatoire;

  //Enregistrer le temps de depart ( allumage led1)
  unsigned long tempsDebut;
  unsigned long cumulDesTemps = 0;
  unsigned long nombreDeTentatives = 0;
  unsigned long startLed;

  //Digital = digitalRead(pinBouton); màj 23/06

  //attendre tant le bouton ( boutontouch pin8) n'est pas fermé
  //while (digitalRead(pinBouton) == HIGH);
  tempsDebut = millis();
  delay(2000);

  while (millis() - tempsDebut <= dureeDuJeu) {
    unsigned long tempsCourant = 0;
    lamp_aleatoire = random(6);
    switch (lamp_aleatoire) {

      case 0 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led1, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == LOW); // màj 23/06, When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led1, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == HIGH); //màj 23/06
        break;

      case 1 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led2, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == LOW); // màj 23/06 When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led2, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == HIGH); //màj 23/06
        break;

      case 2 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led3, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == LOW); //màj 23/06 When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led3, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == HIGH); //màj 23/06
        break;

      case 3 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led4, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == LOW); //màj 23/06, When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led4, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == HIGH); //màj 23/06
        break;

      case 4 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led5, HIGH);  //Allumer la led1
        while (digitalRead(pinBouton) == LOW); //màj 23/06 When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led5, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == HIGH);//màj 23/06
        break;

      case 5 :
        delay(random(120, 1000));    //Attendre un temps aléatoire entre 100ms et 1.5 secondes
        startLed = millis();    //Enregistrer le temps de depart ( allumage led1)
        digitalWrite(led6, HIGH); //Allumer la led1
        while (digitalRead(pinBouton) == LOW); // màj 23/06, When the metal touch sensor detects a signal
        tempsCourant = millis() - startLed;
        digitalWrite(led6, LOW);
        cumulDesTemps += tempsCourant;
        while (digitalRead(pinBouton) == HIGH); //màj 23/06
        break;
    }

    //Afficher le temps
    nombreDeTentatives++;
    lcd.clear();
    lcd.print("Temps : ");
    lcd.print(tempsCourant / 1000.0);
    lcd.print(" s  "); // pour effacer s'il y a des caractères en trop
  }

  //Afficher le temps moyen
  lcd.clear();
  lcd.print("Temps Moyen :");
  lcd.setCursor(0, 1);
  if (nombreDeTentatives == 0) {
    lcd.print("Echec");
  }
  if (millis() > 1 * dureeDuJeu) {
    digitalWrite(led1, LOW);
    lcd.clear();
    lcd.print("fin!!");
    tone(13, 1000, 1000);
    delay(3000);
    lcd.clear();
    tone(13, 1000, 1000);
    lcd.print("Temps Moyen :");
    lcd.setCursor(0, 1);
    lcd.print((cumulDesTemps / (nombreDeTentatives)) / 1000.0 );
    delay(5000);
  }

  // ici on remonte au début de la loop et donc on va attendre pour recommencer le jeu
  lcd.clear();
  lcd.print("Recommencer ?");
  lcd.setCursor(0, 1);
  lcd.print("FRAPPER SI OK!");
  delay(3000);

}

Sans changer le programme, il y a une LED sur le capteur qui recopie l'état de la sortie digitale. Donc ce n'est pas très compliqué de connaitre l'état de cette sortie.
Ensuite il suffit de placer quelques Serial.print() dans ton code pour voir un peu où il passe et visualiser l'état des variables

Oui, ce n'est pas très surprenant car tu ne changes pas la graine du générateur pseudo aléatoire.
https://www.arduino.cc/reference/en/language/functions/random-numbers/randomseed/

re,

OK pour la LED sur le capteur, en effet elle s'allume correctement.

je vois ce que tu veux dire mais le faire c'est plus complexe ^^
il faut que je visualise si l'entrée 8 capte quelque chose ?
tu as un exemple d'écriture ?

Je vais regarder le liens

Il faut donc un générateur aléatoire pour pouvoir changer la graine! C'est le serpent qui se mord la queue.

J'ai testé le analogRead(A0) qui est souvent préconisé, je lis tout le temps la même valeur au bruit près. Avec le bruit de la lecture, j'ai 5 valeurs différentes, guère plus. Dans le cas présent l'instant (en µs par exemple, obtenu avec micros() ) du premier appui sur un bouton permet d'avoir un départ quasi aléatoire. Sinon, on peut aussi utiliser le nombre de mise sous tension que l'on range en eeprom.