Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Измерение скорости реакции
Скорость реакции достаточно важная штука. Например, при управлении автомобилем она играет далеко не последнюю роль. Есть масса факторов влияющих на скорость реакции. Сильная усталость и некоторые лекарства вызывают снижение скорости реакции. Вот я и решил сделать устройство, которое позволило бы измерить скорость реакции.
Для начала отвечу на главный вопрос. Зачем делать устройство для измерения скорости реакции? Действительно, скорость реакции можно измерить на некоторых сайтах в интернете. Ещё можно написать программу для компьютера, которая будет решать ту же задачу. Не смотря на сказанное, в изготовлении специального устройства есть смысл. Во-первых, устройство на ардуино может работать без интернета. Во-вторых, сложно оценить погрешность решений реализованных на компьютере. Микроконтроллер в этом случае является более предсказуемым и простым вариантом. В-третьих, реализация такого устройства не требует много времени и ресурсов.
Итак. Железо.
Ардуино нано.

Кнопка.


Светодиод.
Соединение модулей.
arduino --- button
VCC --- VCC
GND --- GND
A0 --- OUT
arduino --- led
VCC --- V
D8 --- R
Схема того, что должно получится.

Скетч.
////////////////////////
//
// Arduino
//
////////////////////////
//
// Sketch:
//
const unsigned char LED = 8; // Digital Pin 8
const unsigned char BUTTON = 14; // Analog Pin 0
unsigned long int time1 = 0;
unsigned long int time2 = 0;
void setup()
{
// Led initialization
pinMode(LED, OUTPUT);
// Button initialization
pinMode(BUTTON, INPUT);
// UART initialization
Serial. begin(9600);
// Pseudo-random number generator initialization
digitalWrite(LED, LOW);
while ( digitalRead(BUTTON) == HIGH ) ;
randomSeed(micros());
digitalWrite(LED, HIGH);
}
void loop()
{
digitalWrite(LED, HIGH);
delay(random(2000, 5000));
digitalWrite(LED, LOW);
time1 = micros();
while ( digitalRead(BUTTON) == HIGH ) ;
time2 = micros();
Serial. println(((time2-time1)/1000000.0), 6);
}
//
// End
//
////////////////////////
Работает устройство следующим образом. После подачи питания загорается светодиод. Своего рода индикация готовности устройства к работе. При нажатии на кнопку светодиод гаснет. В этот момент происходит инициализация генератора псевдослучайных чисел. После задержки, длительность которой определяется генератором псевдослучайных чисел, светодиод загорается снова. Теперь нужно как можно быстрее нажать кнопку. Время прошедшее от включения светодиода и до нажатия кнопки является временем реакции. Результат можно увидеть в мониторе порта ардуино.

Генератор псевдослучайных чисел весьма необходимая в данном проекте вещь. Без него удается довольно неплохо натренироваться нажимать кнопочку в нужное время.
В заключении скажу несколько слов о том, что можно изменить, улучшить. Во-первых, можно повысить точность. Для этого нужно отказаться от использования стандартных библиотек ардуино. Только я немного сомневаюсь в целесообразности всего этого. Лично моя реакция не настолько быстра. Правда и сложностей в модификации программы не много. Если будет большой интерес к устройству - сделаю.
Во-вторых, можно сделать устройство более компактным и мобильным. Ардуино нано легко меняется на ардуино про мини. Вместо вывода данных через UART можно выводить результаты на какой нибудь экранчик. Получится небольшое и самодостаточное устройство.
Сравнение скорости реакции
Устройство описываемое в этой статье является модификацией ранее представленного. Почитать про первую версию можно на http://justforduino. blogspot. ru/2016/02/blog-post. html
Устройство не новое. Поэтому начну сразу со схемы.

Всё просто. Ардуино нано. Индикаторный светодиод. Токоограничительный резистор на 220 ом. Две кнопочки.
Кнопок может быть от одной до шести. Подключаются к аналоговым пинам ардуино.
Скетч для плат ардуино с контроллером ATmega328 / ATmega168.
////////////////////////
//
// Arduino
//
////////////////////////
//
// Sketch:
//
// LED --- Digital Pin 8
// BUTTON 1 --- Analog Pin 0
// BUTTON 2 --- Analog Pin 1
// BUTTON 3 --- Analog Pin 2
// BUTTON 4 --- Analog Pin 3
// BUTTON 5 --- Analog Pin 4
// BUTTON 6 --- Analog Pin 5
unsigned char cheater = 0;
unsigned char button = 0;
unsigned long int time1 = 0;
unsigned long int time2 = 0;
void setup()
{
// Led initialization
DDRB = 0b00000001;
PORTB = 0b00000001;
// Buttons initialization
DDRC = 0b00000000;
PORTC = 0b00111111;
// UART initialization
Serial. begin(9600);
// Pseudo-random number generator initialization
cheater = ~PINC;
PORTB = 0b00000000; // LED ON
do { button = (PINC | cheater) & 0b00111111; }
while ( button == 0b00111111 );
randomSeed(micros());
PORTB = 0b00000001; // LED OFF
}
void loop()
{
Serial. println("round");
PORTB = 0b00000001; // LED OFF
delay(random(2000, 5000)); // wait
cheater = ~PINC;
PORTB = 0b00000000; // LED ON
time1 = micros();
do { button = (PINC | cheater) & 0b00111111; }
while ( button == 0b00111111 );
time2 = micros();
if ( (cheater & 0b00000001) != 0 )
Serial. println("1 cheater");
if ( (cheater & 0b00000010) != 0 )
Serial. println("2 cheater");
if ( (cheater & 0b00000100) != 0 )
Serial. println("3 cheater");
if ( (cheater & 0b00001000) != 0 )
Serial. println("4 cheater");
if ( (cheater & 0b00010000) != 0 )
Serial. println("5 cheater");
if ( (cheater & 0b00100000) != 0 )
Serial. println("6 cheater");
if ( (cheater & 0b00000001) == 0 && (button & 0b00000001) == 0 )
Serial. print("1 ");
if ( (cheater & 0b00000010) == 0 && (button & 0b00000010) == 0 )
Serial. print("2 ");
if ( (cheater & 0b00000100) == 0 && (button & 0b00000100) == 0 )
Serial. print("3 ");
if ( (cheater & 0b00001000) == 0 && (button & 0b00001000) == 0 )
Serial. print("4 ");
if ( (cheater & 0b00010000) == 0 && (button & 0b00010000) == 0 )
Serial. print("5 ");
if ( (cheater & 0b00100000) == 0 && (button & 0b00100000) == 0 )
Serial. print("6 ");
Serial. println(((time2-time1)/1000000.0), 6);
}
//
// End
//
////////////////////////
При подаче питания загорается светодиод. Нажатие на любую кнопку гасит светодиод. При этом происходит инициализация генератора псевдослучайных чисел. Теперь, как только светодиод вспыхнет, нужно быстро нажимать кнопки.
Результаты можно посмотреть в мониторе порта ардуино.
В программе частично реализована борьба с читерством. Если нажать и не отпускать кнопку, то в мониторе порта появится соответствующая надпись.
Если все решат читерить, то придется перезапустить ардуино ресетом. При наличии большого желания такое развитие событий тоже можно предусмотреть в коде.
Если нажать и отпустить кнопку пока светодиод не горит, то такое событие программа не заметит. Если бороться с читерством, то оценку таких действий также следует предусмотреть в программе.


