#include <Wire.h>
#include <MPU6050.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
MPU6050 mpu;
int16_t totalAcc; // Globale Deklaration von totalAcc
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
String mini = ""; // Kleinstmögliche Zahl
String maxi = ""; // Höchstmögliche Zahl
int wuerfelspeed = 100; // Geschwindigkeit in der sich die Zufallszahl ändert beim würfeln
int auslaufspeed = 200; // Geschwindigkeit in der sich die Zufallszahl ändert nach dem würfeln
int auslaufzeit = 1500; // Zeit wie lange der würfel nach dem würfeln noch fliegt
const int motionThreshold = 3150; // Bewegungsschwelle für den MPU6050
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const int interruptPin = 10; // Pin für den Erschütterungssensor
const int tasterPin = 8; // Pin für den Taster
const int Reset = 0; // Pin für den Taster Reset
volatile bool motionDetected = false;
int lastNumber = 0; // Variable zur Speicherung der zuletzt angezeigten Zahl
int luck = 0; // Glückwunsch
bool numberDisplayed = false; // Variable zur Überprüfung, ob die Zufallszahl bereits angezeigt wurde
unsigned long lastUpdateTime = 0; // Zeitstempel für die letzte Aktualisierung der Zufallszahl
unsigned long lastMotionTime = 0; // Zeitstempel für die letzte Bewegungserkennung
// Pins für das LCD-Display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Membrantastenfeld Konfiguration
const byte ROWS = 4; // Vier Reihen
const byte COLS = 3; // Drei Spalten
char keys[ROWS][COLS] = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte rowPins[ROWS] = {A0, A1, A2, A3}; // Verbindet die Tastenreihen mit diesen Pins.
byte colPins[COLS] = {6, 7, 9}; // Verbindet die Tastenspalten mit diesen Pins.
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int currentInput = 1; // Variable, um die aktuelle Eingabe zu verfolgen (1 für mini, 2 für maxi)
void reset() {
asm volatile (" jmp 0");
}
void setup() {
Serial.begin(9600);
pinMode(interruptPin, INPUT_PULLUP);
pinMode(tasterPin, INPUT_PULLUP); // Taster als Eingang konfigurieren
pinMode(interruptPin, INPUT_PULLUP);
pinMode(Reset, INPUT_PULLUP); // Taster als Eingang konfigurieren
mpu.initialize();
// Initialisierung des LCD-Displays
lcd.begin(16, 2);
char key = keypad.getKey(); // Lese den Tastendruck von der Matrix-Tastatur
lcd.print("Bereit zum");
lcd.setCursor(0, 1); // Setze den Cursor auf die zweite Zeile
lcd.print("wuerfeln ?");
delay(1500);
lcd.clear(); // Lösche den Bildschirm
lcd.setCursor(0, 0);
lcd.print("Von: ");
lcd.setCursor(0, 1);
lcd.print("Bis: ");
// Eingabe der Zahlen über die Tastatur
lcd.setCursor(5, 0); // Cursor auf die Position der ersten Zahl setzen
while (mini.length() < 16) {
char key = keypad.getKey(); // Lese den Tastendruck von der Matrix-Tastatur
if (digitalRead(Reset) == LOW) {
reset();
}
if (key != NO_KEY && key != '#') {
mini += key; // Eingabe zur ersten Zahl hinzufügen
lcd.print(key); // Zeige die gedrückte Taste auf dem LCD an
} else if (key == '#') {
break;
}
}
lcd.setCursor(5, 1); // Cursor auf die Position der zweiten Zahl setzen
while (maxi.length() < 16) {
char key = keypad.getKey(); // Lese den Tastendruck von der Matrix-Tastatur
if (digitalRead(Reset) == LOW) {
reset();
}
if (key != NO_KEY && key != '#') {
maxi += key; // Eingabe zur zweiten Zahl hinzufügen
lcd.print(key); // Zeige die gedrückte Taste auf dem LCD an
} else if (key == '#') {
break;
}
}
int minVal = mini.toInt(); // Konvertiere mini in Ganzzahl
int maxVal = maxi.toInt(); // Konvertiere maxi in Ganzzahl
if (minVal >= maxVal) { // Vergleiche die Ganzzahlen
// Füge hier die entsprechende Logik hinzu, wenn mini größer oder gleich maxi ist
delay(500);
lcd.clear(); // Lösche den Bildschirm
lcd.print("Du bist einfach");
lcd.setCursor(0, 1); // Setze den Cursor auf die zweite Zeile
lcd.print("so Dumm! :/");
delay(5000);
reset();
}
delay(500);
lcd.clear(); // Lösche den Bildschirm
lcd.print("Dann los, fang");
lcd.setCursor(0, 1); // Setze den Cursor auf die zweite Zeile
lcd.print("an zu SPIELEN!");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
Serial.print("Gesamtbeschleunigung: ");
Serial.println(totalAcc);
if (digitalRead(Reset) == LOW) {
reset();
}
//Serial.println("Min: " + String(mini)+ " Max: " + String(maxi));
// Prüfen, ob eine Bewegung erkannt wurde oder der Taster gedrückt wurde
if (detectMotion() || digitalRead(tasterPin) == LOW) {
lastMotionTime = millis(); // Aktualisiere den Zeitstempel der letzten Bewegungserkennung
// Wenn eine Bewegung erkannt wird oder der Taster gedrückt wird
if (!numberDisplayed) {
// Wenn die Zufallszahl noch nicht angezeigt wurde, generiere eine neue Zufallszahl
int minVal = mini.toInt(); // Konvertiere mini in Ganzzahl
int maxVal = maxi.toInt(); // Konvertiere maxi in Ganzzahl
int number = random(minVal, maxVal + 1); // Generiere eine neue Zufallszahl von minVal bis maxVal
displayNumber(number);
numberDisplayed = true; // Setze die Flagge, um anzuzeigen, dass die Zufallszahl angezeigt wurde
lastNumber = number; // Speichere die zuletzt angezeigte Zahl
luck = maxVal;
}
} else {
// Wenn weder eine Bewegung erkannt wurde noch der Taster gedrückt wurde
if (numberDisplayed) {
// Wenn die Zufallszahl angezeigt wurde
unsigned long currentTime = millis(); // Aktuelle Zeit
// Wenn seit der letzten Bewegungserkennung oder dem Tastendruck 3 Sekunden vergangen sind
if (currentTime - lastMotionTime >= auslaufzeit || currentTime - lastUpdateTime >= auslaufzeit) {
if (lastNumber == luck) {
lcd.clear(); // Lösche den Bildschirm
lcd.setCursor(0, 0); // Setze den Cursor auf die erste Zeile
lcd.print("Deine Zahl: :D"); // Anzeige der zuletzt angezeigten Zahl
lcd.setCursor(0, 1); // Setze den Cursor auf die zweite Zeile
lcd.print(String(lastNumber) + " Sehr Gut"); // Anzeige der zuletzt angezeigten Zahl
numberDisplayed = false; // Setze die Flagge zurück, um anzuzeigen, dass die Zufallszahl nicht mehr angezeigt wird
}
else {
lcd.clear(); // Lösche den Bildschirm
lcd.setCursor(0, 0); // Setze den Cursor auf die erste Zeile
lcd.print("Deine Zahl:"); // Anzeige der zuletzt angezeigten Zahl
lcd.setCursor(0, 1); // Setze den Cursor auf die zweite Zeile
lcd.print(String(lastNumber)); // Anzeige der zuletzt angezeigten Zahl
numberDisplayed = false; // Setze die Flagge zurück, um anzuzeigen, dass die Zufallszahl nicht mehr angezeigt wird
}
}
}
}
// Aktualisiere die Zufallszahl alle 50 ms, wenn eine Bewegung erkannt wird, der Taster gedrückt wird oder eine Sekunde nach dem Loslassen des Tasters vergangen ist
if (motionDetected || digitalRead(tasterPin) == LOW || (millis() - lastUpdateTime >= auslaufspeed && numberDisplayed)) {
if (millis() - lastUpdateTime >= wuerfelspeed) {
int minVal = mini.toInt(); // Konvertiere mini in Ganzzahl
int maxVal = maxi.toInt(); // Konvertiere maxi in Ganzzahl
int number = random(minVal, maxVal + 1); // Generiere eine neue Zufallszahl von minVal bis maxVal
displayNumber(number);
lastUpdateTime = millis(); // Aktualisiere den Zeitstempel der letzten Aktualisierung
}
}
}
bool detectMotion() {
// Lese die Beschleunigungswerte
int16_t ax, ay, az;
mpu.getAcceleration(&ax, &ay, &az);
// Berechne die Gesamtbeschleunigung
totalAcc = (abs(ax) + abs(ay) + abs(az)) / 10;
// Wenn die Gesamtbeschleunigung über dem Schwellenwert liegt, wird Bewegung erkannt
motionDetected = totalAcc > motionThreshold;
return motionDetected;
}
void displayNumber(int number) {
lcd.clear(); // Lösche den Bildschirm
lcd.setCursor(0, 0); // Setze den Cursor auf die erste Zeile
lcd.print("Jetzt wirds es"); // Anzeige der Bewegungserkennung
lcd.setCursor(0, 1); // Setze den Cursor auf die zweite Zeile
lcd.print("spannend! " + String(number)); // Anzeige der Zufallszahl
}