Точный тест времени реакции на Arduino UNO
Компоненты и материалы
| Тактовые кнопки | × | 3 |
| Светодиод 5 мм красный | × | 2 |
| Провода male-male | × | 1 |
| Макетная плата | × | 1 |
| Arduino UNO | × | 1 |
| USB A-B кабель | × | 1 |
| Резистор 100 Ом | × | 2 |
| Резистор 10 кОм | × | 3 |
Приложения и сервисы
- Arduino IDE
О проекте
Читал статью о влиянии времени реакции на жизнь спортсменов, снайперов, крикетистов, бейсболистов. Автор заключил: реакция влияет и на обычных людей. Например, задержка реакции за рулём — трагичные последствия.
Подумал: как измерить свою реакцию? Результат ниже.
Шаг 1: Необходимые детали
Железо:







Софт: Arduino IDE.
Все компоненты, скорее всего, лежат у любого радиолюбителя. Если что-то непонятно — смотрите фото.
Шаг 2: Процедура измерения визуального времени реакции
Существует много видов реакции: аудиальная, визуальная, тактильная. Здесь — визуальная.
Алгоритм:
- Вывод в Serial Monitor: «Нажмите кнопку готовности, когда готовы».
- После нажатия кнопки готовности — случайная пауза, затем случайно загорается один из двух светодиодов.
- Испытуемый должен как можно быстрее нажать соответствующую кнопку (LED1 → Кнопка1, LED2 → Кнопка2).
- Arduino измеряет разницу между зажиганием LED и нажатием кнопки.
- Результат выводится в Serial Monitor.
Из 3 кнопок: одна — «Готов», две другие — под светодиоды.

Шаг 3: Сборка схемы
На фото выше — схема. Основные моменты:
- 5V и GND от Arduino к макетке.
- Катоды обоих LED через резисторы 100 Ом (ограничение тока).
- Аноды LED1 и LED2 → пины 8 и 12.
- Кнопки как на фото (при нажами замыкаются диагональные выводы).
- Резисторы 10 кОм как pull-down (на фото).
- Вторые выводы кнопок → шина 5V.
- Кнопки к пинам 2, 4, 7 Arduino.
Примечание: номера пинов могут быть любыми — я указал свои.

Шаг 4: Программирование
Код прилагается, но лучше написать самому. Ключевые моменты:
- Антидребезг кнопок (debouncing).
- Высокое разрешение измерения времени (микросекунды).
- Serial Monitor для отладки и интерфейса.
При сомнениях — смотрите видео.
Шаг 5: Тестирование
Всё готово. Зовите друзей — устраиваем соревнование. Записывайте результаты, считайте среднее (лучше пусть считает Arduino) и объявляйте победителя. Мой демо-ролик прилагается. Среднее визуальное время реакции ~250 мс.
P.S. Если после алкоголя больше — не садитесь за руль!
Код
Arduino код для измерения времени реакции Arduino
Запустите код и откройте Serial Monitor.
// set pin numbers:
const int buttonPin1 = 4;
const int buttonPin2 = 2;
const int buttonPin3 = 7;
const int ledPin1 = 8;
const int ledPin2 = 12;
// Variables will change:
int ledState1 = LOW;
int ledState2 = LOW;
int buttonState1, buttonState2, buttonState3;
int lastButtonState1 = LOW, lastButtonState2 = LOW, lastButtonState3 = LOW;
unsigned long lastDebounceTime = 0;
long debounceDelay = 20000; // мкс
unsigned long randNumber;
unsigned long minRandomNumber = 2000;
unsigned long maxRandomNumber = 5000;
unsigned long time1, time2;
int button3Pressed = LOW;
int printcount = 0;
int takeReading = LOW;
int reading1, reading2, reading3;
int oddNumber, evenNumber;
void setup() {
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(115200);
digitalWrite(ledPin1, ledState1);
digitalWrite(ledPin2, ledState2);
randomSeed(analogRead(0));
}
void loop() {
if (printcount == 0) {
Serial.println("press button 3 when you are ready");
printcount = 1;
takeReading = LOW;
oddNumber = LOW;
evenNumber = LOW;
}
if (button3Pressed == HIGH) {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
randNumber = random(minRandomNumber, maxRandomNumber);
delay(randNumber);
if (randNumber & 1 == 1) {
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
time1 = micros();
oddNumber = HIGH;
} else {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
time1 = micros();
evenNumber = HIGH;
}
button3Pressed = LOW;
}
reading3 = digitalRead(buttonPin3);
if (takeReading == HIGH) {
if (oddNumber == HIGH) reading1 = digitalRead(buttonPin1);
if (evenNumber == HIGH) reading2 = digitalRead(buttonPin2);
}
if (reading1 != lastButtonState1 || reading2 != lastButtonState2 || reading3 != lastButtonState3) {
lastDebounceTime = micros();
}
if ((micros() - lastDebounceTime) > debounceDelay) {
if (reading1 != buttonState1) {
buttonState1 = reading1;
if (buttonState1 == HIGH) {
Serial.print("Your reaction time is: ");
Serial.print(lastDebounceTime - time1);
Serial.println("us");
Serial.println();
printcount = 0;
}
}
if (reading2 != buttonState2) {
buttonState2 = reading2;
if (buttonState2 == HIGH) {
Serial.print("Your reaction time is: ");
Serial.print(lastDebounceTime - time1);
Serial.println("us");
Serial.println();
printcount = 0;
}
}
if (reading3 != buttonState3) {
buttonState3 = reading3;
if (buttonState3 == HIGH) {
Serial.println("READY TO GO");
button3Pressed = HIGH;
takeReading = HIGH;
}
}
}
lastButtonState1 = reading1;
lastButtonState2 = reading2;
lastButtonState3 = reading3;
}
Схемы
Производственный процесс
- Когда заменять вилы погрузчика: практическое руководство
- Умный датчик полива «Thirst Alert» на Arduino — DIY сигнализация засухи для растений
- Итальянские словесные часы на Arduino Nano, NeoPixel, LCD и RTC
- Экономия пинов Arduino: подключение 4×3 клавиатуры по трём аналоговым входам
- Надежный счетчик кВт·ч на Sigfox с Arduino MKR Fox 1200
- Bluetooth-монитор температуры на Arduino Nano с NTC-термистором
- Бесконтактный жестовый замок: APDS-9960 + Arduino для безопасного доступа
- Набор-компаньон для Arduino Nano — необходимые компоненты и инструменты для DIY-электроники
- Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
- Пора ли обновить компрессор? Распознайте признаки вовремя