Zufallszahlen: ein D6 auf einer LED Matrix

Zufallszahlen generieren geht ganz einfach. Dafür gibt es die Funktion random().

Wir probieren es einfach mal aus mit einem kleinen Sketch, der eine Zahl generiert und auf dem seriellen Monitor ausgibt:

 

void setup() {
  Serial.begin(9600);
  Serial.print("Zufallszahl zwischen 1 und 6: ");
  Serial.print(random(1,7));
  Serial.print("\n");
}
void loop() {
  // put your main code here, to run repeatedly:
} 

 

Wir laden den Sketch auf unseren Nano, öffnen den  seriellen Monitor, stellen 9600 Baud ein, und freuen uns:

Zufallszahl zwischen 1 und 6: 2

Das war doch gar nicht so schwer? Warum schreibt der Herr Neumann dazu einen Blog-Beitrag?

Wenn man jetzt den Reset-Taster ein Paar mal drückt wird es offensichtlich:

Zufallszahl zwischen 1 und 6: 2
Zufallszahl zwischen 1 und 6: 2
Zufallszahl zwischen 1 und 6: 2
Zufallszahl zwischen 1 und 6: 2
Zufallszahl zwischen 1 und 6: 2

In der offiziellen Dokumentation steht natürlich dass man mittels randomSeed() den Zufallszahlengenerator initialisieren sollte, und empfiehlt dazu mittels analogRead() einen Pin auszulesen der nicht verbunden ist.

Nur durch Zufall bin ich auf die Bibliothek TrueRandom von sirleech gestoßen. Diese bietet eine Funktion TrueRandom.random(), welche wie die random() Funktion aufgerufen werden kann, jedoch ohne weitere Vorbereitung verlässliche Zufallszahlen liefert.

Die Bibliothek gibt es bei GitHub unter https://github.com/sirleech/TrueRandom

Wir passen also unseren Sketch ein wenig an:

 

 

#include <TrueRandom.h> // Die Bibliothek einbinden
void setup() {
  Serial.begin(9600);
  Serial.print("Zufallszahl zwischen 1 und 6: ");
  Serial.print(random(1,7));
  Serial.print("\n");

  Serial.print("Zufallszahl zwischen 1 und 6 mit TrueRandom: ");
  Serial.print(TrueRandom.random(1,7)); 
  Serial.print("\n");
}
void loop() {
  // put your main code here, to run repeatedly:
}

Auch diesen Sketch laden wir auf unseren Nano, und siehe da, es wird nun nach jedem Neustart eine andere Zahl generiert:

Zufallszahl zwischen 1 und 6: 2
Zufallszahl zwischen 1 und 6 mit TrueRandom: 2
Zufallszahl zwischen 1 und 6: 2
Zufallszahl zwischen 1 und 6 mit TrueRandom: 1
Zufallszahl zwischen 1 und 6: 2
Zufallszahl zwischen 1 und 6 mit TrueRandom: 4
Zufallszahl zwischen 1 und 6: 2
Zufallszahl zwischen 1 und 6 mit TrueRandom: 2
Zufallszahl zwischen 1 und 6: 2
Zufallszahl zwischen 1 und 6 mit TrueRandom: 6

 

TrueRandom hat aber noch mehr zu bieten. So erlaubt die Funktion TrueRandom.memfill(adresse, länge) einen speicherbereich an der angegebenen Adresse mit Zufallszahlen zu befüllen.

Es können auch einfach MAC Adressen oder UUIDs generiert werden.

Wir schließen nun ein 64er LED Matrix Display an unseren Nano an, machen daraus einen Würfel.

Als erstes modifizieren wir die im Blog-Beitrag vom 7. Juni beschrieben die Datei MD_MAX72xx_font.cpp wie folgt:

3, 0x42, 0x7f, 0x40, // 49 - '1'
5, 0x72, 0x49, 0x49, 0x49, 0x46, // 50 - '2'
5, 0x21, 0x41, 0x49, 0x4d, 0x33, // 51 - '3'
5, 0x18, 0x14, 0x12, 0x7f, 0x10, // 52 - '4'
5, 0x27, 0x45, 0x45, 0x45, 0x39, // 53 - '5'
5, 0x3c, 0x4a, 0x49, 0x49, 0x31, // 54 - '6'

ersetzen durch:

8,0x0,0x0,0x0,0x18,0x18,0x0,0x0,0x0, // 49 - '1'
8,0x3,0x3,0x0,0x18,0x18,0x0,0xC0,0xC0, // 50 - '2'
8,0x3,0x3,0x0,0x18,0x18,0x0,0xC0,0xC0, // 51 - '3'
8,0xC3,0xC3,0x0,0x0,0x0,0x0,0xC3,0xC3, // 52 - '4'
8,0xC3,0xC3,0x0,0x18,0x18,0x0,0xC3,0xC3, // 53 - '5'
8,0xDB,0xDB,0x0,0x0,0x0,0x0,0xDB,0xDB, // 54 - '6'  

 

Und zu Schluss binden wir die MD_MAX72xx und MD_Parola Bibliotheken ein, und geben die Zahl auf der Matrix aus:

 

 

#include <TrueRandom.h>
#include <MD_MAX72xx.h>
#include <MD_Parola.h>
#include <SPI.h>

#define  MAX_DEVICES 1
#define CLK_PIN   13  // or SCK
#define DATA_PIN  11  // or MOSI
#define CS_PIN    10  // or SS

// Hardware SPI connection
MD_Parola P = MD_Parola(CS_PIN, MAX_DEVICES);
#define  DELAYTIME  100  // in milliseconds

void setup() {
  Serial.begin(9600);
  Serial.print("Zufallszahl zwischen 1 und 6: ");
  Serial.print(random(1,7));
  Serial.print("\n");

  Serial.print("Zufallszahl zwischen 1 und 6 mit TrueRandom: ");
  uint8_t rnd = TrueRandom.random(1,7);
  Serial.print(rnd); 
  Serial.print("\n");
  P.begin();
  P.print(" ");
  delay(500);
  P.print(rnd);
  
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

Nun wird bei jedem neustart (Reset-Taster drücken) eine neue Zahl generiert und angezeigt. 

Würfel

 

 

 

Letzter Artikel Bluetooth Example für ESP32_Dev nachinstallieren
Neuer Artikel Alles hat eine genaue Zeit - DCF77 mit dem Arduino

Hinterlasse einen Kommentar

Kommentare müssen vor der Veröffentlichung überprüft werden

Erforderliche Angabe