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 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.
1 comment
Peter Nohle
Hallo. Ich habe den Sketch an 3 Nanos probiert. Bei allen leuchtet nur alle 64 LEDs der Matrix. Als blutiger Anfänger habe ich jetzt im Code nix auffälliges entdeckt. Nach dem Upload des Sketches der fehlerfrei verläuft, blinken nach einem Reset auch kurz zwei Leds
auf dem Nano. Das heißt er arbeitet das Setup ab. Nur… Die Matrix bringt keine Änderung. Alle leuchten. Die cpp hab ich angepaßt. Was mache ich falsch?