Menu
CoddyTech

Würfel-Simulator

Teil des Abschnitts Displays und Sensoren der Arduino-Journey von Coddy. Lektion 5 von 24.

random(1, 7) wählt eine ganze Zahl von 1 bis 6. Die erste Zahl ist die niedrigste, die du erhalten kannst; die zweite ist um eins höher als die höchste.

Das Board hat keine echte Zufälligkeit. random() berechnet jede Zahl aus der vorherigen, beginnend mit einer Zahl namens Seed. Mit demselben Seed liefert es bei jedem Durchlauf dieselben Zahlen: Deine Würfel würden jedes Mal 2, 2, 6, 3 würfeln, wenn du sie einschaltest.

randomSeed() legt den Seed fest. Gib der Funktion etwas, das sich von Durchlauf zu Durchlauf ändert, zum Beispiel den Zeitpunkt des ersten Tastendrucks. micros() zählt in Millionstelsekunden, und niemand drückt zweimal in derselben Mikrosekunde:

if (!seeded) {
  randomSeed(micros());
  seeded = true;
}
int roll = random(1, 7);

Den Seed in setup() festzulegen, hilft nicht: setup() läuft nach jedem Einschalten in derselben Mikrosekunde.

challenge icon

Aufgabe

Mittel

Der Taster ist an Pin 10 angeschlossen, und der Starter erkennt bereits den Moment, in dem er gedrückt wird. Erstelle einen Würfel:

  • Wähle bei jedem Drücken random(1, 7) und zeige das Ergebnis mit showDigit() an
  • Rufe nur beim ersten Drücken randomSeed(micros()) auf, damit die Würfe von Lauf zu Lauf unterschiedlich ausfallen

Klicke auf Run und drücke den Taster ein paar Mal, dann auf Check.

Probier es selbst

const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8};  // a, b, c, d, e, f, g

// Ein Muster pro Ziffer, von rechts gelesen: Das letzte Bit gehört zu Segment a.
//                     gfedcba
const byte digits[10] = {
  0b0111111,  // 0
  0b0000110,  // 1
  0b1011011,  // 2
  0b1001111,  // 3
  0b1100110,  // 4
  0b1101101,  // 5
  0b1111101,  // 6
  0b0000111,  // 7
  0b1111111,  // 8
  0b1101111   // 9
};

void showDigit(int n) {
  for (int i = 0; i < 7; i++) {
    if (bitRead(digits[n], i) == 1) {
      digitalWrite(segmentPins[i], LOW);   // leuchtet
    } else {
      digitalWrite(segmentPins[i], HIGH);  // aus
    }
  }
}

const int buttonPin = 10;
bool wasPressed = false;
bool seeded = false;

void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode(segmentPins[i], OUTPUT);
  }
  pinMode(buttonPin, INPUT_PULLUP);
  showDigit(0);
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      // Der Knopf wurde gerade gedrückt: Eine Zahl von 1 bis 6 würfeln und anzeigen
    }
    delay(50);  // Warten, bis sich der Knopf stabilisiert hat
  }
  wasPressed = pressed;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Displays und Sensoren

Übe selbstständig: Arduino-Playground