Ein Schiedsrichtertisch für Tischtennis mit 74HC595 und 74HC165

Hallo liebe Gemeinde,

Ich würde mich nicht als totalen Anfänger bezeichnen, aber Ihrgendwie komme Ich nicht weiter, im Kopf habe Ich die Bedingungen fertig aber bekomme nicht den Anfang hin!!!!
(weiß nicht wie Ich es anders erklären kann)

Zu meinem Setup bzw was Ich realisieren möchte.

ESP32S3
(A)GPIO 5/6/7 6x 74HC595 (7 Segment Anzeigen)
(B)GPIO 9/10/11 7x 74HC595 (je 8 Kanal Optokoppler)
(C)GPIO 12/13/14 3x 74HC595 (7 Segment Anzeigen)
(D)GPIO 15/16/17 2x 74HC165 (12 Taster)
(E)GPIO 39/40/41 1x 74HC165 (6 Taster)

D steuert A und B
E steuert C

Ich werde Versuchen Bilder mit anzufügen.
Ich hoffe das dann mein Vorhaben verständlich wird!
Ich weiß grade absolut nicht wie Ich das in halbwegs verständliche Sätze bringen soll.





Du willst nicht wirklich eine Anzeige bauen, für die Du jeder Taste eine Zahl zuordnest....

Nein,

Ich hoffe das durch die Bilder etwas besser rüber kommt was Ich meine.

Aah....
Ok, und was ist die Frage?

jede Menge i2c portexpander ...

Hi
Keine Portexpander....

74HC595 module

Ja aber warum 74HC595?
Mit I2C-Portexpandern wird das alles viel einfacher

Na ja, dann brauchst du die Schieberegister nur aneinander hängen ... oder was ist das Problem?

Wenn Ich das wüste.... nein Spaß beiseite....

Ich weiß einfach nicht wie Ich anfangen soll!

Ich habe schon einiges gemacht, aber halt immer "nur" fertige Programme genommen und meinen Bedürfnissen angepasst.

Jetzt rächt es sich halt das mir die Basics einfach fehlen!

Ich wollte anfangen damit das es für mich übersichtlicher ist, das Ich das Programm in mehrere Registerkarten unterteile.

Gesagt getan und Versagt..... :man_shrugging:

Ich stehe einfach auf dem sogenannten Schlauch!

Nicht mehr ganz Anfänger in genau was ?

  • Verdrahten?
  • Datenblätter lesen?
  • programmieren?

Aus den Bildern kann man erkennen du möchtest mit einem ESP32S3 dutzendweise 74HC595 Schieberegister ansteuern. Je nach dem welche Taste man drückt soll da dies oder jenes Hoch/runter gezählt oder resetted werden.

Bestimme 74HC595 sollen die Taster einlesen und in Abhängigkeit des Tastendrucks
dann Ausgänge schalten.

Ja und was ist jetzt deine Frage?
Soll jemand für dich den kompletten Code schreiben?

Wenn du unbedingt gleich loslegen willst dann machste erst mal einen Versuchsaufbau mit einem singulären 74HC595 und schreibst ein Testprogramm das den ansteuert.
Dann hängste per Daisy-Chaining einen zweiten dahinter und testest das.

Ok,
Das heisst Du hast schon ein Stück Code und willst den einfach weiterentwickeln?
Dann schmeiss den Code hier rein.
Wir sortieren Dir das schon.

1 Like

Hallo Stefan
In allen drei (gelernter Elektriker)

Die Taster hängen an 74HC165.
Hab noch Probleme mit dem korrekten ausgabe der Taster, obwohl entprellt!

Ansprechen der 7 Segment anzeigen ist kein "Problem" mittels angepastem Programm funtzt auch.
Auch die Optokopler Bänke kann Ich ansprechen.
Aber halt mit einem angepastem Beispiel Program.

Ich möchte nicht das mir jemmand den Code schreibt, Ich möchte das ja selbst "bauen und verstehen", nur fehlt mir einfach der anfang

Es führt kein Weg daran vorbei.
Poste deinen kompletten Sketch.
Poste einen Schaltplan.
XY steht schon in den Startlöchern....

Zerteile dein Projekt in kleine Einheiten:
Die Taster-Eingaben für +/-
Die Logik für die eckigen Tasten
Die Logik für die Optokoppler
Die Ausgabe Auf den Sieben-Segment Anzeigen.

Mit Hilfe von Serial Ausgaben kannst du die einzelnen Einheiten in deinem Projekt einzeln testen.

Da du für "zwei Spieler" zwei gleiche Anzeigen hast, aufpassen, dupliziere keine Codezeilen sondern arbeite von Anfang mit entpsrechenden Arrays bzw. mit Strukturen.

Welches Signal kommt über die 7 Optokoppler herein?

Hallo vipers6

Mit einer schnellen Frage beim Morgenkaffee:

Warum verwendest du den Arduino-Mega nicht als I/O-Schlachtschiff?

Meiner Erfahrung nach ist zusätzliche Hardware eine potenzielle Fehlerquelle im Betrieb, die vermieden werden sollte.

Guten Morgen,
Mit den zerteilen war und ist mein weg.(registerkarten)

Bin grade dabei das mit den array mir anzueignen.

Die Optokopler bringen kein Signal, sind relays für meine großen selbstgebauten 7 segment anzeigen vom Tisch. Bekommen signal von 74hc595 kette. soll Parallel zur den 7 segment anzeigen vom Steuertableau arbeiten.

Bin grade dabei das grundkonstruckt zu erarbeiten.
habe erstmal ein fertiges Program genommen wo die 7 segmente mit zahlen durchlaufen, um zu sehen das alles funtzt.
es sind ja schließlich 5 daisy chain stränge die parallel laufen, das ist das erste was ich zum laufen bekommen möchte.
danach wollte Ich in die einzelnen speziellen funktionen rein.

Das ist der Weg

Guten Morgen,

Da hast du natürlich recht, jedes Bauteil mehr bedeutet eine potenzielle Fehlerquelle mehr!

Aber eine großteil der Sachen hatte Ich bereits, daher der "schwerere" Weg.

1 Like

Wenn du schon eine funktionierende Ausgabe für eine Anzeie ala display[0].print hast und
auf der anderen Seite den Spielstand in einer spieler[0].punkte mitführst
dann rufe einfach die Ausgabe auf mit

i = 0;
display[i].print(spieler[i].punkte);

ebenso das auslesen der Taster, der plus Taster muss eben die spieler[i].punkte erhöhen.

Was ist jetzt das konkrete Problem?

So weit bin Ich noch nicht.....
Ich bin dabei das mir alles gleichzeitig, wie später auch funtzt.
bis jetzt habe Ich ja nur einzelfetzen die alleine ein Teil steuern.
Die muss Ich jetzt erstmal zusammenführen.
Das wäre jetzt z.Bs. für meine ersten anzeigen.

#include <ShiftRegister74HC595.h>
#define SDI 7
#define SCLK 5
#define LOAD 6
#define DIGITS 8

int button = A0;
bool flag = true;
ShiftRegister74HC595<DIGITS> sr(SDI, SCLK, LOAD);

int value, APZ, APE, ASE, BSE,PB1, BPZ, PB2, BPE;

uint8_t  digits[] = {B11000000, //0
                     B11111001, //1
                     B10100100, //2
                     B10110000, //3
                     B10011001, //4
                     B10010010, //5
                     B10000010, //6
                     B11111000, //7
                     B10000000, //8
                     B10010000  //9
                    };

void setup() {
  pinMode(button, INPUT_PULLUP);
}
//------------------------------------------------------------------
void loop() {
  if (digitalRead(button) == HIGH)
  {
    flag = true;
    for (int i = 0; i <= 99999999; i++)  {
      if (digitalRead(button) == LOW)
        break;
      showNumber(i);
      delay(25);
    }
  }
  if (digitalRead(button) == HIGH and flag == true)
  {
    flag = false;
    delay(2000);
    sr.setAllLow();
  }
}
//------------------------------------------------------------------
void showNumber(int num){
  APZ = num % 10 ;
  APE = (num / 10) % 10 ;
  ASE = (num / 100) % 10 ;
 // PB1 = (num / 1000) % 10 ;
  BSE = (num / 1000) % 10 ;
 // PB2 = (num / 100000) % 10 ;
  BPZ = (num / 10000) % 10 ;
  BPE = (num / 100000) % 10 ;
  //Send them to 7 segment displays
  uint8_t numberToPrint[] = {digits[APE], digits[APZ], digits[ASE], digits[PB1], digits[BSE], digits[PB2], digits[BPE], digits[BPZ]};
  sr.setAll(numberToPrint);
}

so richtig ausgetestet ist das aber nicht oder?
Deine showNumber nimmt nur ein int auf.

Um wie im Obigen Bild ein 11 / 3 zu 9 / 2 auszugeben überschreitest du doch die Größe für ein int.

Wenn ich diesen prozessuralen Weg weitergehen müsste, dann würde ich zunächst eine Funktion machen, die 4 einzelne Werte als Parameter (ap, as, bs, bp) bekommt und diese ausgibt.