Nota

Ciao, benvenuto nella Community SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti?

  • Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.

  • Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.

  • Anteprime esclusive: Ottieni accesso anticipato ai nuovi annunci di prodotti e alle anteprime.

  • Sconti speciali: Approfitta di sconti esclusivi sui nostri nuovi prodotti.

  • Promozioni e omaggi festivi: Partecipa a promozioni e omaggi durante le festività.

👉 Sei pronto a esplorare e creare con noi? Clicca su [Qui] e unisciti oggi!

6.5 Gioco di Reazione

Il nostro corpo ha diversi tempi di reazione, come quello uditivo, visivo, tattile, ecc.

I tempi di reazione influenzano molte attività della nostra vita quotidiana; ad esempio, tempi di reazione più lenti alla guida possono avere conseguenze gravi.

In questo progetto, utilizziamo 3 pulsanti e 2 LED per misurare il tempo di reazione visiva.

Il monitor seriale di Arduino visualizza il messaggio «waiting…» Dopo aver premuto il pulsante Ready, uno dei due LED si accenderà casualmente dopo un intervallo di tempo casuale. È importante che il partecipante preme il pulsante corrispondente il più velocemente possibile. Arduino registra il tempo che intercorre tra l’accensione del LED e la pressione del pulsante e stampa il tempo di reazione misurato sul monitor seriale di Arduino.

Componenti Necessari

In questo progetto, abbiamo bisogno dei seguenti componenti.

È sicuramente conveniente acquistare un intero kit, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

3 in 1 Starter Kit

380+

3 in 1 Starter Kit

Puoi anche acquistarli separatamente dai link qui sotto.

INTRODUZIONE AI COMPONENTI

LINK PER L’ACQUISTO

Scheda SunFounder R3

ACQUISTA

Breadboard

ACQUISTA

Cavi di Collegamento

ACQUISTA

Resistore

ACQUISTA

LED

ACQUISTA

Pulsante

ACQUISTA

Schema Elettrico

../_images/wiring_reaction_game.png

Collegamenti

../_images/reaction_game.png

Codice

Nota

  • Puoi aprire il file 6.5_reaction_time.ino nel percorso 3in1-kit\basic_project\6.5_reversingAid direttamente.

  • Oppure copia questo codice nell”Arduino IDE.

  • Assicurati di aver aggiunto la libreria LiquidCrystal_I2C, fai riferimento al tutorial dettagliato: 5.11 Installare Librerie Esterne.

Come funziona?

  1. Inizializza i pulsanti e i LED, qui vengono utilizzati 2 interrupt per leggere lo stato dei pulsanti.

    void setup()
    {
    
        ...
    
        attachInterrupt(digitalPinToInterrupt(buttonPin1), pressed1, FALLING);
        attachInterrupt(digitalPinToInterrupt(buttonPin2), pressed2, FALLING);
        ...
    }
    
  2. Se il pulsante rstBtn viene premuto, il gioco ricomincia. Dopo un intervallo di tempo casuale compreso tra 2 e 5ms, uno dei LED si accende.

    void loop()
    {
        if (flag == -1 && digitalRead(rstBtn) == LOW) {
            digitalWrite(ledPin1, LOW);
            digitalWrite(ledPin2, LOW);
            Serial.println("Waiting...");
            int randomTime = random(2000, 5000);
            delay(randomTime);
    
            timer = millis();
            flag = randomTime % 2;
            Serial.println("Light!");
    
            if (flag == 0) {
                digitalWrite(ledPin1, HIGH);
            } else if (flag == 1) {
                digitalWrite(ledPin2, HIGH);
            }
        }
        delay(200);
    }
    
    • Quando il flag è -1 e il pulsante rstBtn viene premuto, utilizza la funzione random() per generare un tempo casuale tra 2 e 5 secondi.

    • Questo tempo viene poi utilizzato per controllare l’accensione dei LED.

    • L’accensione dei 2 LED viene generata casualmente tramite randomTime % 2 con 0 e 1. Se il flag è 0, si accende il LED1; se 1, si accende il LED2.

  3. Funzione pressed1()

    void pressed1() {
        if (flag == -1) {
            return;
        }
        if (flag == 0) {
            int currentTime = millis();
            Serial.print("Correct! You reaction time is : ");
            Serial.print(currentTime - timer);
            Serial.println(" ms");
        } else if (flag == 1) {
            Serial.println("Wrong Click!");
        }
        flag = -1;
    }
    

    Questa è la funzione che viene attivata quando viene premuto il pulsante 1. Se il flag è 0, viene stampato il tempo di reazione; altrimenti viene segnalato l’errore di pressione.

  4. Funzione pressed2()

    void pressed2() {
        if (flag == -1) {
            return;
        }
        if (flag == 1) {
            int currentTime =millis();
            Serial.print("Correct! You reaction time is : ");
            Serial.print(currentTime - timer);
            Serial.println(" ms");
        } else if (flag == 0) {
            Serial.println("Wrong Click!");
        }
        flag = -1;
    }
    

    Questa è la funzione che viene attivata quando viene premuto il pulsante 2. Se il flag è 1, viene stampato il tempo di reazione; altrimenti viene segnalato l’errore di pressione.