176 lines
5.3 KiB
Plaintext
176 lines
5.3 KiB
Plaintext
#include <Arduino.h>
|
|
#include <NeoPixelBus.h>
|
|
|
|
#define NUM_LEDS 300 // How many leds in your strip?
|
|
#define DATA_PIN 10 //
|
|
#define BUTTON_PIN 43 //
|
|
#define CLOCK_PIN 8 //
|
|
|
|
#define white RgbColor(5, 5, 5)
|
|
#define black RgbColor(0, 0, 0)
|
|
|
|
int roundCounter = 0; //# of rounds to be iterated on
|
|
int correctLED = 88; //an arbitrary number
|
|
int maxRounds = 5;
|
|
int mode; //The mode the user wants to do
|
|
int lightOn = 50; // time light will be on in mode 2
|
|
double loopDelay = 1.0;
|
|
unsigned long correctTime = 0;
|
|
unsigned long reactionTime = 0;
|
|
unsigned long startTime = 0;
|
|
unsigned long loopTime = 0;
|
|
volatile bool buttonFlag = false; // idk
|
|
unsigned volatile long buttonPressTime = millis();
|
|
String color = String("Red"); //Let the user eventually set the color
|
|
|
|
|
|
//variable rxn time exclusive variables
|
|
unsigned int randomLED;
|
|
unsigned long startMillis;
|
|
unsigned long endMillis;
|
|
unsigned long elapsedMillis;
|
|
unsigned int randomMicrosecondDelay;
|
|
|
|
|
|
NeoPixelBus<DotStarBgrFeature, DotStarSpiMethod> strip(NUM_LEDS, CLOCK_PIN, DATA_PIN);
|
|
|
|
void buttonPressed() {
|
|
unsigned long current = millis(); // change perhaps
|
|
if(buttonPressTime + 200 < current) {
|
|
buttonFlag = true;
|
|
buttonPressTime = current;
|
|
//vibrations are detected by the power supply and are registered as button presses!
|
|
} // if
|
|
} // buttonPressed
|
|
|
|
void printPressed(int counter, long delayed, long diff, long correct) {
|
|
if (abs(diff) < 10){
|
|
Serial.println("Perfect timing!");
|
|
Serial.printf("%d, %l, %l \n", counter, delayed, correct);
|
|
} else if (diff > 0) {
|
|
Serial.print("Too early! Time difference: ");
|
|
Serial.printf("%d, %l, %l \n", counter, delayed, abs(diff));
|
|
} else if (diff < 0) {
|
|
Serial.print("Too late! Time difference: ");
|
|
Serial.printf("%d, %l, %l \n", counter, delayed, abs(diff));
|
|
} // if - else
|
|
buttonFlag = false;
|
|
} // printPressed
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
strip.Begin();
|
|
strip.ClearTo(RgbColor(0, 0, 0));
|
|
strip.Show();
|
|
|
|
pinMode(BUTTON_PIN, INPUT_PULLUP); //use internal pullup resistor
|
|
randomSeed(analogRead(0)); //make sure analog pin 0 is't connected!!!
|
|
attachInterrupt(BUTTON_PIN, buttonPressed, FALLING);
|
|
} // setup
|
|
|
|
//assumes mode = 1
|
|
void catLoop() {
|
|
if (roundCounter > maxRounds) {
|
|
// turn LEDs off
|
|
strip.Show();
|
|
Serial.println("Max rounds reached. Stopping program.");
|
|
return; // Exit the loop function and stop further execution
|
|
} // if
|
|
for (int i = 0; i < NUM_LEDS; i++) {
|
|
//turns light on to white, delays, turns it off(black)
|
|
strip.SetPixelColor(i, white);
|
|
strip.Show();
|
|
delayMicroseconds(loopDelay);
|
|
strip.SetPixelColor(i, white);
|
|
if (i == correctLED) {
|
|
correctTime = millis();
|
|
strip.Show();
|
|
} // if
|
|
if (buttonFlag) { // button press output
|
|
unsigned long timeDiff = correctTime - buttonPressTime;
|
|
printPressed(roundCounter, loopDelay, timeDiff, correctTime);
|
|
buttonFlag = false;
|
|
} // if
|
|
roundCounter++;
|
|
} // for
|
|
} // catLoop
|
|
|
|
//assumes mode = 2
|
|
void fixedRxnTime() {
|
|
if (roundCounter > maxRounds - 1) {
|
|
strip.Show();
|
|
Serial.println("Max rounds reached. Stopping program.");
|
|
return; // Exit the loop function and stop further execution
|
|
} // checks for running completion if
|
|
|
|
//turns light on to white, delays, turns it off(black)
|
|
strip.SetPixelColor(correctLED, white);
|
|
strip.Show();
|
|
correctTime = millis();
|
|
delay(lightOn);
|
|
strip.SetPixelColor(correctLED, black);
|
|
strip.Show();
|
|
delayMicroseconds(loopDelay);
|
|
if (!buttonFlag) {
|
|
Serial.println("Button missed");
|
|
} else {
|
|
buttonFlag = false;
|
|
unsigned long timeDiff = correctTime - buttonPressTime;
|
|
printPressed(roundCounter, loopDelay, timeDiff, correctTime);
|
|
} // button press output
|
|
} //fixedRxnTime
|
|
|
|
//assumes mode = 3
|
|
void variableRxnTime() {
|
|
delayMicroseconds(2000000); // waits for 2 seconds
|
|
while (roundCounter != maxRounds) {
|
|
randomMicrosecondDelay = random(3p, 6); // generates a random delay so the user cant predict anything
|
|
delayMicroseconds(randomMicrosecondDelay * 1000000);
|
|
randomLED = random(10); // illuminates a random light between the range 0 - x
|
|
strip.SetPixelColor(randomLED, white);
|
|
strip.Show(); // displays the light
|
|
startMillis = millis(); // begins taking the time
|
|
while (!buttonFlag) { // waits for the button to be pressed
|
|
}
|
|
buttonFlag = false; //
|
|
endMillis = millis(); // takes the final time
|
|
elapsedMillis = endMillis - startMillis;
|
|
strip.SetPixelColor(randomLED, black);
|
|
strip.Show();
|
|
Serial.println(elapsedMillis);
|
|
roundCounter++;
|
|
}
|
|
}
|
|
|
|
void loop() {
|
|
Serial.println("Which mode would you like to run?");
|
|
Serial.println("1 - CAT");
|
|
Serial.println("2 - Fixed Reaction Time");
|
|
Serial.println("3 - Variable Reaction Time");
|
|
Serial.print("Enter Mode Number:");
|
|
do {
|
|
mode = Serial.parseInt();
|
|
while(Serial.available()) Serial.read();
|
|
} while (mode == 0);
|
|
Serial.println(mode);
|
|
|
|
Serial.println("");
|
|
Serial.println("");
|
|
roundCounter = 0; //resets the counter per test after each test concludes
|
|
switch (mode) {
|
|
case 1:
|
|
catLoop();
|
|
break;
|
|
case 2:
|
|
fixedRxnTime();
|
|
break;
|
|
case 3:
|
|
variableRxnTime();
|
|
break;
|
|
case 4:
|
|
//TODO Wtv other tests
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
} // loop |