测量你的反应时间
组件和用品
| × | 3 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 3 |
应用和在线服务
|
关于这个项目
我正在阅读一些文章,其中作者试图对反应时间对运动员、狙击手、板球运动员和棒球运动员的生活的影响留下深刻印象。最后他总结了它对正常人生活的影响,我很惊讶地看到反应时间对我们的日常生活有很多影响。
例如,驾驶时比正常反应时间慢可能会导致严重后果。
我想,如何衡量我的反应时间?
结果如下。
第 1 步:我们需要的东西
以下是我们需要测量反应时间的清单。
硬件:
图> 图> 图> 图> 图> 图>软件:
- Arduino IDE
上述组件必须放在电子爱好者的地板上:)
如果您对任何组件有疑问,请查看图像。
第 2 步:我们测量反应时间 (RT) 的程序是什么?
我们的人体涉及许多反应时间。我们有音频 RT、视觉 RT、Touch RT 等等。在本教程中,我们将研究测量
视觉反应时间。
测量视觉反应时间的程序:
- 在 Arduino 的串行监视器上弹出一条消息“当你准备好时按下准备按钮”
- 当被测者按下准备按钮时,经过一段随机时间间隔后,两个 LED 之一必须随机点亮。
- 被测者应尽快按下相应的按钮。
- Arduino 会记录 LED 亮起与人按下相应按钮之间的时间差。
- 将测量到的反应时间的消息放在 Arduino 串行监视器上。
让我澄清一下,从我提到的硬件组件列表中,在 3 个按钮中,一个按钮将用作准备按钮,其余两个按钮将
对应两个 LED,即 LED1-->BUTTON1、LED2-->BUTTON2。这意味着如果 LED1 点亮被测者应该按下 BUTTON1 类似的情况
LED2.
第 3 步:把东西放在一起
在上图中,您可以看到电路的构造。让我在这里提几点。
- 将 arduino 板的 5V 和 GND 连接到面包板。
- 通过限流 100 欧姆电阻器连接两个 LED 的阴极。
- 将 LED1 和 LED2 的阳极分别连接到引脚 8 和 12。
- 如图所示的插件按钮。 (如果按钮打开时按钮,两侧引线短路,按下按钮时对角引线
- 短路)
- 如图所示连接 10K Ohm 电阻,用作下拉电阻。
- 将其他导线连接到面包板上的 5V 电源轨。
- 最后将按钮连接到 Arduino 板的 2、4 和 7 号引脚。
请注意: 我上面提到的引脚编号可以根据您的选择而有所不同,我刚刚提到了我的偏好。
第 4 步:让我们编码
我已经附上了 Arduino 代码,你可以下载并开始玩,但我建议你自己写。以下是您在编写代码时需要牢记的几点。
- 注意取消按钮。
- 注意代码应在测量反应时间方面提供良好的分辨率。
- 使用串行监视器进行调试以及人机界面。
如果您对上述任何步骤有疑问,请查看附件视频。
第 5 步:测试时间
一切就绪,打电话给你的朋友,看看谁跑得最快。准备图表取平均值(最好让 arduino 这样做)并宣布获胜者。我附上了我的演示视频,请随意观看。我们的平均视觉反应时间约为 250 毫秒。
PS:如果酒后超过这个,请不要开车。
代码
- 用于测量反应时间的 Arduino 代码。
用于测量反应时间的 Arduino 代码。Arduino
只需运行代码并打开串行监视器。// 设置引脚编号:const int buttonPin1 =4; // pushbutton1 pinconst int buttonPin2 =2; // pushbutton2 pinconst int buttonPin3 =7; // pushbutton3 pinconst int ledPin1 =8; // LED1阳极的数量(+) pinconst int ledPin2 =12; // LED2 阳极(+)引脚的编号// 变量会发生变化:int ledState1 =LOW; // LED1int的当前状态 ledState2 =LOW; // LED2int buttonState1 的当前状态; // 从输入 pin1int buttonState2 读取的当前读数; // 从输入 pin2int buttonState3 读取的当前读数; // 输入 pin3int lastButtonState1 =LOW 的当前读数; // 先前从输入 pin1int lastButtonState2 =LOW 读取的数据; // 先前从输入 pin2int lastButtonState3 =LOW 读取的数据; // 之前从输入 pin3 读取的数据// 以下变量是 long 的,因为时间(以微秒为单位)// 将很快变成一个比 int.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;//以下变量帮助读取按钮pinsint reading1;int reading2;int reading3;/ /以下变量帮助读取与特定 LED 对应的按钮,即 LED1 --> BUTTON1 和 LED2 --> BUTTON2intoddNumber;int evenNumber;void setup(){ pinMode(buttonPin1, INPUT); pinMode(buttonPin2,输入); pinMode(buttonPin3,输入); pinMode(ledPin1,输出); pinMode(ledPin2,输出); //启用串行通信Serial.begin(115200); // 设置初始 LED 状态 digitalWrite(ledPin1, ledState1);数字写入(ledPin2,ledState2); // 如果模拟输入引脚 0 未连接,随机模拟 // 噪声将导致对 randomSeed() 的调用在每次草图运行时生成 // 不同的种子编号。 // randomSeed() 然后将随机函数打乱。 randomSeed(analogRead(0));} void loop() { if(printcount ==0) { Serial.println("准备好后按下按钮 3");打印计数 =1; takeReading =低; // 不读取按钮编号 1 和 2oddNumber =LOW;偶数 =低; } if( button3Pressed ==HIGH) { digitalWrite(ledPin1, LOW);数字写入(ledPin2,低); randNumber =random(minRandomNumber,maxRandomNumber); //在我们的代码中,我们将它们保留为 2000 到 5000 delay(randNumber); if (randNumber &1 ==1) { digitalWrite(ledPin1, HIGH);数字写入(ledPin2,低);时间 1 =微秒(); //Serial.println("奇数");奇数 =高; } else { digitalWrite(ledPin1, LOW);数字写入(ledPin2,高);时间 1 =微秒(); //Serial.println("偶数");偶数 =高; } button3Pressed =低; } reading3 =digitalRead(buttonPin3); //读取 button3 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) { // 无论读数是什么,它在那里的时间都比去抖动延迟要长 // 所以把它作为实际的当前状态: // 如果按钮状态有改变:如果(reading1 !=buttonState1){ buttonState1 =reading1; // 只有在新按钮状态为 HIGH 时才切换 LED if (buttonState1 ==HIGH) { Serial.print("你的反应时间是:"); Serial.print(lastDebounceTime - time1); Serial.println("我们"); Serial.println();打印计数 =0; } } if (reading2 !=buttonState2) { buttonState2 =reading2; // 只有在新按钮状态为 HIGH 时才切换 LED if (buttonState2 ==HIGH) { Serial.print("你的反应时间是:"); Serial.print(lastDebounceTime - time1); Serial.println("我们"); Serial.println();打印计数 =0; } } if (reading3 !=buttonState3) { buttonState3 =reading3; // 只有在新按钮状态为高时才切换 LED if (buttonState3 ==HIGH) { Serial.println("READY TO GO"); button3Pressed =HIGH; takeReading =HIGH; } } } // 保存读数。下一次循环时, // 它将是 lastButtonState:lastButtonState1 =reading1; lastButtonState2 =reading2; lastButtonState3 =reading3;}
示意图
制造工艺