IR Remote reaction timer

Hello! I want to create a Reaction Timer game using an IR Remote. I have an LCD that shows "Press OK to play", you press OK and then the game starts. It shows "Press X", where X is a random number from 0 to 9. You have to press the number and then it must show how much it took you to press the button.

The problem is: I can't seem to make it work, my code so far is:

#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#include <LiquidCrystal.h>

// set up your codes for the buttons
#define Button_0 0xFF9867
#define Button_1 0xFFA25D
#define Button_2 0xFF629D
#define Button_3 0xFFE21D
#define Button_4 0xFF22DD
#define Button_5 0xFF02FD
#define Button_6 0xFFC23D
#define Button_7 0xFFE01F
#define Button_8 0xFFA857
#define Button_9 0xFF906F
#define Button_ok 0xFF38C7
#define Button_x 0xFF6897

int IR_PIN = 11;
IRrecv irrecv(IR_PIN);
decode_results results;
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
unsigned long startTime = 0;
unsigned long endTime = 0;

void setup() {

  Serial.begin(9600);
  irrecv.enableIRIn(); // start the receiver
  lcd.begin(16, 2); // start the LCD
}

void loop() {

  lcd.setCursor(0, 0);
  lcd.print("Press OK");
  lcd.setCursor(0, 1);
  lcd.print("to play");

  // check if there's an IR signal
  if (irrecv.decode(&results)) {
    switch (results.value) {
      case Button_ok: {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Ready");
          delay(1000);
          lcd.print(".");
          delay(1000);
          lcd.print(".");
          delay(1000);
          lcd.print(".");
          delay(2000);

          lcd.clear();

          startTime = millis();
          int randomNumber = random(0, 9);
          lcd.print("Press ");
          lcd.print(randomNumber);
          delay(1000);


          if (results.value == randomNumber) {
            endTime = millis();
            break;
          }



          Serial.println(startTime);
          Serial.println(endTime);
          Serial.println(endTime - startTime);
          delay(10000);

        }
        //default : //Serial.println(results.value, HEX); break;
    }
    irrecv.resume(); // obtain next value
  }

}

but the endTime is always 0. How can I measure the reaction time correctly in this case?

Thank you!

1 Like
      if (results.value == randomNumber) 

That doesn't seem likely, does it?
(Which is why endTime is zero)

Try printing results.value

(Kudos for code tags)

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.