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.
Aufgabe
MittelDer 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 mitshowDigit()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;
}
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
1Sieben-Segment-Anzeigen
Sieben-Segment-AnzeigeZiffernmuster in BytesZählen auf der AnzeigeCountdown bis nullWürfel-SimulatorÜbe selbstständig: Arduino-Playground