#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define LARGHEZZA_SCHERMO 128
#define ALTEZZA_SCHERMO 64
#define PIN_LED 13
#define PIN_PULSANTE 2
//abbiamo il long per una questione di lunghezza,
//l'unsigned invece è stato usato in caso di overflow per evitare che i valori diventino negativi
// Creazione di due array per le classifiche dei tempi
unsigned long migliori[6]={999999999, 999999999, 999999999, 999999999, 999999999, 999999999};
unsigned long peggiori[6]={0,0,0,0,0,0};
Adafruit_SSD1306 display(LARGHEZZA_SCHERMO, ALTEZZA_SCHERMO, &Wire, -1); // Inizializzazione dello schermo
unsigned long inizioTempo = 0;
unsigned long tempoReazione = 0;
unsigned long fineTempo = 0;
bool testIniziato = false;
unsigned long ritardoCasuale;
void setup() {
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_PULSANTE, INPUT_PULLUP);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Assegnazione SSD1306 fallita"));
for (;;);
}
// Genera un periodo casuale tra 0 e 10 secondi per l'accensione del LED
ritardoCasuale = random(10000);
delay(ritardoCasuale);
digitalWrite(PIN_LED, HIGH);
inizioTempo = millis(); // Inizia a contare il tempo di reazione
testIniziato = true;
}
void loop() {
if (testIniziato && digitalRead(PIN_PULSANTE) == LOW) {
fineTempo = millis(); // Registra il tempo alla pressione del pulsante
tempoReazione = fineTempo - inizioTempo; // Calcola il tempo di reazione
digitalWrite(PIN_LED, LOW);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Tempo di reazione:");
display.setCursor(0, 16);
display.print(tempoReazione / 1000.0, 3); //permette di visalizzare il risultato in secondi e tiene 3 numeri dietro la virgola
display.display();
testIniziato = false;
delay(3000);
// Aggiorna gli array migliori e peggiori solo quando il pulsante è premuto
for(int i=1; i<6; i++){
if(tempoReazione < migliori[i]){
migliori[i-1] = migliori[i];
migliori[i] = tempoReazione;
}
if(tempoReazione > peggiori[i]){
peggiori[i-1] = peggiori[i];
peggiori[i] = tempoReazione;
}
}
// Sostituisci una serie di "9" con "0" nei risultati migliori per una questione di estetica
for(int i=0; i<5; i++){
if(migliori[i] == 999999999){
migliori[i] = 0;
}
}
display.clearDisplay();
display.setCursor(0, 0);//setta la posizione dello schermo da dove cominciare a stampare l'output
display.print("tempi migliori");
for(int i=5; i>0; i--){
display.setCursor(0, 10*(6-i));//funzione per il riordinamento dei tempi
display.print(migliori[i]/1000.0, 3);//stampa del tempo migliore
}
display.display();
delay(3000);//3 secondi fra una schermata e l'altra
display.clearDisplay();
display.setCursor(0, 0);
display.print("tempi peggiori");
for(int i=5; i>0; i--){
display.setCursor(0, 10*(6-i));
display.print(peggiori[i]/1000.0, 3);
}
display.display();
delay(3000);
ritardoCasuale = random(10000);
delay(ritardoCasuale);
digitalWrite(PIN_LED, HIGH);
inizioTempo = millis(); // Reinizia a contare il tempo di reazione
testIniziato = true;
}
}