Für den Arduino gibt es Sieben-Segment-Anzeigen in verschiedenen Bauweisen. Eine kleine Übersicht darüber habe ich im ersten Video zum Thema zusammengestellt:

Im zweiten Video wird es dann etwas konkreter. Wir bauen uns einen Würfel, also einen Zufallszahlengenerator, der das Ergebnis am Sieben-Segment-Display anzeigt.

Die Vorgehensweise habe ich im folgenden Video beschrieben.

ACHTUNG: Bei ca. 01:15 im folgenden Video kommt eine falsche Information. Das CA in der Seriennummer des gezeigten Displays bedeutet nicht „Common Anode“ wie ich im Video sage, sondern steht für „Common CAthode“. Eben deswegen gehört das mittlere Pin ja auch an Ground (=Kathode). Vielen Dank an Leser Ben für den Hinweis (siehe Kommentar unten).


Und hier ist der Arduino Sketch zum Projekt:

// Sieben Segment Würfel
// Mehr Info zum Projekt auf www.makerblog.at

// Welche Segmente muss für welche Ziffer eingeschaltet werden?
int segmente[10][7] = { {1,1,1,1,1,1,0},  // 0
                        {0,1,1,0,0,0,0},  // 1
                        {1,1,0,1,1,0,1},  // 2
                        {1,1,1,1,0,0,1},  // 3
                        {0,1,1,0,0,1,1},  // 4
                        {1,0,1,1,0,1,1},  // 5
                        {1,0,1,1,1,1,1},  // 6
                        {1,1,1,0,0,0,0},  // 7
                        {1,1,1,1,1,1,1},  // 8
                        {1,1,1,1,0,1,1}}; // 9

// Welches Arduino Pin für welches Segment
int pinArray[] = {8,9,3,4,5,7,6};
// Beispiel: Um die Ziffer 1 anzuzeigen, müssen die Segmente b und ) HIGH werden.
// Im segmente[1] entspricht das den Positionen [1][1] und [1][2] (Arrays starten bei 0). 
// Im pinArray ist dem Segment b=[1] das Pin 9 zugeordnet, dem Segment c=[2] das Pin 3.
// Diese müssen wir also HIGH schalten

int buttonPin = 12;

// void() wird einmal beim Start des Programm aufgerufen
void setup() {
  // Pins 3-9 auf dem Arduino als OUTPUT setzen
  for (int i=3; i<10;i++) {
    pinMode(i, OUTPUT);
  }
  
  // Pin 12 für den Pushbutton auf INPUT
  pinMode(buttonPin, INPUT);
  
  // Zufallszahlengenerator mit Analogwert von Pin A0 initialisieren. Da an A0 nichts angeschlossen ist,
  // liefert das Pin einen mehr oder weniger zufälligen Wert.
  randomSeed(analogRead(0));
}

// loop() wird immer wieder ausgeführt, solange der Arduino läuft
void loop() {
  
  // Wenn Button an Pin 12 gedrückt, dann...
  if (digitalRead(buttonPin)==1) {
    // 40 mal eine Zufallszahl ermitteln und am Display anzeigen
    // Das sorgt für den Flackereffekt beim Würfelvorgang
    for (int i=0; i<40; i++) {
      // Zufallszahl zwischen 1 und 6 ermitteln und anzeigen
      showDigit(random(1,7));
      // Bei jedem Durchgang etwas länger warten (deswegen das ansteigende i der Schleife)
      delay(i);
    }
  }
}

// Funktion zur Anzeige einer Ziffer auf dem Siebensegment-Display
void showDigit(int num) {
    // Alle 7 Segmente (von 0-6) bei der gewünschten Ziffer durchgehen
    for (int j=0; j<7; j++) {
      // Ist in segmente[] das Pin gesetzt?
      if (segmente[num][j]==1) {
        // dann setze das zugehörige Arduin-Pin HIGH
        digitalWrite(pinArray[j], HIGH);
      }
      else {
        // ansonsten setze das Pin LOW
        digitalWrite(pinArray[j], LOW);
      }   
      
      // in Kurzform mit trinärem Operator ?: würde das obige if so aussehen:
      // digitalWrite(pinArray[j], (segmente[num][j]==1)?HIGH:LOW);
    }
}

Code-Sprache: Arduino (arduino)

Fragen und Anregungen bitte einfach in die Kommentare schreiben.

9 thoughts on “Würfelspiel: Sieben-Segment-Display am Arduino

  • 12. Dezember 2014 at 15:40
    Permalink

    Hallo :)
    Schönes Tutorial, aber wenn die mittleren Pins der 7-Segment Anzeige an Ground angeschlossen werden, dann ist das eine gemeinsame Kathode, nicht Anode ;) (unteres Video)

    Gruß
    Ben

    Reply
    • 12. Dezember 2014 at 22:24
      Permalink

      Vielen Dank für den Hinweis, du hast natürlich recht. Ich habe das sowohl hier im Blog als auch als Anmerkung im Youtube-Video richtig gestellt.

      Reply
  • 24. Januar 2016 at 11:44
    Permalink

    Hallo es hätte mich mehr interessiert das Arduino Sketch Project mit dem Countdown statt dem würfel also abwärts von 9-0 beim erreichen der null einen piezzo pipser der los fiept zum Beispiel

    Reply
  • 18. Oktober 2016 at 13:15
    Permalink

    Hallo AdiDax,

    zuerst und vor allem: Vielen Dank für die vielen Anregungen, die einem blutigen Anfänger sicher eine Menge Frust vermeiden helfen.
    Aber eine Sache habe ich in dem 7-Segment-Sketch nicht verstanden und der Compiler auch nicht, jedenfalls kommt diese Fehlermeldung:

    ’showDigit‘ cannot be used as a function

    Ich habe versucht, ganz am Anfang „showDigit“ zu „initialisieren“ (int showDigit = 0), aber geholfen hat es nicht. Was habe ich falsch gemacht?

    Viele Grüße und nochmals vielen Dank!

    Reply
    • 18. Oktober 2016 at 15:44
      Permalink

      Ich hab hier die Arduino IDE 1.6.12 und der Sketch von der Seite lässt sich unverändert erfolgreich fehlerfrei kompilieren. Welche Version der Arduino IDE verwendest du?
      Was meinst du mit „int showDigit = 0“? Das ist ja als Funktion definiert und du würdest damit versuchen den gleichen Namen nochmal für eine Variable zu verwenden. Das funktioniert so nicht.

      Reply
  • 21. Februar 2019 at 22:23
    Permalink

    Hallo, bin Arduino-Anfänger. Allerdings hapert es noch ein wenig an Erfolgserlebnissen. Da kam dein 7-Segment-Würfelprojekt gerade recht. Funktioniert hervorragend. Habe auch probiert, von 0-9 anzeigen zu lassen. Kein Problem. Jetzt würde ich gern alles in ein Gehäuse bauen, aber mit einem zusätzlichen Schalter an einem Pin, mit dem man von Anzeige 1-6 auf 0-9 (hier mit zus. Dezimalpunkt) umschalten kann. Habe versucht, im Loop einfach einen if-Befehl voranzustellen und dann den Inhalt deines Sketches laufen zu lassen, bzw eine geänderte Version für die 0-9 Anzeige + Punkt. Läuft aber nicht, scheitert schon am Kompillieren, scheint also nicht so einfach zu sein. Kanst du mir helfen?

    MfG

    Ingolf

    Reply
    • 3. März 2019 at 22:37
      Permalink

      Hi Ingolf, sorry für die späte Reaktion.
      Willst du zum Umschalten des Modus einen Taster oder einen Kippschalter verwenden?
      Wie schaut denn dein Sketch derzeit aus? Schick ihn mir einfach, ich schau gerne drüber.
      lg, Adi

      Reply
  • 23. März 2021 at 17:37
    Permalink

    Hi. gutes Video.
    ich habe 2 Fragen:
    1. wie kann ich 2 7-Segment-Displays ansteuern, für 2 unterschiedliche Zufallszahlen?
    2. wie kann ich anhand des Ergebnisses der 2 Zufallszahlen (Summe) 11 LED ansteuern?

    Reply
  • 18. März 2023 at 13:19
    Permalink

    // Sieben Segment Würfel

    int segmente[10][7] = { {1,1,1,1,1,1,0}, // 0
    {0,1,1,0,0,0,0}, // 1
    {1,1,0,1,1,0,1}, // 2
    {1,1,1,1,0,0,1}, // 3
    {0,1,1,0,0,1,1}, // 4
    {1,0,1,1,0,1,1}, // 5
    {1,0,1,1,1,1,1}, // 6
    {1,1,1,0,0,0,0}, // 7
    {1,1,1,1,1,1,1}, // 8
    {1,1,1,1,0,1,1}}; // 9

    int pinArray[] = {14, 15, 5, 6, 11, 13, 12};

    int buttonPin = 18;

    void setup() {

    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(11, OUTPUT);
    pinMode(12, OUTPUT);
    pinMode(13, OUTPUT);
    pinMode(14, OUTPUT);
    pinMode(15, OUTPUT);

    pinMode(buttonPin, INPUT);

    randomSeed(analogRead(0));
    }

    void loop() {

    if (digitalRead(buttonPin)==1) {

    for (int i=0; i<40; i++) {

    showDigit(random(1,7));

    delay(i);
    }
    }
    }

    void showDigit(int num) {

    for (int j=0; j<7; j++) {

    if (segmente[num][j]==1) {

    digitalWrite(pinArray[j], HIGH);
    }
    else {

    digitalWrite(pinArray[j], LOW);
    }

    }
    }

    Leider funktioniert das Programm trotz korrekter Beschaltung autonom nicht.
    Ich habe eine eigene Platine gefertigt und die PIN-Nummerierung entsprechend geändert.
    Wo könnte da der Fehler liegen?

    Reply

Schreibe einen Kommentar zu Codecruncher Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.