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

Hallo,
ich bin da gerade so am bastel einer kleinen Punkteanzeige . ( z.b. die im Fussball 1:2 )
Klar den Doppelpunkt bekomme ich nicht hin aber man Könnte in der mitte den Strich zum leuchten bringen.

  1. Problem
    Das geht aber Irgenwie bei mir nicht ;-( was auch immer ich versuche , da läuft dann eine zahl in der mitte . pinMode(11, OUTPUT) wäre das
  2. Problem
    zur zeit zählt der ja nur nach delay(10) hoch
    eingentlich wäre mein wunsch 2 Button zu haben auf A0,A1
    Wenn man Jetzt A0 Klickt soll es eine zahl weiter zählen .
    Drückt man jetzt A1 Button soll es umschalten und bei erneuten Klick von A0 eben die andere zahl eins weiter zählen . Kompliziert :slight_smile:
    Geht sowas Irgenwie ?

Gund : das ganze soll hinter eine Zielscheibe . löst nun a0 aus zählt er ein punkt . Ist Spieler 2 dran drückt man einmal A1 und nun sollte eben die andere seite zählen . Denke so ist das besser erklärt .Vieleicht hat jemand eine Idee ich bin totaler Anfänger und stehe auf dem schlauch . Danke für Eure Hilfe

int digit[10] = {0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b11111111, 0b1101111};  
    int digit1, digit2, digit3;
    void setup()   
    {  
      for (int i = 2; i < 9; i++)   
      {  
        pinMode(i, OUTPUT);  
      } 
     
      pinMode(10, OUTPUT);  
      pinMode(12, OUTPUT);  
    }  
      
    void loop() {  
      Strich();
      for (int j = 0; j <= 99; j++)   
      {  
        digit2 = j / 10;  
        digit1 = j % 10;  
      for ( int k = 0; k < 20; k++)  
      {  
          digitalWrite(12, LOW);  
          digitalWrite(10, HIGH);  
          dis(digit2);  
          delay(10);  
      
          digitalWrite(12, HIGH);  
          digitalWrite(10, LOW);  
          dis(digit1);  
          delay(10);  
      }  
      }  
    }

      /// BLÖDSINN GEHT NOCH NICHT 
  void Strich() {
  int i;
  for(i=2; i<10; i++)
  {
    digitalWrite(i, LOW);
  }  
  digitalWrite(5, HIGH);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
}
    void dis(int num)   
    {  
      for (int i = 2; i < 9; i++)   
      {  
        digitalWrite(i, bitRead(digit[num], i - 2));  
      }  
    }  

Also hab mal etwas weitergemacht und dachte die zahlen laufen auf diese art schon mal unterschiedlich, aber nö die anzeige lacht mich aus :frowning:


    int digit[10] = {0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b11111111, 0b1101111};  
    int digit_strich[11] = {0b0111111};   

    
    int digit1, digit2;  
      
    void setup()   
    {  
      for (int i = 2; i < 9; i++)   
      {  
        pinMode(i, OUTPUT);  
      }  
      pinMode(10, OUTPUT);  


////////////////////////////////////////////
    for (int g = 2; g < 9; g++)   
      {  
        pinMode(g, OUTPUT);  
      }  
       pinMode(12, OUTPUT);
        
    }  
 


 
      
    void loop() {  
      for (int j = 0; j <= 99; j++)   
      {  
           digit1 = j % 10;  
      for ( int k = 0; k < 20; k++)  
      {      
          digitalWrite(10, LOW);  
          dis(digit1);  
          delay(20);  
      }  
      }  

      ///////////////////////////////////////
      for (int h = 0; h <= 99; h++)   
      {  
        digit2 = h / 10;  
     
      for ( int o = 0; o < 20; o++)  
      {  
          digitalWrite(10, HIGH);  
          dis(digit2);  
          delay(10);  
      }  
      }  
    }  
      
    void dis(int num)   
    {  
      for (int i = 2; i < 9; i++)   
      {  
        digitalWrite(i, bitRead(digit[num], i - 2));  
      }  

      for (int g = 2; g < 9; g++)   
      {  
        digitalWrite(g, bitRead(digit[num], g - 2));  
      }  
    }  

Was sofort auffällt: Im setup() werden die Pins 2 bis 8, 10 und 12 auf Output gesetzt ... Hier läuft die Schleife bis inkl. i = 9 ... Das ist bestimmt noch nicht das Problem :wink:

P.S.: Und dann wäre vielleicht eine kleine Skizze der Hardware hilfreich.

Und ja, ganz klar geht so etwas!

Mein Vorschlag: Bringe erst einmal eine der 7-Segment-Anzeigen zum Laufen. Danach kann man daraus eine Funktion ableiten, die sich auf weitere Anzeigen umschalten lässt.

[Korrektur: Meine folgende Aussage habe ich zurückgenommen, nachdem ich die Hardware-Konfiguration gesehen habe :innocent: :disappointed_relieved:]

Nach 10 Millisekunden .... Das sind 100 Zahlen/Sekunde ... Die Anzeige lacht Dich nicht aus, sondern ist vor Bewunderung platt :wink: Vielleicht mal mit delay(1000) versuchen ... ?!?

aufgebaut ist es genau hier nach : https://tutorial45.com/arduino-7-segment-display/

die anzeige läuft auch schon nur eben nicht mit sein code . und ich musste mein nutzen. und jetzt komme ich nee weiter
LG Toni

Ganz bestimmt nicht :slight_smile:
denn:

@cooper3210
Mich würde ja interessieren, was das hier wird:

Das ist doppelt gemoppelt.

Und was willst Du hier machen?

Du schreibst 100 mal 20 = 2000 Umläufe mit einem delay von 10ms ein LOW auf einen Pin, der sich nicht verändert.
u.s.w.

Mach mal nen Zeichnung von deinem Aufbau - ich versteh nicht, was Du da machst.

Ganz bestimmt doch :wink: Schau noch mal hin ( i=2; i<10;i++):

void Strich() {
  int i;
  for(i=2; i<10; i++)
  {
    digitalWrite(i, LOW);
  }  

Und damit wird auch auf i = 9 ge-digitalwritten :wink:

Genau, darum habe ich auch gebeten; sonst wird unsere Phantasie echt gestresst :innocent:

Kurze Frage: Musst Du das nehmen?
Besorg Dir sowas hier:

brauchst nur 2 Pins + Versorgung und hast Deinen Doppelpunkt etc.pp.

Darauf achten: Es gibt zwei unterschiedliche Varianten - eine die an jedem digit einen Punkt hat und eine, die den Doppelpunkt hat.

wie soll ich das ganze erklären . man stelle sich eine zielscheibe vor und 2 person die daruaf schiessen . trifft person a soll es eben eins höher zählen ( ausgelöst durch taster hinter der zielscheibe . Ist person B dran . möchte ich button 2 drücken um auf anzeige 2 zu weckseln . damit er dort zählt . bei 9 schuss ist schluss.
lg

@my_xy_projekt: Hast Du Dir den Sketch mal angeschaut auf der Seite

https://tutorial45.com/arduino-7-segment-display/

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

//calculating the first (on the left) character for our display
  show_number(1,counter/100%10, false);
  delay(1);
  //calculating the second character for our display
  show_number(2, counter/10%10, false);
  delay(1);
  //calculating the first (ont the right) character for our display
  show_number(3, counter%10, false);
  delay(1);

}

Ich nehme meine Aussage von Post 5 zurück ... Die Durchläufe durch loop() müssen so schnell sein, weil die Ansteuerung der drei 7-Segmentanzeigen sequentiell über die gleichen Pins läuft und die Trägheit des Auges ausgenutzt wird, damit es nicht flackert. 7-Segment-Kino für zuhause, sozusagen.

P.S.: Der Pin 9 wird auf der o.a. Seite für den Dezimalpunkt verwendet.

genau das habe ich mir angeschaut und das läuft ja - nur eben nicht so richtig

Ich hätte eine ganz andere rangehensweise.
Erstmal ohne Anzeige und nur mit dem Seriellen Monitor das aufaddieren machen.
Bis das so läuft, wie Du Dir das vorstellst.
Dann die Anzeige - das ist nur eine zusätzliche Funktion.
Du verlierst Dich jetzt in einem Versuch einer Anzeige der Dir nicht hilft.

ich verliere mich schon in der Idee :slight_smile: es geht mir echt um den spass . und das 2 person wie beim Dart eben eine punkte anzeige haben .

man könnte auch 9 LED nehmen pro person . und pro treffer geht eben eine mehr an :slight_smile:
aber wie ich das bastel mhhh

art wie hierbeispiel
aber eben das es für zwei spieler wäre und eben mit pro tastendruck nur 1 punkt höher zählt
perfekt erklärt genau das aber mit nur ein sensor und ein umschalter ( es gibt nur ein ziel ) Automatischer Torzähler für Tischkicker - Oberstufenzentrum Täuffelen OSZT

Versuch die Bibliothek
SevSeg-master

da drin sind auch Beispiele, ist besser als selber Spagetticode schreiben :wink:

Dann mal hier erstmal einen Ansatz.
Du hast X Spieler, Die Auswahl des Spielers soll mit einem Taster erfolgen. Wäre hier jetzt ein Taster an PIN 2 nach GND.
Die Würfe sollen ebenfalsl aufaddiert werden - aber eben für den jeweiligen Werfer. Ist hier PIN 3 mit einem Taster nach GND.

Ich formatiere etwas anders - also nicht erschrecken.
Und ich habe im SerMon 115200 eingestellt - musst Du entsprechend ändern.

const byte binIchPin = 2;      // Taster Pin für Auswahl Werfer
const byte wurfPin = 3;        // Taster Pin aufaddieren Würfe
const byte maxBinIch = 2;      // maximale Anzahl User!
byte werIchBin;                // Merker wo aufgezählt wird
byte zaehler[maxBinIch] = {0}; // Zaehler für alle

const unsigned long debounceTime = 50; // Zeit in ms!

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(binIchPin, INPUT_PULLUP);
  pinMode(wurfPin, INPUT_PULLUP);
}

void loop()
{
  setWerBinIch();
  setWurfZaehler();
}

void setWerBinIch()
{
  static unsigned long lastmillis = 0;
  static bool lastread = false;
  if (millis() - lastmillis > debounceTime)
  {
    if (!digitalRead(binIchPin))
    {
      if (lastread == false)
      {
        lastmillis = millis();
        lastread = true;
        werIchBin++;
        if (werIchBin >= maxBinIch)
        {
          werIchBin = 0;
        }
        Serial.print(F("Neuer Werfer: "));
        Serial.println(werIchBin);
      }
    }
    else
    {
      lastread = false;
    }
  }
}


void setWurfZaehler()
{
  static unsigned long lastmillis = 0;
  static bool lastread = false;
  if (millis() - lastmillis > debounceTime )
  {
    if (!digitalRead(wurfPin))
    {
      if (lastread == false)
      {
        lastread = true;
        lastmillis = millis();
        zaehler[werIchBin]++;
        Serial.print(F("Neuer Zaehler für Werfer: "));
        Serial.print(werIchBin);
        Serial.print(F(" ist: "));
        Serial.println(zaehler[werIchBin]);
      }
    }
    else
    {
      lastread = false;
    }
  }
}

Das wäre mein grundgerüst.
Und wenn es das macht, was Du willst, kommt Deine Anzeige dran.

Wenn Du Fragen hast, frage!

das geht nur das pin 2 und 3 schon bvelegt wäre :wink: hab nur noch a0-a5 frei aber du hast verstanden um was es geht ! perfekt 13 wäre noch frei ! aber der würde für ein restes vieleicht bleiben - denke das macht sinn

Na ist doch ok.
Dann nimm:

const byte binIchPin = A0;      // Taster Pin für Auswahl Werfer
const byte wurfPin = A1;        // Taster Pin aufaddieren Würfe