7-Segment mit oder ohne Chip Zähler für Wurfspiel oder Tischkicker oder …. Zähler " Gelöst "

Also für die Hardware hätte ich mal folgenden Vorschlag (eben mit LibreOffice Draw gezirkelt):

image

Entspricht das Deiner Verdrahtung (hier ohne Dezimalpunkte/Doppelpunkt)?

Grau hinterlegt: Intern
Darunter auf Weiß: Was am Arduino anzuschließen ist

1 Like

Meiner:

15:54:39.296 -> Start...
15:54:39.296 -> ZifferTest:
15:54:39.296 -> zahlLinks: 33	zahlRechts: 46	Display: 3346
15:54:39.296 -> zahlLinks: 35	zahlRechts: 78	Display: 3578
15:54:39.369 -> zahlLinks: 89	zahlRechts: 91	Display: 8991
15:54:39.369 -> zahlLinks: 43	zahlRechts: 34	Display: 4334
15:54:39.369 -> zahlLinks: 89	zahlRechts: 94	Display: 8994
15:54:39.369 -> zahlLinks: 40	zahlRechts: 36	Display: 4036
15:54:39.369 -> zahlLinks: 92	zahlRechts: 40	Display: 9240
15:54:39.369 -> zahlLinks: 19	zahlRechts: 70	Display: 1970
15:54:39.369 -> zahlLinks: 6	zahlRechts: 10	Display: 0610
15:54:39.369 -> zahlLinks: 40	zahlRechts: 12	Display: 4012
15:54:39.369 -> zahlLinks: 79	zahlRechts: 22	Display: 7922
15:54:39.369 -> zahlLinks: 9	zahlRechts: 0	Display: 0900
15:54:39.369 -> zahlLinks: 2	zahlRechts: 87	Display: 0287
15:54:39.369 -> zahlLinks: 95	zahlRechts: 51	Display: 9551
15:54:39.369 -> zahlLinks: 26	zahlRechts: 94	Display: 2694
15:54:39.369 -> zahlLinks: 36	zahlRechts: 1	Display: 3601
15:54:39.369 -> zahlLinks: 5	zahlRechts: 80	Display: 0580
15:54:39.369 -> zahlLinks: 14	zahlRechts: 88	Display: 1488
15:54:39.369 -> zahlLinks: 46	zahlRechts: 79	Display: 4679
15:54:39.369 -> zahlLinks: 96	zahlRechts: 8	Display: 9608
15:54:39.369 -> zahlLinks: 32	zahlRechts: 51	Display: 3251
15:54:39.417 -> zahlLinks: 73	zahlRechts: 79	Display: 7379
15:54:39.417 -> zahlLinks: 31	zahlRechts: 45	Display: 3145
15:54:39.417 -> zahlLinks: 24	zahlRechts: 39	Display: 2439
15:54:39.417 -> zahlLinks: 28	zahlRechts: 29	Display: 2829

Aber da siehst Du auch, was da wie geht.
Du kannst (und musst sowieso!) jede Ziffer einzeln ausgeben. Wie du auf die einzelne Ziffer aus einer Zahl kommst ist im Code.

Da ist es egal, für was Du die Anzeige nimmst. Die Ansteuerung und auch die Darstellung ändert sich nciht.

So jetzt mal #256
10-13 sind Deine digits?
2-9 sind die segs

Wie rum ist das gebaut?
enum {segAn, segAus} oder enum {segAus, segAn}

Dann machen wir das mal mit einer Ziffer und dann sag mir an welchem digit der dp blinken soll.

ja genau so ist es angeschlossen

richtig !

enum {segAn, segAus};
enum {digAus, digAn};

so rum

In der Zuordnung der Digits im Testprogramm (00 - 99) scheint noch ein Dreher zu sein:

image

So kommt es jedenfalls mit einem kleinen Test heraus

//here we have definision of pins for 7 segment display if you want to use different pins you can just change it here
#define LED_A 2
#define LED_B 3
#define LED_C 4
#define LED_D 5
#define LED_E 6
#define LED_F 7
#define LED_G 8
#define LED_DP 9
#define LED_CHAR1 10
#define LED_CHAR2 11
#define LED_CHAR3 12 
#define LED_CHAR4 13
//to int values for counting
int counter;
//to avoid using interrupts I added a helper value
int helper;
void setup () {
  //seting up all the pins as outputs
  pinMode(LED_A, OUTPUT);
  pinMode(LED_B, OUTPUT);
  pinMode(LED_C, OUTPUT);
  pinMode(LED_D, OUTPUT);
  pinMode(LED_E, OUTPUT);
  pinMode(LED_F, OUTPUT);
  pinMode(LED_G, OUTPUT);
  pinMode(LED_CHAR1, OUTPUT);
  pinMode(LED_CHAR2, OUTPUT);
  pinMode(LED_CHAR3, OUTPUT);
  Serial.begin(115200);
}


int d1,d2,d3,d4;
char c = '#';

void loop () {
    //when helper value is equal to 30 we increment counter by one
  //thanks to this we our display not flicker
  if(helper == 100){
      counter+=1;
      //setting up helper to 0 to start again
      helper = 0;
  }
  //incrementing helper value
  helper++;

  if(Serial.available()) c = Serial.read();
  switch (c){
    case '1' : d1 = 1; d2 = 0; d3 = 0; d4 = 0; break;
    case '2' : d1 = 0; d2 = 1; d3 = 0; d4 = 0; break;
    case '3' : d1 = 0; d2 = 0; d3 = 1; d4 = 0; break;
    case '4' : d1 = 0; d2 = 0; d3 = 0; d4 = 1; break;
    case '#' : d1 = 10; d2 = 10; d3 = 10; d4 = 10; break;
    case '*' : d1 = 1; d2 = 2; d3 = 3; d4 = 4 ; break;
  };

  show_number(1, d1, false);
  delay(1);
  show_number(2, d2, false);
  delay(1);
  show_number(3, d3, false);
  delay(1);
  show_number(4, d4, false);
  delay(1);
  
  
}



//function to control 7 segment display there are some ifs to turn on the segments on or off and to turn on the character
//you can also use the decimal point
void show_number(int char_number, int number, int decimal_point){

  //turning off all segments of display

  digitalWrite(LED_A, HIGH);
  digitalWrite(LED_B, HIGH);
  digitalWrite(LED_C, HIGH);
  digitalWrite(LED_D, HIGH);
  digitalWrite(LED_E, HIGH);
  digitalWrite(LED_F, HIGH);
  digitalWrite(LED_G, HIGH);
  digitalWrite(LED_DP, HIGH);

  digitalWrite(LED_CHAR1, LOW);
  digitalWrite(LED_CHAR2, LOW);
  digitalWrite(LED_CHAR3, LOW);
  digitalWrite(LED_CHAR4, LOW);

  //turning leds on

  if(number == 0 || number == 2 || number == 3 || number == 5 || number == 6 || number == 7 || number == 8 || number == 9){
    digitalWrite(LED_A, LOW);
  }
  if(number == 0 || number == 1 || number == 2 || number == 3 || number == 4 || number == 7 || number == 8 || number == 9){
    digitalWrite(LED_B, LOW);
  }
  if(number == 0 || number == 1 || number == 3 || number == 4 || number == 5 || number == 6 || number == 7 || number == 8 || number == 9){
    digitalWrite(LED_C, LOW);
  }
  if(number == 0|| number == 2 || number == 3 || number == 5 || number == 6 || number == 8 || number == 9){
    digitalWrite(LED_D, LOW);
  }
  if(number == 0|| number == 2 || number == 6 || number == 8){
    digitalWrite(LED_E, LOW);
  }
  if(number == 0 || number == 4 || number == 5 || number == 6 || number == 8 || number == 9){
    digitalWrite(LED_F, LOW);
  }
  if(number == 2 || number == 3 || number == 4 || number == 5 || number == 6 || number == 8 || number == 9){
    digitalWrite(LED_G, LOW);
  }
  
  if(decimal_point > 0){
      digitalWrite(LED_DP, LOW);
  }

if(char_number == 4){
  digitalWrite(LED_CHAR1, HIGH);    // Pin 13
}else if(char_number == 1){         // Pin 10
  digitalWrite(LED_CHAR3, HIGH);
}else if(char_number == 3){         // Pin 12  
  digitalWrite(LED_CHAR2, HIGH);
}else if(char_number == 2){         // Pin 11
  digitalWrite(LED_CHAR4, HIGH);
}
}

Wenn man im Seriellen * eingibt, werden alle Digits in der Reihenfolge der Pins 10,11,12,13 auf jeweils auf den Wert 1, 2, 3, 4 gesetzt. 10 und 11 scheinen vertauscht zu sein ... ?!?

(In der loop() sieht man, was ich mache: Man kann entweder jede Ziffer ansteuern (dort eine 1 anzuzeigen) oder mit # alles ausschalten, bzw. mit * die Zahl 4321 (theoretisch) darzustellen, nur das eben 4312 ankommt.

Ich prüfe nochmal die virtuelle "Verdrahtung" bei Wokwi, vielleicht liegt der Fehler bei mir. Das kann @cooper3210 jedoch selbst mit dem Sketch hier testen!

darstellung ist 3 4 2 1

vieleicht hilft das weiter( Bild )
Display dp -> Arduino pin 9 ist + /Diode an 10- Werfer 1 / an 12- Werfer 2
digits die bei 1 losgehen wären ja die 10 und die 12 .

Das hilft weiter :wink: Auf diese Konfiguration wäre ich sonst nicht gekommen ...

@my_xy_projekt: Hattest Du das schon so drauf?

Hab noch mal alles zusammengefasst

Display 2 -> Arduino 10 through 300Ω resistor + segment 2 Spieler 1
Display 1 -> Arduino 11 through 300Ω resistor + segment 1 Spieler 1
Display 4 -> Arduino 12 through 300Ω resistor + Segment 4 Spieler 2
Display 3 -> Arduino 13 through 300Ω resistor + Segment 3 Spieler 2

Display a -> Arduino 2
Display b -> Arduino 3
Display c -> Arduino 4
Display d -> Arduino 5
Display e -> Arduino 6
Display f -> Arduino 7
Display g -> Arduino 8
Display dp -> Arduino 9 (EXTRA LED) ist + / Diode an 10- Werfer 1 / an 12- Werfer 2

das ding ist cool :slight_smile: und so schön hell sind die zahlen

const byte digit[11] = {0b1000000,  // 0 = 0b01000000
                        0b1111001,  // 1 = 0b01111001
                        0b0100100,  // 2 = 0b00100100
                        0b0110000,  // 3 = 0b00110000
                        0b0011001,  // 4 = 0b00011001
                        0b0010010,  // 5 = 0b00010010
                        0b0000010,  // 6 = 0b00000010
                        0b1111000,  // 7 = 0b01111000
                        0b00000000, // 8 = 0b00000000
                        0b0010000,  // 9 = 0b00010000
                        0b0111111
                       }; // Alles ausgeschaltet

const byte digPin[4] = {11, 10, 13, 12};
const byte segPin[8] = {2, 3, 4, 5, 6, 7, 8, 9};
uint8_t ziffer[4] = {0};
uint8_t zahlLinks = 0;
uint8_t zahlRechts = 0;
const uint8_t maxZahl = 25;

enum {segAn, segAus};
enum {digAus, digAn};

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  Serial.println(F("ZifferTest:"));
  randomSeed(analogRead(A0));
}


void zeigeZahl()
{
  Serial.print(F("zahlLinks: ")); Serial.print(zahlLinks);
  Serial.print(F("\tzahlRechts: ")); Serial.print(zahlRechts);
  ziffer[0] = zahlLinks / 10;
  ziffer[1] = zahlLinks % 10;
  ziffer[2] = zahlRechts / 10;
  ziffer[3] = zahlRechts % 10;
  Serial.print(F("\tDisplay: "));
  for (byte b = 0; b < sizeof(ziffer) / sizeof(ziffer[0]); b++)
    Serial.print(ziffer[b]);
  Serial.println();
}

void loop()
{
  if (millis() % 1000 == 0)
  {
    zahlLinks = random(0, 100);
    zahlRechts = random(0, 100);
    zeigeZahl();
  }
 //  } Die gehört hier nicht hin...
  setDisplay();
}

void setDisplay()
{
  static byte setDigit = 0;
  for (byte b = 0; b < sizeof(digPin) / sizeof(digPin[0]); b++)
  {
    digitalWrite(digPin[b], digAus);
  }
  for (byte b = 0; b < sizeof(segPin) / sizeof(segPin[0]); b++)
  {
    digitalWrite(segPin[b], segAus);
  }
  if (setDigit == 0 || setDigit == 1)
  {
    digitalWrite(segPin[7], tikTak());
  }
  ausgabe(ziffer[setDigit]);
  digitalWrite(digPin[setDigit], digAn);
  setDigit++;
  if (setDigit >= sizeof(digPin) / sizeof(digPin[0]))
  {
    setDigit = 0;
  }
}
void ausgabe(const byte ziffer)
{
  for (byte b = 0; b < sizeof(segPin) / sizeof(segPin[0]); b++)
  {
    digitalWrite(segPin[b], bitRead(digit[ziffer], b));
  }
}
bool tikTak()
{
  static unsigned long lastmillis = 0;
  const unsigned long freq = 200; // zeit in ms für blinken
  static bool tik = false;
  if (millis() - lastmillis >= freq)
  {
    lastmillis = millis();
    tik = !tik;
  }
  return tik;
}

Mal was für den Emulator

Geht los ... Weiteres folgt hier in Kürze ... Schalten Sie nicht um, nur ein kleine Werbepause :wink:

  • In der loop() eine Klammer zuviel vor SetDisplay();
  • Nach Korrektur: Serial arbeitet, keine Darstellung auf dem LED (dort würde ich momentan auch noch die falsche Reihenfolge bekommen, da die Umsetzung der realen Welt eine Umverdrahtung benötigt... bei der ich höllisch aufpassen muss ... :wink:

Screenshot Serial:

Welches

const byte digit[11] = {0b1000000,  // 0 = 0b01000000
 [...]

ist denn das richtige?
Habe ich den falschen erwischt?

const byte digit[11] = {0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0010010, 0b0000010, 0b1111000, 0b00000000, 0b0010000, 0b0111111};

das müsste richtig sein

Mein Code zählt schon mal richtig.

Wenn ich in der Ausgabe noch eine zusätzliche Serielle einpinne,

void ausgabe(const byte ziffer)
{
  for (byte b = 0; b < sizeof(segPin) / sizeof(segPin[0]); b++)
  {
    digitalWrite(segPin[b], bitRead(digit[ziffer], b));
    Serial.print(bitRead(digit[ziffer], b));
  }
  Serial.println();
}

bekomme ich für jedes digit die Segmente:

17:23:26.238 -> zahlLinks: 23	zahlRechts: 74	Display: 2374
17:23:26.271 -> 00100100
17:23:26.271 -> 00001100
17:23:26.271 -> 00011110
17:23:26.271 -> 10011000

Ich debug das mal hier weiter.

1 Like

das bekomme ich jetzt im serial auch .
habe ```
0b1000000, // 0 = 0b01000000

mal gedreht   und  bringt auch kein leuchten .  muss wo anders sein der fehler

Fehler liegt im setup:

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  Serial.println(F("ZifferTest:"));
  for (byte b = 0; b < sizeof(digPin) / sizeof(digPin[0]); b++)
  {
    digitalWrite(digPin[b], LOW);
    pinMode(digPin[b], OUTPUT);
  }
  for (byte b = 0; b < sizeof(segPin) / sizeof(segPin[0]); b++)
  {
    digitalWrite(segPin[b], LOW);
    pinMode(segPin[b], OUTPUT);
  }
  randomSeed(analogRead(A0));
}

jo jetzt bekomme ich viele zahlen angezeigt . :slight_smile: der anfang ist gemacht SUPER Du bist eben ein profi

Im sekundentakt wechselnd und darstellung wie im seriellen monitor hinter "display: " ?

Jetzt bitte prüfen, ob die letzte angezeigte Zahl in der Reihenfolge stimmt ... Ich habe mich bemüht, Deine Digit-Sortierung in Wokwi nachzubilden, danach wäre immer noch etwas vertauscht, Wie sieht das bei Dir aus?

JA PASST