/*
https://forum.arduino.cc/t/ein-schiedsrichtertisch-fur-tischtennis-mit-74hc595-und-74hc165/1351812
https://wokwi.com/projects/422507925198699521
2025-02-10 noiasca - Umbau auf OOP
*/
#include <ShiftRegister74HC595.h>
constexpr uint8_t button = A0;
bool flag = true;
class SevenSegment {
const uint8_t digits[10] = {0b11000000, //0 - vermutlich invers für Common Anode 7 Segment
0b11111001, //1
0b10100100, //2
0b10110000, //3
0b10011001, //4
0b10010010, //5
0b10000010, //6
0b11111000, //7
0b10000000, //8
0b10010000 //9
};
const uint8_t sdi;
const uint8_t sclk;
const uint8_t load;
//ShiftRegister74HC595<8> sr(sdi, sclk, load)
ShiftRegister74HC595<8> sr;
public:
SevenSegment(uint8_t sdi, uint8_t sclk, uint8_t load) : sdi(sdi), sclk(sclk), load(load), sr(sdi, sclk, load) {}
void showNumber(int num) {
int apz, ape, ase, bse, pb1, bpz, pb2, bpe;
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);
}
void off() {
sr.setAllLow();
}
void show(int aPunkt, int aSatz, int bPunkt, int bSatz, int pb1 = 0, int pb2 = 0) {
// was sind pb1 und pb2?
int apz, ape, bpz, bpe;
apz = aPunkt / 10 ; // to be checked! evtl. sind die zwei shiftregister für ape/apz falsch rum
ape = aPunkt % 10 ; // to be checked!
bpz = bPunkt / 10 ;
bpe = bPunkt % 10 ;
uint8_t numberToPrint[] = {digits[apz], digits[ape], digits[aSatz], digits[pb1], digits[bSatz], digits[pb2], digits[bpe], digits[bpz]};
sr.setAll(numberToPrint);
}
};
// constexpr uint8_t SDI = 7; // Data DS
// constexpr uint8_t SCLK = 5; // 74HC595 pin 10 SHCP
// constexpr uint8_t LOAD = 6; // 74HC595 pin 9 STCP
// constexpr uint8_t DIGITS = 8;
SevenSegment displayA(7, 5, 6); // a 8 digit display on these pins
void setup() {
pinMode(button, INPUT_PULLUP);
displayA.show(10, 2, 3, 4); // testweise Ausgabe
delay(10000); // nur zum testen
}
void loop() {
if (digitalRead(button) == HIGH) {
flag = true;
for (int i = 0; i <= 99999999; i++) {
if (digitalRead(button) == LOW)
break;
displayA.showNumber(i);
delay(25);
}
}
if (digitalRead(button) == HIGH and flag == true) {
flag = false;
delay(2000);
displayA.off();
}
}
//