Zufallszahlen: ein D6 auf einer LED Matrix - AZ-Delivery

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

 

 

 

Für arduinoProjekte für anfänger

1 comment

Peter Nohle

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?

Leave a comment

All comments are moderated before being published

Recommended blog posts

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery