Anzeigewert tauschen im 4 7-Segment-Display

Hallo Leute. Ich habe zum ersten mal mit Arduino und C++ gearbeitet und für einen Tischkicker einen Torzähler zusammen gebastelt.

Material: Arduino Nano, zwei gewöhnliche Lichtschranken, zwei digitale Displays, Marke unbekannt.
Zum Betrieb der Displays habe ich mich der tm1637-Bibliothek bedient und solange probiert, bis es funktionierte.

Problem: Beide Displays sollen nicht parallel laufen, der Spielstand soll auf beiden Tischseiten so angezeigt werden, dass "Home" und "Gast" stets an der selben Stelle angezeigt werden. Spieler 1 (Home) sieht seine Tore also links, die des Gegners rechts. Der Gegner (Gast) sieht ebenfalls seine Tore links, die des Gegners rechts. Dazu müsste man die Display-Stellen irgendwie tauschen können (1+2 mit 3+4).

Die Pins für DIO und CLK werden am Anfang festgelegt; wäre es überhaupt möglich, zwei Displays zu betreiben, die unterschiedliche Werte zeigen?

Vorab schon mal besten Dank.

Mein Code:


#include "TM1637.h"
#define CLK 8
#define DIO 9
TM1637 tm1637(CLK, DIO);

int Torstand1; // Variablen fuer Torststaende definiert
int Torstand2;
int Maximal; // Maximal soll die Anzeige bei 99 resetten

#define Kontrolllampe1 3 // Lichtschranke1 //LED-Spielerei
#define Kontrolllampe2 5 // Lichtschranke2
#define Kontrolllampe3 7 // Reset

#define SENSORPIN1 2 // Lichtschranke1
#define SENSORPIN2 4 // Lichtschranke2
#define SENSORPIN3 6 // Reset

int Sensorstatus1 = 0, LetzterStatus1 = 0; 
int Sensorstatus2 = 0, LetzterStatus2 = 0; 
int Sensorstatus3 = 0, LetzterStatus3 = 0; 

void setup() {

 tm1637.init();
 tm1637.set(BRIGHT_TYPICAL);
 tm1637.point(1); //Doppelpunkt
 
 pinMode(Kontrolllampe1, OUTPUT);
 pinMode(Kontrolllampe2, OUTPUT);
 pinMode(Kontrolllampe3, OUTPUT);
 
 pinMode(SENSORPIN1, INPUT); 
 digitalWrite(SENSORPIN1, HIGH); 
 pinMode(SENSORPIN2, INPUT);
 digitalWrite(SENSORPIN2, HIGH);
 pinMode(SENSORPIN3, INPUT);
 digitalWrite(SENSORPIN3, HIGH);
 Torstand1 = 0;
 Torstand2 = 0; 
 Maximal = 99;
}

void loop(){

 Sensorstatus1 = digitalRead(SENSORPIN1); 
 Sensorstatus2 = digitalRead(SENSORPIN2);
 Sensorstatus3 = digitalRead(SENSORPIN3); 

 tm1637.display(0, (Torstand1 / 10) ); // Display-Stelle 1 = erste Stelle von Torstand1
 tm1637.display(1, Torstand1 % 10 ); // Display-Stelle 2 = zweite Stelle von Torstand1
 tm1637.display(2, (Torstand2 / 10) ); // Display-Stelle 3 = erste Stelle von Torstand2
 tm1637.display(3, Torstand2 % 10 ); // Display-Stelle 4 = zweite Stelle von Torstand2
 
  
 //"Falls-Sonst-Abfragen"
 
 if (Sensorstatus1 == LOW) { 
 digitalWrite(Kontrolllampe1, HIGH); //Kontrolllampe ein
 }
 else {
 digitalWrite(Kontrolllampe1, LOW); //Kontrolllampe aus
 }
 if (Sensorstatus2 == LOW) { 
 digitalWrite(Kontrolllampe2, HIGH); 
 }
 else {
 digitalWrite(Kontrolllampe2, LOW); 
 }
 if (Sensorstatus3 == LOW) { 
  for (int zaehler=1; zaehler<=3; zaehler = zaehler+1){ //3x Blinken bei Reset
    digitalWrite(Kontrolllampe3, HIGH);
    delay(200);
    digitalWrite(Kontrolllampe3, LOW);
    delay(200); 
  }
 }
 else {
 digitalWrite(Kontrolllampe3, LOW); 
 } 
 
 if (Sensorstatus1 && !LetzterStatus1) { 
 }
 if (!Sensorstatus1 && LetzterStatus1) {
 Torstand1 = Torstand1 + 1; 
 delay(1000);
 }
 if (Sensorstatus2 && !LetzterStatus2) {
 }
 if (!Sensorstatus2 && LetzterStatus2) {
 Torstand2 = Torstand2 + 1;
 delay(1000);
 }
 if (Sensorstatus3 && !LetzterStatus3) {
 }
 if (!Sensorstatus3 && LetzterStatus3) {
 Torstand1 = 0;
 Torstand2 = 0;
 delay(500);
 }
 if (Torstand1 == Maximal){
 Torstand1 = 0;
 }
 if (Torstand2 == Maximal){
 Torstand2 = 0;
 }
 LetzterStatus1 = Sensorstatus1; // Auf diesen 3 Zeilen werden die zuletzt erkannten Zustaende
 LetzterStatus2 = Sensorstatus2; // an den Lichtschranken und dem Nullsteller gespeichert
 LetzterStatus3 = Sensorstatus3;


}

Aktuell hast du nur 1 Display. Dass da parallel zwei Geräte dran hängen, merkt die Software nicht.

Zwei unterschiedliche Displays brauchen eigene Pins und zwei Objekte.

#include "TM1637.h"
#define CLK1 8
#define DIO1 9
TM1637 tm1(CLK1, DIO1);
#define CLK2 10
#define DIO2 11
TM1637 tm2(CLK2, DIO2);
void setup() {
   tm1.init();
   tm2.init();
   tm1.display(0,9);
   tm1.display(1,8);
   tm1.display(2,7};
   tm1.display(3,6);
   tm2.display(0,0);
   tm2.display(1,1);
   tm2.display(2,3};
   tm2.display(3,4);
}

Das sollte in beiden Displays unterschiedliche Werte anzeigen.

1 Like

Danke für den Tipp, werde ich direkt mal ausprobieren.
Welche Funktion erfüllen denn tm1.display(0,9); ect, bzw was genau wird da ausgesagt?
Danke für die Hilfe und einen schönen Sonntag :slight_smile:

stell dir doch einfach die Frage, welche Funktion erfüllt denn diese Zeile in deinem Sketch:

tm1637.display(0, (Torstand1 / 10) );

was macht die ganz genau?

1 Like

"0" ist die erste Stelle des Displays, "Torstand 1 / 10" sagt dort soll die Einer-Stelle angezeigt werden.
Was ich selber nicht ganz verstehe: Wieso zeigt Modulo (%) in der Anweisung "Torstand1 % 10" die zweite Stelle an? Der Logik folgend würde ich 10 / 10 schreiben.

ich behaupte das ist die 10er Stelle der Ziffer aber ok. Und jetzt analysiere mal was

tm1.display(0,9);

ausgibt.

zu deiner anderen Frage:

Angenommen du hast Torstand 12

dann ist in Ganzzahl: 12 / 10 = 1 ... das gibst auf der "Zehnerstelle" aus --> digit 0.
12/10 ist zwar 1, aber hat auch 2 Rest.
Das ist die Modulo Division.
Daher gibst du 2 auf der "Einerstelle" auf digit 1 aus.

Ich habs erst mal so gemacht, denn mir erschließt sich immer noch nicht die zweite Zahl in der Klammer, aber irgendwann komm ich da auch noch drauf.
image

Mein Problem wurde gelöst und das ist erst mal Hammer geil.
Vielen Dank euch. :smiling_face_with_three_hearts:

die zweite Zahl in der Klammer - es heißt der zweite Parameter - ist genau der Wert der ausgegeben werden soll.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.