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.
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
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.
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
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!
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.
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
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
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?
// 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?