Files
NWT-projekt/reaktionstesterclean.ino
2026-02-23 11:10:24 +01:00

119 lines
3.2 KiB
C++

// Copyright Santhosh Venugopal™℗®© & Justus Wolff™℗®©
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// Bonus code
class pixeldraw {
private:
LiquidCrystal_I2C* lcd;
void constructbuf(int x, int y, byte* buf) {
buf[y] = B10000 >> x;
return buf;
}
public:
pixeldraw(LiquidCrystal_I2C* _lcd) {
lcd = _lcd;
}
void setpix(int _x, int _y) {
// calculate cell x and y
int cellx = _x/5;
int celly = _y/8;
int x = _x%5; // calculate modulo
int y = _y%8; // calculate modulo
byte buf[8] = { // load from cellbuf
0,0,0,0,0,0,0,0
};
constructbuf(x,y,buf);
lcd->createChar(cellx+(celly*16), buf);
lcd->clear();
lcd->setCursor(cellx, celly);
lcd->write(byte(cellx+(celly*16)));
}
};
int led = 7; // pin Nummern für jwl. Komponente
int bt = 8;
long highscore = 999999; // speichert highscore in einer Variable
LiquidCrystal_I2C lcd(0x27,16,2); // LCD deklarieren
void setup() {
// put your setup code here, to run once:
pinMode(led, OUTPUT);
pinMode(bt, INPUT_PULLUP); // pinmodes setzen (selbsterklärend)
randomSeed(analogRead(A1)); // Zufallsgenerator initialisieren
Serial.begin(9600);
Serial.println("Santhosh Justus Reaktionstester debug Information");
lcd.init(); // LCD initialisieren
lcd.clear();
lcd.backlight(); // backlight an machen
pixeldraw drawer(&lcd);
for (int y=0;y<(8*8);y++) {
for (int x=0;x<(16*5);x++) {
drawer.setpix(x, y);
delay(1);
}
}
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("klicke sobald");
lcd.setCursor(0, 1);
lcd.print("Die LED leuchtet"); // gebrauchsanleitung für tester
int del = random(300, 3000); // Wartezeit für das Leuchten der LED
Serial.println("--------------------------------------"); // extra Informationen im seriellen Monitor
Serial.print("Wartezeit:"); // debug
Serial.println(del); // debug
delay(del); // warten
while (digitalRead(bt)==0) { // warten bis nicht mehr gedrückt
Serial.println("Versuch zu schummeln."); // debug
delay(random(300, 3000)); // zufällige Zeit warten bis zur nächsten Überprüfung
}
long t1 = millis();
digitalWrite(led, HIGH);
while (digitalRead(bt)==1) {} // warten bis gedrückt
t1 = millis()-t1; // berechnen der reaktionszeit
digitalWrite(led, LOW);
Serial.print("Ergebnis: "); // debug
Serial.println(t1); // debug
lcd.clear(); // anzeigen der reaktionszeit
lcd.setCursor(0, 1);
lcd.print(t1);
lcd.print("ms");
lcd.setCursor(0, 0);
lcd.print("Reaktionszeit:");
delay(100);
while (digitalRead(bt)==0) {} // warten bis nicht gedrückt
while (digitalRead(bt)==1) {} // warten bis gedrückt
delay(100);
if (t1 < highscore) { // highscore logik, zeigt "highscore" falls Reaktionszeit am niedrigsten ist bzw. < highscore
highscore = t1;
Serial.println("Highscore");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("--HIGHSCORE!!!--");
lcd.setCursor(0,1);
lcd.print("Zeit:");
lcd.print(t1);
Serial.println("wartet bis drücken");
while (digitalRead(bt)==1) {} // warten bis gedrückt
}
lcd.clear(); // cleanup
delay(1000);
}