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?