Menu

Tempo de reação

Qual seu tempo de reação?

Vamos medir o tempo que você leva para reagir a um estímulo.

Digite primeiramente o programa que segue:

long fim, inicio;
char tecla;

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

void loop() {
  delay(random(1000, 2500));
  Serial.println("Pressione ENTER");
  inicio = millis(); 
  tecla = 0; 
  do {
   if (Serial.available() > 0) {
    tecla = Serial.read();
     if (tecla == '\n'      break;
   }
  } while (1); 
  fim = millis(); 
  Serial.print("Seu tempo: "); 
  Serial.println(fim - inicio);
}

 

Ligue o ‘Monitor Serial’. Você recebe uma  mensagem para pressionar a tecla ‘ENTER’ e o Arduino mostra quanto tempo (em milissegundos) você levou para reagir.

Agora uma outra versão programa, mas com um LED enviando a ‘mensagem’ para você reagir:

 

long fim, inicio;
char tecla;

void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
digitalWrite(13, 0);
}
void loop() {
  delay(random(1000, 2500));
  digitalWrite(13,1);
  inicio = millis();
  tecla = 0;
  do {
   if (Serial.available() > 0) {
    tecla = Serial.read();
    if (tecla == '\n' )
      break;
    }
  } while (1);
  digitalWrite(13, 0);
  fim = millis();
  Serial.print("Seu tempo: ");
  Serial.println(fim - inicio);
}

O LED da placa avisa para você reagir, mas continuamos precisando no ‘Monitor Serial’ para interagir. Vamos usar um display LCD para enviar mensagens.

Primeiro, teste seu LCD.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {
  lcd.init(); 
  lcd.backlight(); 
  lcd.clear();
}

void loop() {
  lcd.setCursor(0,0);
  lcd.print("Display LCD I2C"); 
  lcd.setCursor(0, 1);
  lcd.print("**** TESTE ****");
  delay(5000); 
  lcd.clear();
  delay(800);
}

 

Lembre-se de ajustar o contraste.

Se tudo funcionou direitinho, misture as coisas:

 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

long fim, inicio;
char tecla;

void setup() {
  Serial.begin(9600);
  lcd.init(); 
  lcd.backlight(); 
  lcd.clear();
  pinMode(13, OUTPUT);
  digitalWrite(13, 0); 
}

void loop() {
  delay(random(1000, 2500));
  lcd.setCursor(0,0);
  lcd.print("Tempo de reacao"); 
  digitalWrite(13,1);
  inicio = millis(); 
  tecla = 0; 
  do {
    if (Serial.available() > 0) {
     tecla = Serial.read();
     if (tecla == '\n' )
       break;
    }
  } while (1); 
  digitalWrite(13, 0); 
  fim = millis(); 
  lcd.setCursor(0, 1);
  lcd.print(fim - inicio); 
  delay(5000); 
  lcd.clear();
  delay(800);
}

 

Ainda estamos utilizando o ‘Monitor Serial’, para podemos digitar o ‘ENTER’. Agora em uma última etapa, vamos usar um módulo que contém vários interruptores:

 

Primeiro, vamos ler as teclas:

 

#define botaoPraCima 2
#define botaoPraDireita 3
#define botaoPraBaixo 4
#define botaoPraEsquerda 5
#define botaoE 6
#define botaoF 7
#define botaoK 8
#define JoystickX 0
#define JoystickY 1

#define tempo 1000

void setup() {
  Serial.begin(9600);
  pinMode(botaoPraCima, INPUT);
  digitalWrite(botaoPraBaixo, HIGH);
  pinMode(botaoPraDireita, INPUT);
  digitalWrite(botaoPraDireita, HIGH);
  pinMode(botaoPraBaixo, INPUT);
  digitalWrite(botaoPraBaixo, HIGH);
  pinMode(botaoPraEsquerda, INPUT);
  digitalWrite(botaoPraEsquerda, HIGH);
  pinMode(botaoE, INPUT);
  digitalWrite(botaoE, HIGH);
  pinMode(botaoF, INPUT);
  digitalWrite(botaoF, HIGH);
  pinMode(botaoK, INPUT);
  digitalWrite(botaoK, HIGH);
}

void loop() {
  if(digitalRead(botaoPraCima) == LOW) {
    Serial.println("Para cima"); 
    delay(tempo);
}

else if(digitalRead(botaoPraDireita) == LOW) {
  Serial.println("Direita");
  delay(tempo);
}

else if(digitalRead(botaoPraBaixo) == LOW) {
  Serial.println("Para baixo");
  delay(tempo);
}

else if(digitalRead(botaoPraEsquerda) == LOW) {
  Serial.println("Para esquerda");
  delay(tempo);
}

else if(digitalRead(botaoE) == LOW) {
  Serial.println("Botao E");
  delay(tempo);
}

else if(digitalRead(botaoF) == LOW) {
  Serial.println("Botao F");
  Serial.print("Posicao x: ");
  Serial.println(analogRead(JoystickX));
  Serial.print("Posicao y: ");
  Serial.println(analogRead(JoystickY));
  delay(tempo * 3);
}

if(digitalRead(botaoK) == LOW) {
  Serial.println("Botao K");
  delay(tempo);
}

}

 

Agora, escolha uma tecla para pressionar e mude o código para não precisar mais do ‘Monitor Serial’. Teste para ver se o código que segue funciona (se não funcionar, descubra o problema e corrija):

 

#include <Wire.h>
#include <LiquidCrystal_I2C.h> 
#define botaoPraCima 2

LiquidCrystal_I2C lcd(0x27,16,2);

long fim, inicio;
char tecla;

void setup() {
  pinMode(botaoPraCima, INPUT);
  lcd.init(); 
  lcd.backlight(); 
  lcd.clear();
  pinMode(13, OUTPUT);
  digitalWrite(13, 0); 
}

void loop() {
  delay(random(1000, 2500));
  lcd.setCursor(0,0);
  lcd.print("Pressione ParaCima"); 
  digitalWrite(13,1);
  inicio = millis(); 
  tecla = 0; 
  do {
    if(digitalRead(botaoPraCima) == LOW) {
    break;
  }
  } while (1); 
  digitalWrite(13, 0); 
  fim = millis(); 
  lcd.setCursor(0, 1);
  lcd.print(fim - inicio); 
  delay(5000); 
  lcd.clear();
  delay(800);
}

 

Desafio: que tal sortear uma tecla e pedir aos seu usuário que pressione esta tecla rapidamente?

Universidade Federal do Paraná
TI Aplicada – pesquisa e extensão

Av Pref Lothário Meissner, 632
80210-170 | Curitiba |
simao@ufpr.br
(41) 3360-4420
Universidade Federal do Paraná
TI Aplicada – pesquisa e extensão

Av Pref Lothário Meissner, 632
80210-170 | Curitiba |
simao@ufpr.br
(41) 3360-4420

UFPR nas Redes Sociais


UFPR nas Redes Sociais