#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDHT 128
#define SCREEN_HIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDHT, SCREEN_HIGHT, &Wire, -1);
int buttonPin = 7;
int gameState = 0; // 0 - Ожидание, 1 - Игра, 2 - Результат
unsigned long StartTime; // Время начала отсчета реакции
unsigned long reactionTime; // Измереное время реакцим
int BestTime = 9999;
void setup() {
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;);
}
pinMode(buttonPin, INPUT_PULLUP);
display.setTextColor(SSD1306_WHITE);
showStartScreen();
}
void loop() {
switch(gameState){
case 0:
if (digitalRead(buttonPin) == LOW){
startGame();
}
break;
case 1:
if (digitalRead(buttonPin) == LOW){
reactionTime = millis() - StartTime;
gameState = 2;
if (reactionTime < BestTime){
BestTime = reactionTime;
}
}
break;
case 2:
showResult();
if (digitalRead(buttonPin) == LOW){
delay(500);
showStartScreen();
}
break;
}
delay(50);
}
void showStartScreen(){
display.clearDisplay();
display.setTextSize(2);
display.setCursor(10, 10);
display.print("REACTION");
display.setCursor(20, 35);
display.print("GAME");
display.setTextSize(1);
display.setCursor(15, 55);
display.print("Press to start");
display.display();
gameState = 0;
}
void startGame(){
display.clearDisplay();
display.setTextSize(1);
display.setCursor(20, 20);
display.print("wait for WHITE");
display.display();
delay(random(2000, 5000));
display.fillRect(0, 0, 128, 64, SSD1306_WHITE);
display.display();
StartTime = millis();
gameState = 1;
}
void showResult(){
display.clearDisplay();
display.setTextSize(1);
display.setCursor(10, 10);
display.print("Your time: ");
display.setTextSize(2);
display.setCursor(30, 25);
display.print(reactionTime);
display.print(" ms");
display.setTextSize(1);
display.setCursor(10, 50);
display.print("best time: ");
display.print(BestTime);
display.print(" ms");
display.display();
}