// Define where the sensor, the button and the led are connected
#define sensorPin A0
#define startPin 2
#define ledPin 3
// Change these to your liking:
// Countdown is the time before calibration and measurement start (in seconds)
// "calib" is the time in seconds taken for calibration
// "count" is the number of measurements taken
// "maxRuns" is the maximum number of runs that are compared
int countdown = 3;
const int calib = 2;
const int count = 15;
const int maxRuns = 10;
// Do not change these
float valuesR[count] = {};
float valuesA[count] = {};
float h = 0;
float a = 0;
float winner[maxRuns][5] = {};
int runs = 0;
void setup() {
// Start serial console for debugging purpose
Serial.begin(115200);
delay(200);
while(!Serial) {}
// Initialize the state of the microcontroller pins
pinMode(sensorPin, INPUT);
pinMode(startPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
Serial.println("Press the button to start!");
Serial.println();
// Stuck in this loop until button gets pressed
while(digitalRead(startPin) == HIGH){
}
// Countdown to calibration
Serial.println("Prepare for calibration in:");
delay(1000);
for(int i=0; i < countdown; i++){
Serial.println(countdown - i);
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
// Calibration for "calib" seconds
Serial.println("Calibration start!");
int raw = 0;
int calibTime = calib * 10;
digitalWrite(ledPin, HIGH);
for (int i=0; i < calibTime; i++){
raw += analogRead(sensorPin);
Serial.print(". ");
delay(100);
}
digitalWrite(ledPin, LOW);
Serial.println();
Serial.println("Done!");
delay(1000);
// average of the calibration
int avg = raw / calibTime;
Serial.println();
Serial.print("Average of calibration: ");
Serial.println(avg);
delay(1000);
// Countdown to measurement
Serial.println();
Serial.println("Get ready to flex in:");
for(int i=0; i < countdown; i++){
Serial.println(countdown - i);
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
Serial.println();
// Measurement:
// "count" number of measurements stored as absolute in "valuesA[]"
// "count" number of measurements stored as relative in "valuesR[]"
digitalWrite(ledPin, HIGH);
for (int i=0; i < count; i++){
h = analogRead(sensorPin);
a = h/avg;
valuesA[i] = h;
valuesR[i] = a;
Serial.println(h);
Serial.print(a*100);
Serial.println("%");
Serial.println();
delay(100);
}
digitalWrite(ledPin, LOW);
// Find min and max of "valuesR[]"
float maxValR = valuesR[0];
float minValR = valuesR[0];
for (int i = 0; i < (sizeof(valuesR) / sizeof(valuesR [0])); i++) {
maxValR = max(valuesR[i],maxValR);
minValR = min(valuesR[i],minValR);
}
// Find min and max of "valuesA[]"
float maxValA = valuesA[0];
float minValA = valuesA[0];
for (int i = 0; i < (sizeof(valuesA) / sizeof(valuesA [0])); i++) {
maxValA = max(valuesA[i],maxValA);
minValA = min(valuesA[i],minValA);
}
// save min and max values of current run
winner[runs][0] = runs + 1;
winner[runs][1] = minValA;
winner[runs][2] = minValR;
winner[runs][3] = maxValA;
winner[runs][4] = maxValR;
// Find min and max of all runs
float maxValRuns = winner[0][4];
float minValRuns = winner[0][2];
int maxIndRuns = 0;
int minIndRuns = 0;
for (int i = 0; i < runs+1; i++) {
if(winner[i][4] >= maxValRuns){
maxValRuns = winner[i][4];
maxIndRuns = i;
}
if(winner[i][2] <= minValRuns){
minValRuns = winner[i][2];
minIndRuns = i;
}
}
// Print the results to the console
Serial.println();
Serial.println("Evaluation:");
Serial.print("Minimum Absolute: ");
Serial.println(minValA);
Serial.print("Minimum Relative: ");
Serial.print(minValR*100);
Serial.println("%");
Serial.print("Maximum Absolute: ");
Serial.println(maxValA);
Serial.print("Maximum Relative: ");
Serial.print(maxValR*100);
Serial.println("%");
Serial.println();
Serial.print("Current Champion is player number: ");
Serial.println(maxIndRuns+1);
Serial.print("With a relative maximum of: ");
Serial.print(maxValRuns*100);
Serial.println("%");
Serial.println();
//Serial.print("Current Loser is player number: ");
//Serial.println(minIndRuns+1);
//Serial.print("With a relative minimum of: ");
//Serial.println(minValRuns*100);
//Serial.println();
runs = runs + 1;
}