Forum: Mikrocontroller und Digitale Elektronik Rundenzähler Carrera


von biede1987 (Gast)


Lesenswert?

Hallo ich hab ein Programm geschrieben mit dem man  mit  einer 7 
Segementanzeige von 0-9 hochzählt, dann will ich mit einem externen 
resettaster wieder auf 0 zurücksetzen. Soweit funktioniert es auch. Nur 
sobald ich dann wieder meine Lichtschranke betätige zählt die 
Segmentanzeige nicht mehr weiter.

Ich hab eine  arduino duemilanove

Kann mir jemand helfen?

: Verschoben durch User
von biede1987 (Gast)


Lesenswert?

1
// Lichtschranke ist ein Taster und alle Segmente werden angesteuert, es wird gezaehlt von 1-9 Resettaster setzt zurueck auf 0
2
3
      int Lichtschranke = 11; // oder Taster
4
      int Lichtschrankeunterbrochen; // Variable für den Pin Zustand 
5
      int letzteRunde; // Variable für den letzten Schalterzustand letzte Runde
6
      int Runde = 0; // Wie oft ist der Schalter gedrückt   
7
    
8
      int reset = 12;
9
      int resetdruecken;
10
      //int resetgedrueckt;
11
12
      int a = 2; // a
13
      int b = 3;
14
      int c = 4;
15
      int d = 5;
16
      int e = 6;
17
      int f = 7;
18
      int g = 8;
19
20
21
22
    void setup(){
23
 
24
      Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
25
      pinMode(Lichtschranke,INPUT);
26
      pinMode(reset,INPUT);
27
      pinMode(a,OUTPUT);
28
      pinMode(b,OUTPUT);
29
      pinMode(c,OUTPUT);
30
      pinMode(d,OUTPUT);
31
      pinMode(e,OUTPUT);
32
      pinMode(f,OUTPUT);
33
      pinMode(g,OUTPUT);
34
  
35
       letzteRunde = digitalRead(Lichtschranke); // Anfangszustand lesen
36
       resetdruecken = digitalRead(reset); // Anfangszustand lesen
37
        
38
      }
39
  
40
  void loop() 
41
  
42
      { 
43
      //Runden auf 0 zuruecksetzten
44
      
45
      
46
      resetdruecken = digitalRead(reset);  
47
      if (resetdruecken == LOW)
48
      
49
       
50
      {
51
     
52
      digitalWrite(a,0);
53
      digitalWrite(b,0);
54
      digitalWrite(c,0);
55
      digitalWrite(d,0);
56
      digitalWrite(e,0);
57
      digitalWrite(f,0);
58
      digitalWrite(g,1);
59
      }
60
     
61
      
62
    
63
      
64
          Lichtschrankeunterbrochen = digitalRead(Lichtschranke);
65
              if (Lichtschrankeunterbrochen != letzteRunde) { // Der Zustand des Schalters hat sich verändert 
66
67
                  if (Lichtschrankeunterbrochen == HIGH) { // Ist der Schalter gedrückt? 
68
69
                      Runde++; // Inkrementieren der Variablen Runde 
70
71
                                
72
        Serial.print("Wir sind jetzt in der ");
73
        Serial.print(Runde);
74
        Serial.println(" Runde");
75
        
76
     
77
    
78
  
79
    
80
81
      if (Runde==1)
82
      {
83
      digitalWrite(a,1);
84
      digitalWrite(b,0);
85
      digitalWrite(c,0);
86
      digitalWrite(d,1);
87
      digitalWrite(e,1);
88
      digitalWrite(f,1);
89
      digitalWrite(g,1);
90
      }
91
      
92
      if (Runde==2)
93
      {
94
      digitalWrite(a,0);
95
      digitalWrite(b,0);
96
      digitalWrite(c,1);
97
      digitalWrite(d,0);
98
      digitalWrite(e,0);
99
      digitalWrite(f,1);
100
      digitalWrite(g,0);
101
      }
102
      
103
      if (Runde==3)
104
      {
105
      digitalWrite(a,0);
106
      digitalWrite(b,0);
107
      digitalWrite(c,0);
108
      digitalWrite(d,0);
109
      digitalWrite(e,1);
110
      digitalWrite(f,1);
111
      digitalWrite(g,0);
112
      }
113
      
114
      
115
      if (Runde==4)
116
      {
117
      digitalWrite(a,1);
118
      digitalWrite(b,0);
119
      digitalWrite(c,0);
120
      digitalWrite(d,1);
121
      digitalWrite(e,1);
122
      digitalWrite(f,0);
123
      digitalWrite(g,0);
124
      }
125
      
126
      if (Runde==5)
127
      {
128
      digitalWrite(a,0);
129
      digitalWrite(b,1);
130
      digitalWrite(c,0);
131
      digitalWrite(d,0);
132
      digitalWrite(e,1);
133
      digitalWrite(f,0);
134
      digitalWrite(g,0);
135
      }
136
      
137
      if (Runde==6)
138
      {
139
      digitalWrite(a,0);
140
      digitalWrite(b,1);
141
      digitalWrite(c,0);
142
      digitalWrite(d,0);
143
      digitalWrite(e,0);
144
      digitalWrite(f,0);
145
      digitalWrite(g,0);
146
      }
147
      
148
      if (Runde==7)
149
      {
150
      digitalWrite(a,0);
151
      digitalWrite(b,0);
152
      digitalWrite(c,0);
153
      digitalWrite(d,1);
154
      digitalWrite(e,1);
155
      digitalWrite(f,1);
156
      digitalWrite(g,1);
157
      }
158
      
159
      if (Runde==8)
160
      {
161
      digitalWrite(a,0);
162
      digitalWrite(b,0);
163
      digitalWrite(c,0);
164
      digitalWrite(d,0);
165
      digitalWrite(e,0);
166
      digitalWrite(f,0);
167
      digitalWrite(g,0);
168
      }
169
      
170
      if (Runde==9)
171
      {
172
      digitalWrite(a,0);
173
      digitalWrite(b,0);
174
      digitalWrite(c,0);
175
      digitalWrite(d,0);
176
      digitalWrite(e,1);
177
      digitalWrite(f,0);
178
      digitalWrite(g,0);
179
      }
180
      
181
        }
182
      }
183
      letzteRunde = Lichtschrankeunterbrochen; //Den Zustand merken

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Müßte in

      if (resetdruecken == LOW)


      {

nicht noch mehr passieren?

von biede1987 (Gast)


Lesenswert?

Ja dann muss er hier wieder von vorne anfangen mit zählen

von Karl H. (kbuchegg)


Lesenswert?

Mach dir als erstes mal eine Funktion, der du eine Ziffer von 0 bis 9 
übergibst, und die diese Ziffer dann auf der 7-Seg anzeigt.

Damit hast du dann diesen Teil aus der loop() draussen, so dass dir 
dieses 'Detail' nicht mehr in die Quere kommt, wenn du dich um die Logik 
kümmerst, wie sich der interne Zählerstand verändert, wenn irgendwas 
passiert. Wichtig: dies ist die einzige Funktion, die die Erlaubnis hat, 
an den Pins für die 7-Seg Anzeige rumzufummeln.

Dein Funktion loop() ist offensichtlich schon zu groß, so dass du die 
implementierte Logik nicht mehr überblicken kannst.

: Bearbeitet durch User
von Klaus I. (Gast)


Lesenswert?

Nimm einen CD4026B
SCNR ;o)

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:
> Ja dann muss er hier wieder von vorne anfangen mit zählen

Genau das meine ich.
'Von vorne anfangen mit zählen' bedeutet in erster Linie, dass der 
Rundenzähler in Form der Variable 'Runde' auf 0 gesetzt wird. Es 
bedeutet nicht, dass du dich in der Behandlung des Reset-Tasters um die 
7-Seg Anzeige kümmern musst, in dem du die einzelnen Bits ansteuerst.

Deine loop sieht dann so aus
1
void loop()
2
{
3
  Logik, welche diverse Eingangsleitungen überwacht
4
  uns auswertet. Als Ergebnis dieser Auswertungen verändert sich
5
  der Wert in 'Runde'. Der kann sich erhöhen, der kann auch 0 gesetzt
6
  werden, der kann eine Rundenvorgabe für den Gegner kriegen. Egal was,
7
  spielt keine Rolle - manipuliert wird immer in 'Runde'. DAS ist dein
8
  Rundenzähler - diese Variable.
9
10
  writeTo7Seg( Runde );    // und hier, ganz zum Schluss wird dann dieser
11
                           // Wert, egal wie er jetzt ist, ausgegeben.
12
                           // Die Funktion writeToSeg weiß, wie das geht
13
}
14
15
void writeTo7Seg( uint8_t Ziffer )
16
{
17
  if( Ziffer == 0 )
18
  {
19
    ...
20
  }
21
  else if( Ziffer == 1 )
22
  {
23
    ...
24
  }
25
  ....
26
}

wenn du dann in deinem C++ Buch (oder C Buch) ein wenig geschmökert und 
gelernt hast, dann wird dir auch eine Möglichkeit einfallen, wie du zb 
mit Arrays dir die ganze Sache der Ausgabe auf die Anzeige massiv 
vereinfachen kannst.
Aber erst mal ist wichtig, dass du den Anzeigeteil aus der loop soweit 
raushältst, dass du dich dort Codemässig nur noch um die Manipulation 
der Variable 'Runde' kümmerst und nicht aufgrund der Codelänge den 
Überblick verlierst, wie deine Logik eigentlich aussieht.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Und bitte
1
      if (Runde==8)
2
      {
3
      digitalWrite(a,0);
4
      digitalWrite(b,0);
5
      digitalWrite(c,0);
6
      digitalWrite(d,0);
7
      digitalWrite(e,0);
8
      digitalWrite(f,0);
9
      digitalWrite(g,0);
10
      }
11
      
12
      if (Runde==9)
13
...

wenn Runde den Wert 8 hat, dann KANN sie nicht den Wert 9 haben. Es ist 
völlig sinnlos das noch zu testen. Es ist schlicht und ergreifend nicht 
möglich.
1
  if( Runde == 0 )
2
  {
3
     ....
4
  }
5
6
  else if( Runde == 1 )
7
  {
8
    ....
9
  }
10
11
  else if( Runde == 2 )
12
  {
13
    ...
14
  }
15
...

oder einfacher
1
  switch( Runde )
2
  {
3
    case 0:
4
      .....
5
      break;
6
7
    case 1:
8
      .....
9
      break;
10
11
    case 2:
12
      .....
13
      break;
14
15
    default:
16
      ....
17
  }

konsultiere bitte dein C++ (oder C) Buch, welche Möglichkeiten die 
einfachen Basisdinge der Sprache dir bieten. Es gibt Grundlagen die 
müssen einfach sitzen, ehe man das erste mal was 'richtiges' 
programmiert. Wenn man von der Programmiersprache die man benutzt noch 
nicht einmal 10% des Sprachumfangs kennt, dann ist man blutigster 
Anfänger und sollte tunlichst noch ein paar Übungen durchspielen, ehe 
man sich in die reale Welt rauswagt.

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

sagt sich so einfach nimm den,
ich hab jetzt schon mit dem angefangen!

Danke Karl Heinz, für die Info

dann mach ich einen neuen Tap auf und speicher dann meine Zahlen dort 
rein und schreib dann meine Logik weiter.

Aber eigentlich müsste ich doch jetzt nur in dem Prommgrann 
reinschreiben.

 wenn die Reset taster gedrückt dann fange wieder an von vorne oder?

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:
> sagt sich so einfach nimm den,
> ich hab jetzt schon mit dem angefangen!
>
> Danke Karl Heinz, für die Info
>
> dann mach ich einen neuen Tap

Hä?
Was ist ein Tap?

> Aber eigentlich müsste ich doch jetzt nur in dem Prommgrann
> reinschreiben.

Was ist so schwer an
1
...
2
void setup()
3
{
4
  ...
5
}
6
7
void loop()
8
{
9
  ...
10
}
11
12
void writeTo7Seg( uint8_t wert )
13
{
14
  ...
15
}

alles in einem 'Sketch'.

Es geht nur darum, dass du deine Funktion loop() ein wenig kürzer 
kriegst, damit du sie wieder überblicken kannst (und damit du in loop() 
auch nicht unmotiviert an irgendwelchen 7-Seg LEitungen rumfummelst, 
obwohl du das dort gar nicht tun darfst)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> wenn die Reset taster gedrückt dann fange wieder an von vorne oder?

wenn der Reset Taster gedrückt wird, dann wird der Zähler auf 0 gesetzt. 
Das ist es ja wohl, worauf es hinaus läuft, wenn du 'vor vorne anfangen' 
sagst. Oder?

Ergo
1
....
2
  if( digitalRead(reset) )
3
    Runde = 0;
4
....

fertig.

In einem Programm haben Variablen durchaus eine Bedeutung, eine 
Funktion.
In deinem Programm IST die Variable 'Runde' der Rundenzähler. Sie 
repräsentiert die gezählten Runden. Wenn du also deine Runden 
manipulierst, dann geschieht das, indem du die gwünschte Operation auf 
DIESE Variable anwendest.

Der Rest, die Sache mit der 7_seg - das ist nur die ANzeige. Das 
Sichtbarmachen des programminternen Rundenzählers. Hier in deinem 
Programm
1
      if (resetdruecken == LOW)
2
      
3
       
4
      {
5
     
6
      digitalWrite(a,0);
7
      digitalWrite(b,0);
8
      digitalWrite(c,0);
9
      digitalWrite(d,0);
10
      digitalWrite(e,0);
11
      digitalWrite(f,0);
12
      digitalWrite(g,1);
13
      }
hast du das nicht berücksichtigt. Du hast zu kurz gedacht und deine 
7-Segment Anzeige mit dem Rundenzähler verwechselt. Du bist nach dem 
gegangen, was du siehst. Aber das ist Quatsch. Denn die 7_Seg Anzeige 
ist ja nicht dein Rundenzähler. Die ist nur ANzeigeelement. Der 
eigentliche Rundenzähler ist die Variable 'Runde'. Die wird manipuliert. 
Und natürlich irgendwann zur Anzeige gebracht. Aber der Vorgang des 
Anzeigens hat ja nichts mit dem Zählern von Runden bzw. der Verwaltung 
dieser Zählung zu tun. Das ist nur eine Anzeige und nicht mehr.

von Edgar F. (edgarfalke)


Lesenswert?

Hallo Biede,

ich bin Modellbahner und habe das gleiche Problem.
Runden zählen und gleichzeitig die Geschwindigkeit zu ermitteln, um die 
Geschwindikkeiten der Loks ein zu justieren.
Dein Aufwand mit einem µC ist viel zu aufwendig.

Ein Logikbaustein CD 4017 tut es genauso, mit viel weniger Aufwand.
Dieser ist ein Dezimalzähler nut 10 decodierten Ausgängen, der auch noch 
kaskadieren kann.
Triggern kannst Du ihn mit einem Impuls von einem Reedkontakt oder einer 
Lichtscharanke.
An den 10 Ausgängen hängst Du entweder ein 10-fach LED-Array oder einen 
LCD-Dekoder zur Anzeige.
Das ganze hat den Vortei, das es viel weniger kostet als ein µC-Modul 
und auch sehr viel schneller realisiert ist.

Grüße
Edgar

von biede1987 (Gast)


Lesenswert?

Stimmt du hattest recht, eigentlich ganz klar, ich muss ja meine Runde 
auf 0 zurücksetzen und nicht die 7 Segementanzeige. oh man danke

ich schreib aber nicht Runde = 0 sonder -1
damit die 7 Segmentanzeige 0 anzeigt und Sie schaltet nur wenn ich dann 
die Lichtschranke betätige. normaler weise muss doch dann die Anzeige 
sofort 0 Anzeigen wenn ich den Reset-Taster drücke, liegt das an
1
runde++
2
3
resetdruecken = digitalRead(reset);  
4
      if (resetdruecken == LOW)
5
      
6
      {Runde =-1;
7
       
8
      }
9
      
10
      
11
          Lichtschrankeunterbrochen = digitalRead(Lichtschranke);
12
              if (Lichtschrankeunterbrochen != letzteRunde) { // Der Zustand des Schalters hat sich verändert 
13
14
                  if (Lichtschrankeunterbrochen == HIGH) { // Ist der Schalter gedrückt? 
15
16
                      Runde++; // Inkrementieren der Variablen Runde

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

Danke Edagar für die Antwort, ich übe gerade mit einer 7 Segement 
anzeige und will danach vier ansteuern, deswegen mach ich es so.

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:
> Stimmt du hattest recht, eigentlich ganz klar, ich muss ja meine Runde
> auf 0 zurücksetzen und nicht die 7 Segementanzeige. oh man danke
>
> ich schreib aber nicht Runde = 0 sonder -1
> damit die 7 Segmentanzeige 0 anzeigt und Sie schaltet nur wenn ich dann
> die Lichtschranke betätige. normaler weise muss doch dann die Anzeige
> sofort 0 Anzeigen wenn ich den Reset-Taster drücke, liegt das an


Was hast du sonst noch geändert?

Hast du dein Programm so umgeändert, wie ich es vorgeschlagen habe?
1
void loop() 
2
{ 
3
  if (digitalRead(reset) == LOW)
4
    Runde = 0;
5
6
  Lichtschrankeunterbrochen = digitalRead(Lichtschranke);
7
  if (Lichtschrankeunterbrochen != letzteRunde) { // Der Zustand des Schalters hat sich verändert 
8
9
    if (Lichtschrankeunterbrochen == HIGH) { // Ist der Schalter gedrückt? 
10
      Runde++; // Inkrementieren der Variablen Runde 
11
12
      Serial.print("Wir sind jetzt in der ");
13
      Serial.print(Runde);
14
      Serial.println(" Runde");
15
    }
16
17
    letzteRunde = Lichtschrankeunterbrochen;
18
  }
19
20
  writeTo7Seg( Runde );
21
}
22
23
void writeTo7Seg( uint8_t wert )
24
{
25
  if( wert == 0 )
26
  {
27
      digitalWrite(a,0);
28
      digitalWrite(b,0);
29
      digitalWrite(c,0);
30
      digitalWrite(d,0);
31
      digitalWrite(e,0);
32
      digitalWrite(f,0);
33
      digitalWrite(g,1);
34
  }
35
36
  else if( wert == 1 )
37
  {
38
      digitalWrite(a,1);
39
      digitalWrite(b,0);
40
      digitalWrite(c,0);
41
      digitalWrite(d,1);
42
      digitalWrite(e,1);
43
      digitalWrite(f,1);
44
      digitalWrite(g,1);
45
  }
46
47
  else if( wert == 2 )
48
  {
49
    ...
50
  }
51
  ...
52
}

Tu das bitte.
Denn jetzt können wir in loop() auch ohne seitenlanges Hin und Her 
scrollen überblicken, dass nach der Erkennung des Reset-Tasters (und dem 
damit verbundenen Rücksetzen von Runde auf 0) ganz zum Schluss die 
Ausgabe von Runde auf die Anzeige erfolgt.
Denn natürlich reicht das ja nicht, den Rundenzähler auf 0 zu setzen. Du 
willst das ja auch auf der Anzeige irgendwann mal sehen. Dazu muss aber 
die Ausgabe mal gemacht werden. Ein Aufruf der Funktion writeTo7Seg mit 
dem jeweils gültigen Wert von Runde leistet genau das.
Wird also der Reset Taster gedrückt vorgefunden dann wird Runde auf 0 
gesetzt und als Abschluss in loop() wird auf jeden Fall der Wert von 
Runde auf der Anzeige ausgegeben. loop() ist kurz genug, dass man das 
problemlos erkennen kann. .....
.... In der jetzigen Version (mit Auslagerung des Anzeigecodes in eine 
eigene Funktion). In der alten Version mit haufenweise Code in loop() 
hast du den Überblick verloren, was wo passiert. DIe Lehre die du daraus 
ziehen solltest: Es ist nicht egal, ob man sich eine Codewurscht 
hinschmiert oder nicht. Denn in dem einen Fall reichen deine Fähigkeiten 
den Code zu überblicken nicht aus. Im anderen Fall aber schon. Es ist 
beide male der gleiche Code. Nur anders organsiert. Nämlich so, dass 
deine Fähigkeiten reichen, mit dem Code zu arbeiten.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Du könntest ja zb auch sagen:
solange der Reset-Taster gedrückt ist, interessiert es mich gar nicht, 
was an der Lichtschranke vor sich geht
1
void loop() 
2
{ 
3
  if (digitalRead(reset) == LOW)
4
    Runde = 0;
5
6
  else {
7
    Lichtschrankeunterbrochen = digitalRead(Lichtschranke);
8
    if (Lichtschrankeunterbrochen != letzteRunde) { // Der Zustand des Schalters hat sich verändert 
9
10
      if (Lichtschrankeunterbrochen == HIGH) { // Ist der Schalter gedrückt? 
11
        Runde++; // Inkrementieren der Variablen Runde 
12
13
        Serial.print("Wir sind jetzt in der ");
14
        Serial.print(Runde);
15
        Serial.println(" Runde");
16
      }
17
18
      letzteRunde = Lichtschrankeunterbrochen;
19
    }
20
  }
21
22
  writeTo7Seg( Runde );
23
}

von biede1987 (Gast)


Lesenswert?

ok ich habs jetzt umgeschrieben vielen dank, funktioniert
1
 // Lichtschranke ist ein Taster und alle Segmente werden angesteuert, es wird gezaehlt von 1-9 Resettaster setzt zurueck auf 0
2
3
      int Lichtschranke = 11; // oder Taster
4
      int Lichtschrankeunterbrochen; // Variable für den Pin Zustand 
5
      int letzteRunde; // Variable für den letzten Schalterzustand letzte Runde
6
      int Runde = 0; // Wie oft ist der Schalter gedrückt   
7
    
8
      int reset = 12;
9
      int resetdruecken;
10
      //int resetgedrueckt;
11
12
      int a = 2; // a
13
      int b = 3;
14
      int c = 4;
15
      int d = 5;
16
      int e = 6;
17
      int f = 7;
18
      int g = 8;
19
20
21
22
    void setup(){
23
 
24
      Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
25
      pinMode(Lichtschranke,INPUT);
26
      pinMode(reset,INPUT);
27
      pinMode(a,OUTPUT);
28
      pinMode(b,OUTPUT);
29
      pinMode(c,OUTPUT);
30
      pinMode(d,OUTPUT);
31
      pinMode(e,OUTPUT);
32
      pinMode(f,OUTPUT);
33
      pinMode(g,OUTPUT);
34
  
35
       letzteRunde = digitalRead(Lichtschranke); // Anfangszustand lesen
36
       resetdruecken = digitalRead(reset); // Anfangszustand lesen
37
        
38
      }
39
  
40
  void loop() 
41
   
42
   { 
43
  if (digitalRead(reset) == LOW)
44
    Runde = 0;
45
46
  Lichtschrankeunterbrochen = digitalRead(Lichtschranke);
47
  if (Lichtschrankeunterbrochen != letzteRunde) { // Der Zustand des Schalters hat sich verändert 
48
49
    if (Lichtschrankeunterbrochen == HIGH) { // Ist der Schalter gedrückt? 
50
      Runde++; // Inkrementieren der Variablen Runde 
51
52
      Serial.print("Wir sind jetzt in der ");
53
      Serial.print(Runde);
54
      Serial.println(" Runde");
55
    }
56
57
    letzteRunde = Lichtschrankeunterbrochen;
58
  }
59
60
  writeTo7Seg( Runde );
61
}
62
63
void writeTo7Seg( uint8_t wert )
64
{
65
  if( wert == 0 )
66
  {
67
      digitalWrite(a,0);
68
      digitalWrite(b,0);
69
      digitalWrite(c,0);
70
      digitalWrite(d,0);
71
      digitalWrite(e,0);
72
      digitalWrite(f,0);
73
      digitalWrite(g,1);
74
  }
75
76
  else if( wert == 1 )
77
  {
78
      digitalWrite(a,1);
79
      digitalWrite(b,0);
80
      digitalWrite(c,0);
81
      digitalWrite(d,1);
82
      digitalWrite(e,1);
83
      digitalWrite(f,1);
84
      digitalWrite(g,1);
85
  }
86
87
  else if( wert == 2 )
88
  {
89
    digitalWrite(a,0);
90
      digitalWrite(b,0);
91
      digitalWrite(c,1);
92
      digitalWrite(d,0);
93
      digitalWrite(e,0);
94
      digitalWrite(f,1);
95
      digitalWrite(g,0);
96
  }
97
 else if( wert == 3 )
98
  {
99
      digitalWrite(a,0);
100
      digitalWrite(b,0);
101
      digitalWrite(c,0);
102
      digitalWrite(d,0);
103
      digitalWrite(e,1);
104
      digitalWrite(f,1);
105
      digitalWrite(g,0);
106
  }
107
  else if( wert == 4 )
108
  {
109
      digitalWrite(a,1);
110
      digitalWrite(b,0);
111
      digitalWrite(c,0);
112
      digitalWrite(d,1);
113
      digitalWrite(e,1);
114
      digitalWrite(f,0);
115
      digitalWrite(g,0);
116
  }
117
  else if( wert == 5 )
118
  {
119
      digitalWrite(a,0);
120
      digitalWrite(b,1);
121
      digitalWrite(c,0);
122
      digitalWrite(d,0);
123
      digitalWrite(e,1);
124
      digitalWrite(f,0);
125
      digitalWrite(g,0);
126
  }
127
  else if( wert == 6 )
128
  {
129
      digitalWrite(a,0);
130
      digitalWrite(b,1);
131
      digitalWrite(c,0);
132
      digitalWrite(d,0);
133
      digitalWrite(e,0);
134
      digitalWrite(f,0);
135
      digitalWrite(g,0);
136
  }
137
  else if( wert == 7 )
138
  {
139
      digitalWrite(a,0);
140
      digitalWrite(b,0);
141
      digitalWrite(c,0);
142
      digitalWrite(d,1);
143
      digitalWrite(e,1);
144
      digitalWrite(f,1);
145
      digitalWrite(g,1);
146
  }
147
  else if( wert == 8 )
148
  {
149
      digitalWrite(a,0);
150
      digitalWrite(b,0);
151
      digitalWrite(c,0);
152
      digitalWrite(d,0);
153
      digitalWrite(e,0);
154
      digitalWrite(f,0);
155
      digitalWrite(g,0);
156
  }
157
  else if( wert == 9 )
158
  {
159
      digitalWrite(a,0);
160
      digitalWrite(b,0);
161
      digitalWrite(c,0);
162
      digitalWrite(d,0);
163
      digitalWrite(e,1);
164
      digitalWrite(f,0);
165
      digitalWrite(g,0);
166
  }
167
}

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:
> ok ich habs jetzt umgeschrieben

Gut.
Du solltest alten Hasen ruhig etwas glauben, wenn sie Dinge ansprechen, 
die du für unnötig hältst.
Genauso wie dir die alten Hasen sagen werden, dass eine konsistente und 
saubere Code-Einrückung nicht einfach nur Selbstzweck ist, sondern 
durchaus ein Instrument um Code und Logikfehler zu finden bzw. gar nicht 
erst aufkommen zu lassen.

Es ist (auf lange Sicht) eben nicht egal, ob ....
1
...
2
  else if( wert == 2 )
3
  {
4
    digitalWrite(a,0);
5
      digitalWrite(b,0);
6
      digitalWrite(c,1);
7
      digitalWrite(d,0);
8
      digitalWrite(e,0);
9
      digitalWrite(f,1);
10
      digitalWrite(g,0);
11
  }
12
 else if( wert == 3 )
13
  {
das eine else nicht unter dem anderen steht, das eine abhängige 
digitalWrite um 4 Zeichen eingerückt ist und die anderen um 6. Ob du 
einmal die KLammern so anordnest
1
  if( ... ) {
2
    ...
3
  }
und das andere mal so
1
  if( ... )
2
  {
3
    ...
4
  }

Ob es dir egal ist, dass die schliessende } einer Funktion wieder am 
linken Rand steht, oder so wie hier
1
    void setup(){
2
 
3
      Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
4
      pinMode(Lichtschranke,INPUT);
5
      pinMode(reset,INPUT);
6
      pinMode(a,OUTPUT);
7
      pinMode(b,OUTPUT);
8
      pinMode(c,OUTPUT);
9
      pinMode(d,OUTPUT);
10
      pinMode(e,OUTPUT);
11
      pinMode(f,OUTPUT);
12
      pinMode(g,OUTPUT);
13
  
14
       letzteRunde = digitalRead(Lichtschranke); // Anfangszustand lesen
15
       resetdruecken = digitalRead(reset); // Anfangszustand lesen
16
        
17
      }
nicht.

Das alles sind rein formale Dinge. Aber ... sie haben einen Einfluss ob 
ein Code leicht zu lesen ist, oder ob man zur Fehlersuche erst mal am 
liebsten den Code reformatiert um die falsch gesetzten oder fehlenden 
{-} Klammern zu finden.

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

ja stimmt schon was du sagst, jetzt ist viel übersichtlichter danke 
nochmal

von Klaus I. (klauspi)


Lesenswert?

biede1987 schrieb:
> sagt sich so einfach nimm den,
> ich hab jetzt schon mit dem angefangen!

Das ist ein Grund, aber kein Hindernis ;o)

Sorry, ich wollte Dir den Spaß an der lehrreichen Eigenentwicklung nicht 
nehmen. Der olle 4026 macht halt genau das: Bis Zehn zählen, evtl. Reset 
und hat gleich die Ausgänge speziell für Siebensegment-Anzeigen. Im 
Prinzip macht er genau das was Du im ersten Post umrissen hast. Evtl. 
müsste man noch eine Entprellung hinzufügen z.B. 555 monostabil.

Wenn bei Deinem Mikrocontroller mal die Pins knapp werden, kannst Du das 
vielleicht kombinieren.

Auf jeden Fall noch viel Spaß und Erfolg bei Deinem Projekt!
Klaus

von biede1987 (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend nochmal,

ich möchte jetzt als nächste 4 / Segmentanzeigen mit meinem Arduino 
ansteuern. Jeweils  2 Anzeigen nutzen um die Runden von 0 bis 99 zu 
zählen.

Ich habe als Eingänge 2 Lichtschranke die auch schon funktionieren und 
als Ausgang hab ich diese 7 Segment anzeige.

http://www.ebay.de/itm/Rot-0-56-7-Segment-4-Digit-Super-LED-Display-Common-Anode-Time-12-pins-Anzeige-/400580687232?pt=Bauteile&hash=item5d44783580


Als Mikrokontroller hab ich mir den Arduino Mega gekauft.

Beigefügt hab ich mal mein Blockschaltbild.

was meint ihr ?

ich denke das Programm von oben, mit der Logik kann ich bei meienm neuen 
anwenden?

von Karl H. (kbuchegg)


Lesenswert?

Ich denke, du solltest jetzt den nächsten Schrittt machen und deine 
Ansteuerung der 7-Segment Anzeigen auf Multiplexbetrieb umstellen.

von biede1987 (Gast)


Lesenswert?

ok dann versuchs jetzt mit dem arduinon mega und der 4x 7 
Segmentnanzeige.

von biede1987 (Gast)


Lesenswert?

Hallo nochmal, ich hab jetzt mein 4/ 7 Segmentanzeigen angeschlossen!

http://www.ebay.de/itm/Rot-0-56-7-Segment-4-Digit-Super-LED-Display-Common-Anode-Time-12-pins-Anzeige-/400580687232?pt=Bauteile&hash=item5d44783580

Das Programm von oben hab ich auf meinen Arduino Mega aufgespielt, der 
Zähler funktionier auf der ersten Anzeige.

Wie kann ich jetzt programmieren das er nicht nur von 1 bi 9 zählt, 
sondern von 1 - 99! So dass ich die zweite auch ansteuer!

Es ist nämlich so wenn ich dann meine 2 Ausgänge, dig 1 und 2 ansteuer 
wird eine 11 , 22 usw. weiter angesteuert.

Würde es was bringen wenn ich mit einer libary arbeite?

Danke für die Anworten schonmal!

Gruß biede

von biede1987 (Gast)


Lesenswert?

http://www.instructables.com/files/orig/FDF/W8AY/G1BBDO34/FDFW8AYG1BBDO34.txt

könnte mir dieses Programm helfen? So könnte ich doch meine Zahlen 
darstelln oder?

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:

> Wie kann ich jetzt programmieren das er nicht nur von 1 bi 9 zählt,
> sondern von 1 - 99!

Das ist die falsche Frage.
Die richtige Frage lautet: wie steuere ich mehrere 7-Segment Anzeigen im 
Multiplexverfahren an?

Denn dein Zähler für die Runden ist eine ganze normale uint8_t 
Variablre, die bis 255 zählen kann. Das ist aber losgelöst von der 
Fragestellung, wie man auf mehreren 7_Segment Anzeigen ausgibt. Der Weg 
dorthin führt über die Erkentniss, dass man mehrstellige Anzeigen so 
ansteuert, dass immer nur eine der Anzeigen angesteuert wird und kurz 
drauf die nächste. Wenn das schnell genug gemacht wird, dann kommt dein 
Auge bzw. Gehirn nicht mehr mit, dass du immer nur eine Anzeige 
leuchtet. Voila: du siehst beide gleichzeitig leuchten (natürlich mit 
anderem Inhalt)

> Würde es was bringen wenn ich mit einer libary arbeite?

Es würde was bringen, wenn du die Grundlagen lernen würdest.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:
> http://www.instructables.com/files/orig/FDF/W8AY/G1BBDO34/FDFW8AYG1BBDO34.txt
>
> könnte mir dieses Programm helfen? So könnte ich doch meine Zahlen
> darstelln oder?

Das Programm ist Müll.
Selbst für einen Ardino ist das Müll.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

> Denn dein Zähler für die Runden ist eine ganze normale uint8_t
> Variablre, die bis 255 zählen kann. Das ist aber losgelöst von der
> Fragestellung, wie man auf mehreren 7_Segment Anzeigen ausgibt. Der Weg
> dorthin führt über die Erkentniss, dass man mehrstellige Anzeigen so
> ansteuert, dass immer nur eine der Anzeigen angesteuert wird und kurz
> drauf die nächste. Wenn das schnell genug gemacht wird, dann kommt dein
> Auge bzw. Gehirn nicht mehr mit, dass du immer nur eine Anzeige
> leuchtet. Voila: du siehst beide gleichzeitig leuchten (natürlich mit
> anderem Inhalt)

Die einfachst mögliche Version (wenn auch nicht die schönste oder beste 
oder einfach auch nur die Version wie man das normalerweise macht), 
könnte zb so aussehen
1
uint8_t Stelle;
2
3
void loop() 
4
{ 
5
  ...
6
7
8
  // ... alle Anzeigen abschalten
9
  ....
10
  // ... welches ist die nächste Stelle?
11
  Stelle++;
12
  if( Stelle == 1 )   // momentan sind es nur 2 Stellen
13
    Stelle = 0;
14
15
  // ... die jeweiligen Ausgangstreiber befüllen
16
  if( Stelle == 0 )
17
    writeTo7Seg( Runde % 10 );
18
  else if( Stelle == 1 )
19
    writeTo7Seg( Runde / 10 );
20
21
  // ... und die betreffende Anzeige einschalten
22
  if( Stelle == 0 )
23
    ....
24
  else if( Stelle == 1 )
25
    ....
26
}

Schön ist das nicht gerade. Normalerweise macht man so einen Multiplex 
mit einem Timer, der laufend und unabhähngig vom restlichen Programm die 
Bitmuster für die einzelnen Stellen jeweils reihum an den einzelnen 
Anzeigen ausgibt. Aber ich fürchte, das kriegst du noch nicht hin. D.h. 
dein nächstes Ziel lautet: den Umgang mit einem Timer lernen.

von biede1987 (Gast)


Lesenswert?

Danke für die Antworten

das programm was ich gefunden hab ist müll weil es viel zu lang wird 
oder?

das was du geschrieben hast arbeitet mit der 7 Seg libary?

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:
> Danke für die Antworten
>
> das programm was ich gefunden hab ist müll weil es viel zu lang wird
> oder?

Das Programm ist deswegen Müll, weil derjenige der es geschrieben hat, 
selber nicht programmieren kann. Es ist auf genau dieselbe Art Müll, wie 
wenn ein Grundschüler im zweiten Jahr, der gerade mal im Zahlenraum bis 
100 addieren kann, dein Grundstück vermisst. Aus seiner Sicht mag es ihm 
nicht schlecht vorkommen, aber objektiv gesehen ist es der Versuch mit 
einem Sandkastenschäufelchen eine Baugrube auszuheben.

Du kannst es drehen und wenden wie du willst: Ehe man ein größeres 
Programm schreiben kann, muss man erst mal die Grundlagen lernen. Wenn 
man von seiner Programmiersprache noch nicht mal 10% des Umfangs 
beherrscht, dann hat das alles keinen Sinn.

: Bearbeitet durch User
von Jürgen S. (jurs)


Lesenswert?

biede1987 schrieb:
> http://www.instructables.com/files/orig/FDF/W8AY/G1BBDO34/FDFW8AYG1BBDO34.txt
>
> könnte mir dieses Programm helfen? So könnte ich doch meine Zahlen
> darstelln oder?

Falls Du ein fertiges und alternatives Programm suchst, das auch mit 
anderer Hardware (aber auch mit Arduino!) arbeiten darf, hätte ich da 
was in der Schublade liegen.

Für:
- Arduino UNO oder kompatibles Board
- Anzeige: LCD-Keypad-Shield zum Aufstecken auf den Arduino
- Sensoren: Ein Reedkontakt pro Fahrspur unter der Fahrbahn montiert

Sag Bescheid, ob den fertigen Sketch für LCD-Keypad-Shield mal posten 
soll!

von biede1987 (Gast)


Lesenswert?

Ja das wäre toll wenn du das mal posten kannst, ich versuchs mal 
trotzdem mit den 7 Segemnetanzeigen!

Danke

von Kai S. (kai1986)


Lesenswert?

Hallo,

das Ansteueren bzw. Multiplexen von 7-Segmentanzeigen ist hier ganz gut 
beschrieben.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige

Das Codebeispiel ist zwar in ASM, ist aber nicht wichtig, da du egal mit 
welcher Sprache immer das gleiche machen musst, um das Display 
anzusteueren.

Zum Umwandeln der Rundenzahl aus der Variable in ein anzeigetaugliches 
Format findest du hier noch einige Informationen.
http://www.mikrocontroller.net/articles/AVR_Arithmetik#Bin.C3.A4r_zu_BCD_-_Umwandlung

Gruß Kai

von Jürgen S. (jurs)


Lesenswert?

biede1987 schrieb:
> Ja das wäre toll wenn du das mal posten kannst, ich versuchs mal
> trotzdem mit den 7 Segemnetanzeigen!

Das dürfte allerdings um einiges komplizierter werden als nur die 
Umstellung auf die Verwendung Deiner Lichtschranken als Sensor zur 
Erkennung, wann ein Fahrzeug die Ziellinie überquert.

Das hier habe ich mal für einen Bekannten gemacht, der mit seinem Enkel 
auf einer Carrera-Bahn Rennen ausfährt, wenn der mal zu Besuch ist:
1
/* 
2
   Slotcar timing by "jurs" for mikrocontroller.net forum
3
   Hardware required: Arduino UNO, LCD keypad shield, 2 reed contacts
4
*/
5
#include <LiquidCrystal.h>
6
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD keypad shield (i.e. Sainsmart)
7
8
#define LEDPIN 13
9
#define SLOTS 2
10
// Mindestrundenzeit in Millisekunden, alles darunter als Kontaktprellen interpretieren
11
#define MINROUNDTIME 500
12
// Pins zum Anschluss der Reedkontakte (D2, D3)
13
byte reedPins[]={2,3};
14
// Interrupt-Nummern zu diesen Pins
15
byte pinInterrupts[]={0,1};
16
// Interrupt-Behandlungsroutinen
17
void (*isrFunctions[])() = { timing1, timing2 };
18
19
// Start der letzten Runde in Millisekunden, volatile weil Zugriff auch aus ISR!
20
volatile long rundenAnfang[]={0,0};
21
// Rundenzeit der letzten Runde in Millisekunden
22
long rundenZeit[]={99990,99990};
23
// Rundenzeit der schnellsten Runde in Millisekunden
24
long rundenZeitRekord[]={99990,99990};
25
// Rundenzähler
26
int rundenAnzahl[]={0,0};
27
28
29
void setup() {
30
  // LCD Anzeige mit Spalten und Zeilen initialisieren
31
  lcd.begin(16, 2);
32
  // Anzeige LED-13 auf dem Board initialisieren
33
  pinMode(LEDPIN,OUTPUT);
34
  // Reedkontakte und ISR Routinen initialisieren
35
  for (int i=0;i<SLOTS;i++)
36
  {
37
    pinMode(reedPins[i],INPUT_PULLUP);
38
    attachInterrupt(pinInterrupts[i], isrFunctions[i], FALLING);
39
  }  
40
}
41
42
void timing1()
43
{
44
  if (millis()-rundenAnfang[0]>MINROUNDTIME)
45
    rundenAnfang[0]=millis();
46
}
47
48
void timing2()
49
{
50
  if (millis()-rundenAnfang[1]>MINROUNDTIME)
51
    rundenAnfang[1]=millis();
52
}
53
54
void RundenzeitenVerarbeiten()
55
{
56
  // Start der vorletzten Runde in Millisekunden
57
  static long rundenAnfangVerarbeitet[]={0,0};
58
  long curMillis;
59
  // Aktuellen Stand der millis() Funktion merken
60
  curMillis=millis();
61
  // Alle Slots auf Veränderungen der Rundenstartzeit abklappern
62
  for (int i=0;i<SLOTS;i++)
63
  { 
64
    if  (rundenAnfangVerarbeitet[i]!=rundenAnfang[i])
65
    { // Neue Runde seit dem letzten Loopdurchlauf
66
      rundenAnzahl[i]++; // Rundenzähler hochzählen
67
      // Rundenzeit ermitteln
68
      rundenZeit[i]=rundenAnfang[i]-rundenAnfangVerarbeitet[i];
69
      // Feststellen ob es eine schnellste Runde war
70
      if (rundenZeit[i]<rundenZeitRekord[i])
71
        rundenZeitRekord[i]=rundenZeit[i];
72
      // Am Ende diese Rundenzeit als verarbeitet merken  
73
      rundenAnfangVerarbeitet[i]=rundenAnfang[i];
74
    }
75
  }
76
}
77
78
void RundenanzahlAnzeigen()
79
{ static long lastUpdate;
80
  char lcdline[17];
81
  // Anzeige nur alle 500 ms aktualisieren
82
  if (millis()/500==lastUpdate) return;
83
  lastUpdate=millis()/500; 
84
  for (int i=0;i<SLOTS;i++)
85
  {
86
    snprintf(lcdline,sizeof(lcdline),"%d %5d Runden  ",i+1,rundenAnzahl[i]);
87
    lcd.setCursor(0,i);
88
    lcd.print(lcdline);
89
  }  
90
}
91
92
void RundenzeitenAnzeigen()
93
{ static long lastUpdate;
94
  long dieseRunde, dieserRekord;
95
  char lcdline[17];
96
  int zeit[4];
97
  // Anzeige nur alle 500 ms aktualisieren
98
  if (millis()/500==lastUpdate) return;
99
  lastUpdate=millis()/500; 
100
  for (int i=0;i<SLOTS;i++)
101
  {
102
    // Rundenzeit und schnellste Zeit auf Zeitangabe in hundertstel runden
103
    dieseRunde=(rundenZeit[i]+5)/10;
104
    dieserRekord=(rundenZeitRekord[i]+5)/10;
105
    zeit[0]=dieseRunde/100; // ganze Sekunden
106
    zeit[1]=dieseRunde%100; // hundertstel Sekunden
107
    zeit[2]=dieserRekord/100;  // ganze Sekunden
108
    zeit[3]=dieserRekord%100; // hundertstel Sekunden
109
    snprintf(lcdline,sizeof(lcdline),"%d%3d:%02d SR%3d:%02d",i+1,zeit[0],zeit[1],zeit[2],zeit[3]);
110
    lcd.setCursor(0,i);
111
    lcd.print(lcdline);
112
  }  
113
}
114
115
void loop()
116
{
117
  RundenzeitenVerarbeiten();
118
  if ((millis()/2000)%2==1)
119
    RundenzeitenAnzeigen();
120
  else 
121
    RundenanzahlAnzeigen();  
122
  // Nun noch die Pin-13 LED ein wenig blinken lassen, wenn man möchte  
123
  if (millis()-rundenAnfang[0]<200 || millis()-rundenAnfang[1]<200)
124
    digitalWrite(LEDPIN,HIGH);
125
  else  
126
    digitalWrite(LEDPIN,LOW);  
127
}

Dieser Sketch ist so wie gepostet für die Erfassung von zwei Fahrzeugen 
vorgesehen. Eine Erweiterung auf mehr Fahrzeuge (4 bis 6) wäre am 
einfachsten möglich, indem man ein Board mit mehr als zwei 
Hardware-Interrupts verwendet (z.B. "Arduino-MEGA").

Die Sensoren müssen an einem UNO-kompatiblen Board an den beiden Pins 
angeschlossen werden, die Hardware-Interrupts erzeugen können, das sind 
D2 und D3. Für die Auswertung der Reedkontakte werden die internen 
PullUp-Widerstände in dieser Zeile aktiviert:
 pinMode(reedPins[i],INPUT_PULLUP);
Wenn Deine Lichtschranken keine PullUps benötigen, dort einfach INPUT 
statt INPUT_PULLUP einsetzen.

Und falls Du etwas an der Anzeige ändern möchtest: Das Programm 
realisiert eine automatische Wechselanzeige, und zwar wird in einem 
Rhythmus von 2 Sekunden umgeschaltet zwischen Anzeigen für 
"Rundenzeiten" und "Rundenanzahl". Als Rundenzeiten werden sowohl die 
Zeiten der letzten gestoppten Runde und die schnellste Rundenzeit "SR" 
pro Fahrzeug angezeigt.

Falls Du die Anzeige ändern möchtest (vielleicht zunächst mal zur 
Ausgabe auf dem Seriellen Monitor), diese Funktionen sind in diesen 
beiden Funktionen zusammengefasst:
void RundenanzahlAnzeigen()
void RundenzeitenAnzeigen()

Rückstellung auf Null und Neustart des Sketches für das nächste Rennen 
einfach durch Drücken des Reset-Buttons, dann startet der Controller 
neu.

Vielleicht findest Du durch den Code, ansonsten kannst Du ja fragen.

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:

> trotzdem mit den 7 Segemnetanzeigen!

LCD wär einfacher. Aber ich sehs wie du: 7-Segment sieht für den Zweck 
einfach cooler aus.

Und? Wirds was?

Wie gesagt: der Trick ist, dass die beiden Anzeigen (bzw. dann 4 in 
weiterer Folge) abwechselnd leuchten. Jede mit ihrer eigenen Ziffer bzw. 
dem jeweils anzuzeigendem LED-Muster.

Da fällt mir noch was ein.
Wenn du an anderen Programmstellen keine exzessiven Delays benutzt, dann 
kann man am Arduino auch mittels 'millis()'
http://arduino.cc/de/Reference/Millis
so was ähnliches machen, zu dem man normalerweise einen Timer einsetzt.



Shit:
Ich hab gerade versucht, dir da mal was zurecht zu machen.
Aber dieses digitalWrite wirft einem da dauerns Prügel zwischen die 
Beine. Mit dem kann man das alles nicht vernünftig machen.

An welchen Portpins hast du deine 7-Segment Anzeige wie angeschlossen? 
Das machen wir direkt am Arduino System vorbei. Das ist in Summe 
einfacher, als sich da am digitalWrite vorbei zu mogeln. Bzw. falls du 
nicht alle 7 Segnentleitungen an einem Port beisammen hast, kannst du 
die noch hardwaremässig umlegen? Denn wenn mehrere Leitungen auf einen 
Schlag gesetzt oder nicht gesetzt werden sollen, dann geht das deutlich 
einfacher als mit dieser if-then-else und digitalWrite Orgie. 
Voraussetzung ist aber, dass alle 7 Segmentleitungen an einem 
physikalischen AVR Port liegen.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Hätt ich eigentlich schon früher machen sollen.
Nein, eigentlich hättest du das schon früher machen sollen.

Warum nimmst du eigentlich nicht das hier?
http://playground.arduino.cc/Main/SevenSegmentLibrary

von biede1987 (Gast)


Lesenswert?

Danke Karl Heinz das du mir so hilfst,

die Libary hab ich mir vorgestern schon runter geladen, deswegen hab ich 
auch gefragt ob man es besser ist mit einer libarty zu arbeiten. Bin da 
aber nicht wirklich weiter gekommen.

von biede1987 (Gast)


Lesenswert?

ich hab hier mal mein Ein und Ausgänge

    // Um die Runden der Fahrzeuge zu zählen, bedarf es einer Abfrage am 
Startzielbogen
    // um dem Mikrocontroller mitzuteilen ob das Fahrzeuge durchgefahren 
ist oder nicht.
    // Die Kontrolle, ob ein Fahrzeug durch den Startzielbogen gefahren 
ist , geschieht durch
    // eine selbst gebaute Infrarot - Lichtschranke, die am Bogen unten 
angebracht ist.
    // Ist die Lichtschranke belegt, dann sendet sie eine 1 an den 
Mikrokontroller, sobald sich
    // nicht belegt ist sendet sie eine 0.  Durch einen Reset Taster 
werden die Runden wieder auf zurückgesetzt


      int Lichtschranke1 = 11; // Taster
      int Lichtschranke2 = 13; // Taster
      int Lichtschrankeunterbrochen1; // Variable für Pin Zustand Bahn 2
      int Lichtschrankeunterbrochen2; // Variable für Pin Zustand Bahn 2
      int letzteRunde1; // Variable für den letzten Schalterzustand 
letzte Runde Bahn1
      int letzteRunde2; // Variable für den letzten Schalterzustand 
letzte Runde Bahn2
      int Runde1 = 0; // Wie oft ist der Schalter gedrückt Bahn 1
      int Runde2 = 0; // Wie oft ist der Schalter gedrückt Bahn 2

      int reset = 12;
      int resetdruecken;   // Variable fuer Reset Taster

      int a = 9;
      int b = 3;
      int c = 4;
      int d = 5;
      int e = 6;
      int f = 7;
      int g = 8;
      int d1 =24;
      int d2 =26;
      int d3 =28;
      int d4 =30;




    void setup(){

      Serial.begin(9600); // Start der seriellen Kommunikation mit 
9600bps
      pinMode(Lichtschranke1,INPUT);
      pinMode(Lichtschranke2,INPUT);
      pinMode(reset,INPUT);
      pinMode(a,OUTPUT);
      pinMode(b,OUTPUT);
      pinMode(c,OUTPUT);
      pinMode(d,OUTPUT);
      pinMode(e,OUTPUT);
      pinMode(f,OUTPUT);
      pinMode(g,OUTPUT);
      pinMode(d1,OUTPUT)
      pinMode(d1,OUTPUT);
      pinMode(d2,OUTPUT);
      pinMode(d3,OUTPUT);
      pinMode(d4,OUTPUT);

von biede1987 (Gast)


Lesenswert?

ich hab dir hier mal meine pin belegung

ich versuchs mal weiter mit der 7seg

Danke

von biede1987 (Gast)


Lesenswert?

Hallo nochmal,

ich hab jetzt mal das Beispiel gemacht, hab meine Ausgänge dem Programm 
angepasst. Die Zeit läuft auch ab!

Aber Warum leuchte die ersten zwei Ziffern heller wie die letzten zwei?

Hab über die gleichen Widerstände verwendet!

von biede1987 (Gast)


Lesenswert?

#include "SevSeg.h"

//Create an instance of the object.
SevSeg sevseg;

//Create global variables
unsigned long timer;
int CentSec=0;

void setup() {
  //I am using a common anode display, with the digit pins connected
  //from 2-5 and the segment pins connected from 6-13
  sevseg.Begin(1,24,26,28,30,9,3,4,5,6,7,8,40);
  //Set the desired brightness (0 to 100);
  sevseg.Brightness(80);

  timer=millis();
}

void loop() {
  //Produce an output on the display
  sevseg.PrintOutput();

  //Check if 10ms has elapsed
  unsigned long mils=millis();
  if (mils-timer>=10) {
    timer=mils;
    CentSec++;
    if (CentSec==10000) { // Reset to 0 after counting for 100 seconds.
      CentSec=0;
    }
    //Update the number to be displayed, with a decimal
    //place in the correct position.
    sevseg.NewNum(CentSec,(byte) 2);
  }
}

von biede1987 (Gast)


Lesenswert?

Hallo nochmal

1
    
2
      #include "SevSeg.h"
3
4
5
      SevSeg sevseg;
6
7
      int Lichtschranke1 = 11; // Taster
8
      int Lichtschranke2 = 13; // Taster
9
      int Lichtschrankeunterbrochen1; // Variable für Pin Zustand Bahn 2
10
      int Lichtschrankeunterbrochen2; // Variable für Pin Zustand Bahn 2
11
      int letzteRunde1; // Variable für den letzten Schalterzustand letzte Runde Bahn1
12
      int letzteRunde2; // Variable für den letzten Schalterzustand letzte Runde Bahn2
13
      int Runde1 = 0; // Wie oft ist der Schalter gedrückt Bahn 1   
14
      int Runde2 = 0; // Wie oft ist der Schalter gedrückt Bahn 1 2
15
    
16
      int reset = 12;
17
      int resetdruecken;   // Variable fuer Reset Taster
18
      
19
      
20
      void setup(){
21
 
22
      Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
23
      pinMode(Lichtschranke1,INPUT);
24
      pinMode(Lichtschranke2,INPUT);
25
      
26
      letzteRunde1 = digitalRead(Lichtschranke1); // Anfangszustand lesen
27
      letzteRunde2 = digitalRead(Lichtschranke1); // Anfangszustand lesen
28
      
29
      resetdruecken =digitalRead(reset); // Anfangszustand lesen
30
      
31
      sevseg.Begin(1,24,26,28,30,9,3,4,5,6,7,8,32);
32
        //Set the desired brightness (0 to 100);
33
      sevseg.Brightness(90);
34
          
35
      }
36
      
37
       void loop()  { 
38
         
39
          sevseg.PrintOutput();
40
          
41
          
42
          if (digitalRead(reset) == HIGH)
43
               Runde1 = 0;
44
45
              Lichtschrankeunterbrochen1 = digitalRead(Lichtschranke1);
46
            if (Lichtschrankeunterbrochen1 != letzteRunde1) { // Der Zustand des Schalters hat sich verändert 
47
48
    if (Lichtschrankeunterbrochen1 == HIGH) { // Ist der Schalter gedrückt? 
49
      Runde1++; // Inkrementieren der Variablen Runde 
50
51
      Serial.print("Wir sind jetzt in der ");
52
      Serial.print(Runde1);
53
      Serial.println(" Runde Bahn1");
54
    }
55
56
    letzteRunde1 = Lichtschrankeunterbrochen1;
57
    sevseg.NewNum(Runde1,(byte) 2);
58
    
59
  }
60
61
 
62
  
63
  
64
}

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

Ich habs jetzt hinbekommen das ich wenn ich meine Lichtschranke 1 
betätige die Anzeig hochzählt von 1- 9999.

Wie bekomm ich jetzt hin, dass meine ersten zwei Ziffern für die erste 
bahn sind und meine letzten zwei für die die zweite Bahn, sodass dann 
beide bis 99 zählen.

von Karl H. (kbuchegg)


Lesenswert?

Sorry, war unterwegs. Nach dem auspacken seh ich mir mal durch, was du 
gebaut hast.

Nur soviel vorab, wenn deine Anzeige Zahlen von 0 bis 9999 anzeigen 
kannst, dann kannst du ja aus 2 Rundenzählern, die jeder von 0 bis 99 
gehen, die auszuegbende Zahl zusammensetzen:

auszugebende_Zahl = Runde1 * 100 + Runde2;

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:
> Sorry, war unterwegs. Nach dem auspacken seh ich mir mal durch, was du
> gebaut hast.
>
> Nur soviel vorab, wenn deine Anzeige Zahlen von 0 bis 9999 anzeigen
> kannst, dann kannst du ja aus 2 Rundenzählern, die jeder von 0 bis 99
> gehen, die auszuegbende Zahl zusammensetzen:
>
> auszugebende_Zahl = Runde1 * 100 + Runde2;

Damit das geht musst du aber die Unterdrückung der führenden 0-en in der 
Lib entweder modifizieren oder aber ganz rauswerfen

Das ist in
1
void SevSeg::FindNums()
der ganze Teil nach
1
    //If there are zeros, set them to 20 which means a blank
2
    //However, don't cut out significant zeros

von biede1987 (Gast)


Lesenswert?

Wie kann ich die ändern muss ich die in ne text datei umwandlen und dann 
rauslöschen?

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:
> Wie kann ich die ändern muss ich die in ne text datei umwandlen und dann
> rauslöschen?

Im Zip File hast du ja eine cpp-Datei und ein h-File vorgefunden.
Beides sind einfach nur Text-Dateien. Das cpp-File enthält den 
Programmtext deiner 'Library'.

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

ich hab jetzt den teil rausgelöscht

 //If there are zeros, set them to 20 which means a blank
    //However, don't cut out significant zeros
    if (negative==0) {
      if (nums[0]==0 && DecPlace<3){
        nums[0]=20;
        if (nums[1]==0 && DecPlace<2) {
          nums[1]=20;
          if (nums[2]==0 && DecPlace==0) {
            nums[2]=20;
          }
        }
      }
    }
    else {
      if (nums[1]==0 && DecPlace<2) {
        nums[1]=20;
        if (nums[2]==0 && DecPlace==0) {
          nums[2]=20;
        }



die dritte 0 kommt trotzdem noch

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:

> die dritte 0 kommt trotzdem noch

'noch' oder 'nicht'?

Das angestrebte Ziel sieht so aus, dass deine 4-stellige 7_Segment 
Anzeige an allen 4 Stellen eine 0 ausgibt, wenn du
1
   ...NewNum( 0, 2 );
aufrufst.

von biede1987 (Gast)


Lesenswert?

jetzt ist es so dass ich am Anfang nichts sehe, und sobald ich meine 
Lichtschranke betätige sind alle anzeigen an und bei der letzten steht 
ne 1 wenn ich jetzt hochzähle bis 20 dann steht bei allen  eine 0

von biede1987 (Gast)


Lesenswert?

kommisch erst wenn ich die Lichtschranke betätige dann fängt bei sie 
anzuzählen, ich seh nicht von Anfang an die 0000.
1
 // Um die Runden der Fahrzeuge zu zählen, bedarf es einer Abfrage am Startzielbogen 
2
    // um dem Mikrocontroller mitzuteilen ob das Fahrzeuge durchgefahren ist oder nicht. 
3
    // Die Kontrolle, ob ein Fahrzeug durch den Startzielbogen gefahren ist , geschieht durch
4
    // eine selbst gebaute Infrarot - Lichtschranke, die am Bogen unten angebracht ist.  
5
    // Ist die Lichtschranke belegt, dann sendet sie eine 1 an den Mikrokontroller, sobald sich 
6
    // nicht belegt ist sendet sie eine 0.  Durch einen Reset Taster werden die Runden wieder auf zurückgesetzt
7
    
8
    
9
      #include "SevSeg.h"
10
11
12
      SevSeg sevseg;
13
14
      int Lichtschranke1 = 11; // Taster
15
      int Lichtschranke2 = 13; // Taster
16
      int Lichtschrankeunterbrochen1; // Variable für Pin Zustand Bahn 2
17
      int Lichtschrankeunterbrochen2; // Variable für Pin Zustand Bahn 2
18
      int letzteRunde1; // Variable für den letzten Schalterzustand letzte Runde Bahn1
19
      int letzteRunde2; // Variable für den letzten Schalterzustand letzte Runde Bahn2
20
      int Runde1 = 0; // Wie oft ist der Schalter gedrückt Bahn 1   
21
      int Runde2 = 0; // Wie oft ist der Schalter gedrückt Bahn 1 2
22
    
23
      int reset = 12;
24
      int resetdruecken;   // Variable fuer Reset Taster
25
      
26
      
27
      void setup(){
28
 
29
      Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
30
      pinMode(Lichtschranke1,INPUT);
31
      pinMode(Lichtschranke2,INPUT);
32
      
33
      letzteRunde1 = digitalRead(Lichtschranke1); // Anfangszustand lesen
34
      letzteRunde2 = digitalRead(Lichtschranke1); // Anfangszustand lesen
35
      
36
      resetdruecken =digitalRead(reset); // Anfangszustand lesen
37
      
38
      sevseg.Begin(1,24,26,28,30,9,3,4,5,6,7,8,32);
39
        //Set the desired brightness (0 to 100);
40
      sevseg.Brightness(90);
41
          
42
      }
43
      
44
       void loop()  { 
45
         
46
          sevseg.PrintOutput();
47
          
48
          
49
          if (digitalRead(reset) == HIGH)
50
               Runde1 = 0;
51
52
              Lichtschrankeunterbrochen1 = digitalRead(Lichtschranke1);
53
            if (Lichtschrankeunterbrochen1 != letzteRunde1) { // Der Zustand des Schalters hat sich verändert 
54
55
    if (Lichtschrankeunterbrochen1 == HIGH) { // Ist der Schalter gedrückt? 
56
      Runde1++; // Inkrementieren der Variablen Runde 
57
       if (Runde1==20) { // Reset von 99 auf 0
58
           Runde1=0;}
59
       
60
          
61
      Serial.print("Wir sind jetzt in der ");
62
      Serial.print(Runde1);
63
      Serial.println(" Runde Bahn1");
64
    }
65
66
    letzteRunde1 = Lichtschrankeunterbrochen1;
67
    sevseg.NewNum(Runde1,(byte) 2);
68
    
69
  }
70
71
           
72
  
73
  
74
}

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Dein Code ist furchtbar. Rück den doch mal ordentlich ein!
Das ist kein Selbstzweck, das Code eine ordentliche Einrückung hat. 
Anhand der Einrückung erkennt man die Struktur, inklusive welche 
Anweisungen von welchen anderen Anweisungen abhängen. Je mehr Chaos du 
da veranstaltest, desto unübersichtlicher wird das
1
// Um die Runden der Fahrzeuge zu zählen, bedarf es einer Abfrage am Startzielbogen 
2
// um dem Mikrocontroller mitzuteilen ob das Fahrzeuge durchgefahren ist oder nicht. 
3
// Die Kontrolle, ob ein Fahrzeug durch den Startzielbogen gefahren ist , geschieht durch
4
// eine selbst gebaute Infrarot - Lichtschranke, die am Bogen unten angebracht ist.  
5
// Ist die Lichtschranke belegt, dann sendet sie eine 1 an den Mikrokontroller, sobald sich 
6
// nicht belegt ist sendet sie eine 0.  Durch einen Reset Taster werden die Runden wieder auf zurückgesetzt
7
    
8
#include "SevSeg.h"
9
10
SevSeg sevseg;
11
int Lichtschranke1 = 11; // Taster
12
int Lichtschranke2 = 13; // Taster
13
int Lichtschrankeunterbrochen1; // Variable für Pin Zustand Bahn 2
14
int Lichtschrankeunterbrochen2; // Variable für Pin Zustand Bahn 2
15
int letzteRunde1; // Variable für den letzten Schalterzustand letzte Runde Bahn1
16
int letzteRunde2; // Variable für den letzten Schalterzustand letzte Runde Bahn2
17
int Runde1 = 0; // Wie oft ist der Schalter gedrückt Bahn 1   
18
int Runde2 = 0; // Wie oft ist der Schalter gedrückt Bahn 1 2
19
    
20
int reset = 12;
21
int resetdruecken;   // Variable fuer Reset Taster
22
      
23
void setup() {
24
  Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
25
26
  pinMode(Lichtschranke1,INPUT);
27
  pinMode(Lichtschranke2,INPUT);
28
      
29
  letzteRunde1 = digitalRead(Lichtschranke1); // Anfangszustand lesen
30
  letzteRunde2 = digitalRead(Lichtschranke1); // Anfangszustand lesen
31
      
32
  resetdruecken =digitalRead(reset); // Anfangszustand lesen
33
      
34
  sevseg.Begin(1,24,26,28,30,9,3,4,5,6,7,8,32);
35
  //Set the desired brightness (0 to 100);
36
  sevseg.Brightness(90);
37
}
38
39
void loop() {
40
41
  sevseg.PrintOutput();
42
43
  if (digitalRead(reset) == HIGH)
44
    Runde1 = 0;
45
46
  Lichtschrankeunterbrochen1 = digitalRead(Lichtschranke1);
47
  if (Lichtschrankeunterbrochen1 != letzteRunde1) { // Der Zustand des Schalters hat sich verändert 
48
49
    if (Lichtschrankeunterbrochen1 == HIGH) { // Ist der Schalter gedrückt? 
50
      Runde1++; // Inkrementieren der Variablen Runde 
51
      if (Runde1==20) { // Reset von 99 auf 0
52
        Runde1=0;
53
      }
54
       
55
      Serial.print("Wir sind jetzt in der ");
56
      Serial.print(Runde1);
57
      Serial.println(" Runde Bahn1");
58
    }
59
60
    letzteRunde1 = Lichtschrankeunterbrochen1;
61
    sevseg.NewNum(Runde1,(byte) 2);  
62
  }
63
}


Ruf halt mal in setup()
1
   sevseg.NewNum( 0,(byte) 2);
auf, damit die Anzeige auch eine gesicherte Ausgabe hat, solange sich 
noch nichts an den Lichtschranken getan hat.
1
...
2
void setup() {
3
...
4
  sevseg.Begin(1,24,26,28,30,9,3,4,5,6,7,8,32);
5
  //Set the desired brightness (0 to 100);
6
  sevseg.Brightness(90);
7
  sevseg.NewNum( 0,(byte) 2);  
8
}

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

Also wenn ich 0 eingebe dann kommen auch vier 0000

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:
> Also wenn ich 0 eingebe dann kommen auch vier 0000

ja, soll auch (momentan) so sein.
Die Unterdrückung führender 0-en ist abgeschaltet!

von biede1987 (Gast)


Lesenswert?

Darf ich die zwei 0 vorne noch sehen oder nicht? seitdem wir was aus der 
sevseg datei was rausgelöscht haben?

Wenn ja dann würde es ja passen!

von biede1987 (Gast)


Lesenswert?

ok warst schneller  danke!



jetzt würde ich mal meine zweite Lichtschranke in das Programm mit 
reinbauen.

von Karl H. (kbuchegg)


Lesenswert?

passt fürs erste
kümmere dich jetzt erst mal um die 2-te lichtschranke

von biede1987 (Gast)


Lesenswert?

1
// Um die Runden der Fahrzeuge zu zählen, bedarf es einer Abfrage am Startzielbogen 
2
    // um dem Mikrocontroller mitzuteilen ob das Fahrzeuge durchgefahren ist oder nicht. 
3
    // Die Kontrolle, ob ein Fahrzeug durch den Startzielbogen gefahren ist , geschieht durch
4
    // eine selbst gebaute Infrarot - Lichtschranke, die am Bogen unten angebracht ist.  
5
    // Ist die Lichtschranke belegt, dann sendet sie eine 1 an den Mikrokontroller, sobald sich 
6
    // nicht belegt ist sendet sie eine 0.  Durch einen Reset Taster werden die Runden wieder auf zurückgesetzt
7
    
8
    
9
      #include "SevSeg.h"
10
11
12
      SevSeg sevseg;
13
14
      int Lichtschranke1 = 11; // Taster
15
      int Lichtschranke2 = 13; // Taster
16
      int Lichtschrankeunterbrochen1; // Variable für Pin Zustand Bahn 2
17
      int Lichtschrankeunterbrochen2; // Variable für Pin Zustand Bahn 2
18
      int letzteRunde1; // Variable für den letzten Schalterzustand letzte Runde Bahn1
19
      int letzteRunde2; // Variable für den letzten Schalterzustand letzte Runde Bahn2
20
      int Runde1 = 0; // Wie oft ist der Schalter gedrückt Bahn 1   
21
      int Runde2 = 0; // Wie oft ist der Schalter gedrückt Bahn 1 2
22
    
23
      int reset = 12;
24
      int resetdruecken;   // Variable fuer Reset Taster
25
      
26
      int auszugebende_Zahl; 
27
      
28
      
29
      void setup(){
30
 
31
      Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
32
      pinMode(Lichtschranke1,INPUT);
33
      pinMode(Lichtschranke2,INPUT);
34
      
35
      letzteRunde1 = digitalRead(Lichtschranke1); // Anfangszustand lesen
36
      letzteRunde2 = digitalRead(Lichtschranke2); // Anfangszustand lesen
37
      
38
      resetdruecken =digitalRead(reset); // Anfangszustand lesen
39
      
40
      sevseg.Begin(1,24,26,28,30,9,3,4,5,6,7,8,32);
41
        //Set the desired brightness (0 to 100);
42
      sevseg.Brightness(90);
43
          
44
      }
45
      
46
       void loop()  { 
47
         
48
          sevseg.PrintOutput();
49
          
50
          
51
          if (digitalRead(reset) == HIGH)
52
               Runde1 = 0;
53
54
              Lichtschrankeunterbrochen1 = digitalRead(Lichtschranke1);
55
            if (Lichtschrankeunterbrochen1 != letzteRunde1) { // Der Zustand des Schalters hat sich verändert 
56
57
    if (Lichtschrankeunterbrochen1 == HIGH) { // Ist der Schalter gedrückt? 
58
      Runde1++; // Inkrementieren der Variablen Runde 
59
       if (Runde1==20) { // Reset von 99 auf 0
60
           Runde1=0;}
61
       
62
          
63
      Serial.print("Wir sind jetzt in der ");
64
      Serial.print(Runde1);
65
      Serial.println(" Runde Bahn1");
66
      
67
      
68
    }}
69
    
70
    
71
        letzteRunde1 = Lichtschrankeunterbrochen1;
72
        
73
        
74
         if (digitalRead(reset) == HIGH)
75
               Runde2 = 0;
76
77
              Lichtschrankeunterbrochen2 = digitalRead(Lichtschranke2);
78
            if (Lichtschrankeunterbrochen2 != letzteRunde2) { // Der Zustand des Schalters hat sich verändert 
79
80
    if (Lichtschrankeunterbrochen2 == HIGH) { // Ist der Schalter gedrückt? 
81
      Runde2++; // Inkrementieren der Variablen Runde 
82
       if (Runde2==20) { // Reset von 99 auf 0
83
           Runde2=0;}
84
           
85
      Serial.print("Wir sind jetzt in der ");
86
      Serial.print(Runde2);
87
      Serial.println(" Runde Bahn2");
88
       
89
    }
90
    
91
    letzteRunde2 = Lichtschrankeunterbrochen2;
92
    
93
    auszugebende_Zahl = Runde1 * 100 + Runde2;
94
    
95
    sevseg.NewNum(auszugebende_Zahl,(byte) 2);
96
    
97
      }
98
99
           
100
  
101
    
102
}

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

Ich zähle jetzt auf beiden Seiten,

Problem ist jetzt nur noch wenn ich die Lichtschranke Bahn 1 betätige 
zählt es zwar am Serial Monitor hoch, aber nicht auf meine Anzeige, erst 
wenn ich Lichtschranke 2 betätige dann leuchte meine Anteige und ich 
sehe beide Runden.

von biede1987 (Gast)


Lesenswert?

Muss ich mein

auszugebende_Zahl = Runde1 * 100 + Runde2;

    sevseg.NewNum(auszugebende_Zahl,(byte) 2);

in die letzte Klammer oder?

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:

> Problem ist jetzt nur noch

Sorry. Ich greif den Chaoscode nicht mehr an, solange der so aussieht.
Wenn zureden nichts hilft, dann eben auf die harte Tour. Solange, bis du 
merkst, dass ein vernünftig aussehender Code eine Hilfe dabei ist, 
Logikfehler zu sehen und zu beseitigen.

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

1
// Um die Runden der Fahrzeuge zu zählen, bedarf es einer Abfrage am Startzielbogen 
2
    // um dem Mikrocontroller mitzuteilen ob das Fahrzeuge durchgefahren ist oder nicht. 
3
    // Die Kontrolle, ob ein Fahrzeug durch den Startzielbogen gefahren ist , geschieht durch
4
    // eine selbst gebaute Infrarot - Lichtschranke, die am Bogen unten angebracht ist.  
5
    // Ist die Lichtschranke belegt, dann sendet sie eine 1 an den Mikrokontroller, sobald sich 
6
    // nicht belegt ist sendet sie eine 0.  Durch einen Reset Taster werden die Runden wieder auf zurückgesetzt
7
    
8
    
9
      #include "SevSeg.h"
10
11
12
      SevSeg sevseg;
13
14
      int Lichtschranke1 = 11; // Taster
15
      int Lichtschranke2 = 13; // Taster
16
      int Lichtschrankeunterbrochen1; // Variable für Pin Zustand Bahn 2
17
      int Lichtschrankeunterbrochen2; // Variable für Pin Zustand Bahn 2
18
      int letzteRunde1; // Variable für den letzten Schalterzustand letzte Runde Bahn1
19
      int letzteRunde2; // Variable für den letzten Schalterzustand letzte Runde Bahn2
20
      int Runde1 = 0; // Wie oft ist der Schalter gedrückt Bahn 1   
21
      int Runde2 = 0; // Wie oft ist der Schalter gedrückt Bahn 1 2
22
    
23
      int reset = 12;
24
      int resetdruecken;   // Variable fuer Reset Taster
25
      
26
      int auszugebende_Zahl; 
27
      
28
      
29
      void setup(){
30
 
31
      Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
32
      pinMode(Lichtschranke1,INPUT);
33
      pinMode(Lichtschranke2,INPUT);
34
      
35
      letzteRunde1 = digitalRead(Lichtschranke1); // Anfangszustand lesen
36
      letzteRunde2 = digitalRead(Lichtschranke2); // Anfangszustand lesen
37
      
38
      resetdruecken =digitalRead(reset); // Anfangszustand lesen
39
      
40
      sevseg.Begin(1,24,26,28,30,9,3,4,5,6,7,8,32);
41
        //Set the desired brightness (0 to 100);
42
      sevseg.Brightness(90);
43
          
44
      }
45
      
46
       void loop()  { 
47
         
48
          sevseg.PrintOutput();
49
          
50
          
51
          if (digitalRead(reset) == HIGH)
52
               Runde1 = 0;
53
54
              Lichtschrankeunterbrochen1 = digitalRead(Lichtschranke1);
55
            if (Lichtschrankeunterbrochen1 != letzteRunde1) { // Der Zustand des Schalters hat sich verändert 
56
57
    if (Lichtschrankeunterbrochen1 == HIGH) { // Ist der Schalter gedrückt? 
58
      Runde1++; // Inkrementieren der Variablen Runde 
59
       if (Runde1==20) { // Reset von 99 auf 0
60
           Runde1=0;}
61
       
62
          
63
      Serial.print("Wir sind jetzt in der ");
64
      Serial.print(Runde1);
65
      Serial.println(" Runde Bahn1");
66
      
67
      
68
    }}
69
    
70
    
71
        letzteRunde1 = Lichtschrankeunterbrochen1;
72
        
73
        
74
         if (digitalRead(reset) == HIGH)
75
               Runde2 = 0;
76
77
              Lichtschrankeunterbrochen2 = digitalRead(Lichtschranke2);
78
            if (Lichtschrankeunterbrochen2 != letzteRunde2) { // Der Zustand des Schalters hat sich verändert 
79
80
    if (Lichtschrankeunterbrochen2 == HIGH) { // Ist der Schalter gedrückt? 
81
      Runde2++; // Inkrementieren der Variablen Runde 
82
       if (Runde2==20) { // Reset von 99 auf 0
83
           Runde2=0;}
84
           
85
      Serial.print("Wir sind jetzt in der ");
86
      Serial.print(Runde2);
87
      Serial.println(" Runde Bahn2");
88
       
89
    }
90
    
91
    letzteRunde2 = Lichtschrankeunterbrochen2;
92
    
93
    
94
    
95
      }
96
97
        auszugebende_Zahl = Runde1 * 100 + Runde2;
98
    
99
    sevseg.NewNum(auszugebende_Zahl,(byte) 2);   
100
  
101
    
102
}

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

Doch so wars jetzt gehts ich tu ihn jetzt noch ordnen!

von biede1987 (Gast)


Lesenswert?

habs in die letzte Klammer und hat funktioniert

von biede1987 (Gast)


Lesenswert?

// Um die Runden der Fahrzeuge zu zählen, bedarf es einer Abfrage am 
Startzielbogen
    // um dem Mikrocontroller mitzuteilen ob das Fahrzeuge durchgefahren 
ist oder nicht.
    // Die Kontrolle, ob ein Fahrzeug durch den Startzielbogen gefahren 
ist , geschieht durch
    // eine selbst gebaute Infrarot - Lichtschranke, die am Bogen unten 
angebracht ist.
    // Ist die Lichtschranke belegt, dann sendet sie eine 1 an den 
Mikrokontroller, sobald sich
    // nicht belegt ist sendet sie eine 0.  Durch einen Reset Taster 
werden die Runden wieder auf zurückgesetzt


      #include "SevSeg.h"

      SevSeg sevseg;

      int Lichtschranke1 = 11; // Taster
      int Lichtschranke2 = 13; // Taster
      int Lichtschrankeunterbrochen1; // Variable für Pin Zustand Bahn 2
      int Lichtschrankeunterbrochen2; // Variable für Pin Zustand Bahn 2
      int letzteRunde1; // Variable für den letzten Schalterzustand 
letzte Runde Bahn1
      int letzteRunde2; // Variable für den letzten Schalterzustand 
letzte Runde Bahn2
      int Runde1 = 0; // Wie oft ist der Schalter gedrückt Bahn 1
      int Runde2 = 0; // Wie oft ist der Schalter gedrückt Bahn 1 2

      int reset = 12;
      int resetdruecken;   // Variable fuer Reset Taster

      int auszugebende_Zahl;

      void setup(){

        Serial.begin(9600); // Start der seriellen Kommunikation mit 
9600bps
        pinMode(Lichtschranke1,INPUT);
        pinMode(Lichtschranke2,INPUT);

        letzteRunde1 = digitalRead(Lichtschranke1); // Anfangszustand 
lesen
        letzteRunde2 = digitalRead(Lichtschranke2); // Anfangszustand 
lesen

        resetdruecken =digitalRead(reset); // Anfangszustand lesen

        sevseg.Begin(1,24,26,28,30,9,3,4,5,6,7,8,32);
        //Set the desired brightness (0 to 100);
        sevseg.Brightness(90);

        }

       void loop()  {

          sevseg.PrintOutput();

          if (digitalRead(reset) == HIGH)
               Runde1 = 0;

          Lichtschrankeunterbrochen1 = digitalRead(Lichtschranke1);
          if (Lichtschrankeunterbrochen1 != letzteRunde1) { // Der 
Zustand des Schalters hat sich verändert

            if (Lichtschrankeunterbrochen1 == HIGH) { // Ist der 
Schalter gedrückt?
              Runde1++; // Inkrementieren der Variablen Runde
               if (Runde1==99) { // Reset von 99 auf 0
               Runde1=0;}


            Serial.print("Wir sind jetzt in der ");
            Serial.print(Runde1);
            Serial.println(" Runde Bahn1");
    }
  }

          letzteRunde1 = Lichtschrankeunterbrochen1;


         if (digitalRead(reset) == HIGH)
               Runde2 = 0;

         Lichtschrankeunterbrochen2 = digitalRead(Lichtschranke2);
         if (Lichtschrankeunterbrochen2 != letzteRunde2) { // Der 
Zustand des Schalters hat sich verändert

             if (Lichtschrankeunterbrochen2 == HIGH) { // Ist der 
Schalter gedrückt?
             Runde2++; // Inkrementieren der Variablen Runde
             if (Runde2==99) { // Reset von 99 auf 0
                 Runde2=0;}

            Serial.print("Wir sind jetzt in der ");
            Serial.print(Runde2);
            Serial.println(" Runde Bahn2");

            }

          letzteRunde2 = Lichtschrankeunterbrochen2;
      }

        auszugebende_Zahl = Runde1 * 100 + Runde2;
        sevseg.NewNum(auszugebende_Zahl,(byte) 2);

}

von biede1987 (Gast)


Lesenswert?

Vielen Dank nochmal das du mir so viel geholfen hast!!

von biede1987 (Gast)


Lesenswert?

Warum leuchten meine ersten zwei Ziffern nicht so hell wie die letzten 
zwei?

von biede1987 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ich bins nochmal,

ich möchte mein Programm nochmals erweitertn:

4-stellige 7 Segmentanzeige bleibt,


zuätzlich soll über den Serial Monitor die Rundenzeit angezeigt werden!

Ich hab das Programm weiter geschrieben könnte es so funktionieren?

Vielen Dank schonmal für die Hinweise!

Danke

von Jürgen S. (jurs)


Lesenswert?

biede1987 schrieb:
> Ich hab das Programm weiter geschrieben könnte es so funktionieren?

Du hast doch Dein Arduino-Board und eine Carrera-Bahn, probier's einfach 
aus!

Übrigens habe ich hier auch mal im Arduino-Forum für jemanden mit 
Carrera-Bahn eine Runden- und Zeitmessung gemacht und gepostet:
http://forum.arduino.cc/index.php?topic=158779.msg1189593#msg1189593
(Ich selbst habe keine Bahn.)

Als Sensoren werden da einfach nur zwei Reed-Kontakte verwendet, mit 
Heißkleber unter die Bahn geklebt, und die Anzeige erfolgt auf einem 
16x2 Text-LCD vom Typ "LCD Keypad Shield" zum Aufstecken für das 
Arduino-Board.

Die Rundenzeiten werden in meinem Sketch per Interrupt-Routine 
ermittelt, da ich mir nicht sicher war, ob die kleinen Flitzer nicht zu 
schnell sind und den Reed-Kontakt für zu kurze Zeit schließen, um per 
Polling zuverlässig abgefragt zu werden, insbesondere wenn zwei 
Rennwagen "fast gleichzeitig" den kurzen Rundenimpuls erzeugen, weil sie 
im Rennen gleichauf liegen.

Das LCD macht eine nette "Wechselanzeige", im Zweisekundentakt wechseln 
sich ab:
- Rundenzahlen auf den Bahnen
- Rundenzeiten (letzte Runde und schnellste Rennrunde)
So ist nicht nur auf der Rennbahn "Action", sondern auch auf der 
Anzeigentafel tut sich laufend etwas.

Vielleicht möchtest Du Dir auch diesen Code mal ansehen.

von biede1987 (Gast)


Lesenswert?

Hallo ich hab mich jetzt nochmal versucht,


ich hab jetzt ein Programm geschrieben bei dem ich zeit der runden 
messe!

Funktioniert auch soweit

von biede1987 (Gast)


Lesenswert?

1
int Lichtschranke1 =11;
2
3
long Rundenanfang1;
4
long Rundenzeit1; 
5
6
void setup()
7
{
8
 
9
  pinMode(Lichtschranke1, INPUT);
10
  
11
  Serial.begin(9600);
12
}
13
14
15
void loop()
16
{
17
      if(digitalRead(Lichtschranke1) == HIGH){           // Sobald die Taste gedrückt wurde
18
      Rundenanfang1 = millis();
19
       while(digitalRead(Lichtschranke1) == HIGH);       // Warten so lange bis die Lichtschranke wieder betätigt wird
20
       long Rundenzeit1 = millis() - Rundenanfang1;
21
      Serial.print("Das ist die Rundenzeit ");             // Ausgaben zum Serial Monitor, nur sichtbar am PC
22
      Serial.print(Rundenzeit1);
23
      Serial.println(" Bahn1"); 
24
  }
25
}

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

Was jetzt kommisch ist wenn die das programmierte Programm in mein altes 
einfüge!

kommt am serial monitior die richtige Anzeige. Also Rundenzeit + Runde

Nur meine 4-stellige 7 Segmentanzeige funktioniert nicht, sie leuchtet 
nur dann wenn die Lichtschranke unterbrochen ist!

Könnt mir erklären wieso,

Vielen Dank schon mal im Vorraus!


PS
Hallo Jürgen, danke für die INFO hab ich vorgestern Abend auch schon 
gefunden, ich habs mir angeschaut und es war eine gute hilfe! möchte es 
aber nciht mit einem LCD display machen sondern mit 7 Segmentanzeigen! 
Hab auch alles schon aufgebaut und funktioniert! ich möchte jetzt nur 
auf dem Serialmontitor die Rundenzeiten und die Geschwindigkeit 
herrausgeben!

von biede1987 (Gast)


Lesenswert?

1
// Um die Runden der Fahrzeuge zu zählen, bedarf es einer Abfrage am Startzielbogen 
2
    // um dem Mikrocontroller mitzuteilen ob das Fahrzeuge durchgefahren ist oder nicht. 
3
    // Die Kontrolle, ob ein Fahrzeug durch den Startzielbogen gefahren ist , geschieht durch
4
    // eine selbst gebaute Infrarot - Lichtschranke, die am Bogen unten angebracht ist.  
5
    // Ist die Lichtschranke belegt, dann sendet sie eine 1 an den Mikrokontroller, sobald sich 
6
    // nicht belegt ist sendet sie eine 0.  Durch einen Reset Taster werden die Runden wieder auf zurückgesetzt
7
    // Desweiteren soll ich Rundenzeit der beiden Bahnen gemessen werden
8
    
9
    
10
    
11
      #include "SevSeg.h"                     //4 stellige 7 Segemnt Library hinzufügen
12
      SevSeg sevseg;        
13
14
      int Lichtschranke1 = 11;                // Zuweisung für Lichtschranke Bahn1 = Pin 11
15
      int Lichtschranke2 = 13;                // Zuweisung für Lichtschranke Bahn2 = Pin 13
16
      int Lichtschrankeunterbrochen1;         // Variable für Pin Zustand Bahn 1
17
      int Lichtschrankeunterbrochen2;         // Variable für Pin Zustand Bahn 2
18
      int letzteRunde1;                       // Variable für den letzten Schalterzustand letzte Runde Bahn1
19
      int letzteRunde2;                       // Variable für den letzten Schalterzustand letzte Runde Bahn2
20
      int Runde1 = 0;                         // Varialbe für Rundeanzahl Bahn 1, am Anfang Runde = 0  
21
      int Runde2 = 0;                         // Varialbe für Rundeanzahl Bahn 2, am Anfang Runde = 0  
22
      long Rundenanfang1 = 0;                 // Start der letzten Runde in Millisekunden
23
      long Rundenanfang2 = 0;                 // Start der letzten Runde in Millisekunden
24
      long Rundenzeit1;               // Rundenzeit der letzten Runde in Millisekunden
25
      long RundenZeit2;               // Rundenzeit der letzten Runde in Millisekunden
26
      long RundenZeitRekord1;          // Rundenzeit der schnellsten Runde in Millisekunden
27
      long RundenZeitRekord2;          // Rundenzeit der schnellsten Runde in Millisekunden
28
29
    
30
      int reset = 12;                         // Zuweisung für Resettaster = Pin 11
31
      int resetdruecken;                      // Variable für Pin Zustand Resettaster
32
      
33
      int auszugebende_Zahl;                  // Variable für auszugebende Zahl, am Display
34
      
35
      void setup(){                           //Setup Bedingungen des Programms        
36
 
37
        Serial.begin(9600);                   // Start der seriellen Kommunikation mit 9600bps
38
        pinMode(Lichtschranke1,INPUT);        // setzt den DigitalPin als Eingang
39
        pinMode(Lichtschranke2,INPUT);        // setzt den DigitalPin als Eingang
40
      
41
        letzteRunde1 = digitalRead(Lichtschranke1);       // Anfangszustand auslesen
42
        letzteRunde2 = digitalRead(Lichtschranke2);       // Anfangszustand auslesen
43
        resetdruecken =digitalRead(reset);                // Anfangszustand auslesen
44
      
45
        sevseg.Begin(1,2,5,6,32,3,7,28,24,22,4,30,26);    // Pin Belegung des Mikroconrollers für 4 stellige 7 Segement Display
46
        
47
        sevseg.Brightness(10);                           // Helligkeit des Displays Wert von 0-100
48
          
49
      }
50
      
51
       void loop()  {                         // Bedingungen die ständig wiederholt werden
52
         
53
          sevseg.PrintOutput();               // Erzeugt die Ausgabe am Display
54
          
55
          if (digitalRead(reset) == HIGH)     // Wenn Reset 1, Dann Runde1 = 0, Runde wird zurückgesetzt
56
               Runde1 = 0;
57
58
          Lichtschrankeunterbrochen1 = digitalRead(Lichtschranke1);  // Lichtschranke1 Wert lesen und in Varibale Lichtschrankeunterbrochen1 speichern
59
          if (Lichtschrankeunterbrochen1 != letzteRunde1) {          // Der Zustand des Schalters hat sich verändert 
60
61
            if (Lichtschrankeunterbrochen1 == LOW) {                 // Wenn Lichtschranke unterbrochen dann  
62
              Runde1++;                                              // Runde1 hochzählen +1
63
              
64
               if (Runde1==99) {                                     // Wenn Runde 99 erreicht, dann zurücksetzen auf 0
65
               Runde1=0;}
66
       
67
          
68
            Serial.print("Wir sind jetzt in der ");                  // Ausgaben zum Serial Monitor, nur sichtbar am PC
69
            Serial.print(Runde1);
70
            Serial.println(" Runde Bahn1"); 
71
           }
72
  }
73
    
74
          letzteRunde1 = Lichtschrankeunterbrochen1;                 // Den letzten Schalterzustand merken
75
        
76
        
77
        auszugebende_Zahl = Runde1 * 100 + Runde2;                 // Formel umd Runden am Display anzuzeigen
78
        sevseg.NewNum(auszugebende_Zahl,(byte) 2);                   // Ausgabe zum 4 stelligen 7 Segmentanzeige
79
        
80
            if(digitalRead(Lichtschranke1) == HIGH){     // here if the switch is pressed
81
            Rundenanfang1 = millis();
82
            while(digitalRead(Lichtschranke1) == HIGH); // wait while the switch is still pressed
83
            long Rundenzeit1 = millis() - Rundenanfang1;
84
            Serial.print("Das ist die Rundenzeit ");                  // Ausgaben zum Serial Monitor, nur sichtbar am PC
85
            Serial.print(Rundenzeit1);
86
            Serial.println(" Bahn1"); 
87
          
88
    }
89
    
90
}

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

Wäre super wenn ihr mir helfen könnt!

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:
>
1
> int Lichtschranke1 =11;
2
> 
3
> long Rundenanfang1;
4
> long Rundenzeit1;
5
> 
6
> void setup()
7
> {
8
> 
9
>   pinMode(Lichtschranke1, INPUT);
10
> 
11
>   Serial.begin(9600);
12
> }
13
> 
14
> 
15
> void loop()
16
> {
17
>       if(digitalRead(Lichtschranke1) == HIGH){           // Sobald die 
18
> Taste gedrückt wurde
19
>       Rundenanfang1 = millis();
20
>        while(digitalRead(Lichtschranke1) == HIGH);       // Warten so 
21
> lange bis die Lichtschranke wieder betätigt wird
22
>        long Rundenzeit1 = millis() - Rundenanfang1;
23
>       Serial.print("Das ist die Rundenzeit ");             // Ausgaben 
24
> zum Serial Monitor, nur sichtbar am PC
25
>       Serial.print(Rundenzeit1);
26
>       Serial.println(" Bahn1");
27
>   }
28
> }
29
>

So wird das nichts.

Du darfst nicht darauf warten, bis dein Auto die Runde beendet hat.
Du starrst ja auch nicht die ganze Zeit auf eine Stoppuhr, wenn du die 
Rundenzeit messen willst.

Warum machst du denn nicht das naheliegenste.
Hier, an dieser Stelle ....
1
....
2
            if (Lichtschrankeunterbrochen1 == LOW) {                 // Wenn Lichtschranke unterbrochen dann  
3
              Runde1++;                                              // Runde1 hochzählen +1
... weißt du, dass genau zu diesem Zeitpunkt das AUto die Lichtschranke 
durchfahren hat. Und genau zu diesem Zeitpunkt stellst du die aktuelle 
Zeit fest, indem du sie von millis() erfragst.
Die vergleichst du mit der Zeit von der Runde zuvor (wenn es eine Runde 
zuvor gab - das ist aber leicht festzustellen. Wenn die Rundenzahl 1 
ist, dann gab es keine Runde zuvor) und die Differenz der beiden ist die 
Rundenzeit. Die zu diesem Zeitpunkt festgestellte aktuelle Zeit aus 
millis() merkst du dir noch, denn sie ist die Startzeit mit der dann bei 
der nächsten Lichschrankenunterbrechung die nächste Rundenzeit ermittelt 
wird.
1
....
2
            if (Lichtschrankeunterbrochen1 == LOW) {                 // Wenn Lichtschranke unterbrochen dann  
3
              Runde1++;                                              // Runde1 hochzählen +1
4
5
              if (Runde1 > 1) {
6
                Rundenzeit1 = millis() - Rundenanfang1;
7
                Serial.print(Rundenzeit1);
8
              }
9
              Rundenanfang1 = millis();
10
...

: Bearbeitet durch User
von regine (Gast)


Lesenswert?

Tu uns bitte den Gefallen und formatiere deinen Code. Das kann ja keiner 
lesen!!
Dann wird Dir sicherlich geholfen.

von Karl H. (kbuchegg)


Lesenswert?

Und wie ich sehe, hat es in den letzten 3 einhalb Monaten auch nicht 
dazu gereicht, den Code mal ordentlich einzurücken.

von biede1987 (Gast)


Lesenswert?

Hallo vielen dank für die Hilfe

bin wieder bisschen weiter gekommen!

geb jetzt die zeit in Sekunden aus und die Geschwindigkeit in km/h

Danke

von biede1987 (Gast)


Angehängte Dateien:

Lesenswert?

1
// Um die Runden der Fahrzeuge zu zählen, bedarf es einer Abfrage am Startzielbogen 
2
    // um dem Mikrocontroller mitzuteilen ob das Fahrzeuge durchgefahren ist oder nicht. 
3
    // Die Kontrolle, ob ein Fahrzeug durch den Startzielbogen gefahren ist , geschieht durch
4
    // eine selbst gebaute Infrarot - Lichtschranke, die am Bogen unten angebracht ist.  
5
    // Ist die Lichtschranke belegt, dann sendet sie eine 1 an den Mikrokontroller, sobald sich 
6
    // nicht belegt ist sendet sie eine 0.  Durch einen Reset Taster werden die Runden wieder auf zurückgesetzt
7
    // Desweiteren soll ich Rundenzeit der beiden Bahnen gemessen werden
8
    
9
    
10
    
11
      #include "SevSeg.h"                     //4 stellige 7 Segemnt Library hinzufügen
12
      SevSeg sevseg;        
13
14
      int Lichtschranke1 = 11;                // Zuweisung für Lichtschranke Bahn1 = Pin 11
15
      int Lichtschranke2 = 13;                // Zuweisung für Lichtschranke Bahn2 = Pin 13
16
      int Lichtschrankeunterbrochen1;         // Variable für Pin Zustand Bahn 1
17
      int Lichtschrankeunterbrochen2;         // Variable für Pin Zustand Bahn 2
18
      int letzteRunde1;                       // Variable für den letzten Schalterzustand letzte Runde Bahn1
19
      int letzteRunde2;                       // Variable für den letzten Schalterzustand letzte Runde Bahn2
20
      int Runde1 = 0;                         // Varialbe für Rundeanzahl Bahn 1, am Anfang Runde = 0  
21
      int Runde2 = 0;                         // Varialbe für Rundeanzahl Bahn 2, am Anfang Runde = 0  
22
      float Rundenanfang1 = 0;                 // Start der letzten Runde in Millisekunden
23
      float Rundenanfang2 = 0;                 // Start der letzten Runde in Millisekunden
24
      float Rundenzeit1;               // Rundenzeit der letzten Runde in Millisekunden
25
      float RundenZeit2;               // Rundenzeit der letzten Runde in Millisekunden
26
      float Geschwindigkeit1;          // Rundenzeit der schnellsten Runde in Millisekunden
27
      float Geschwindigkeit2;          // Rundenzeit der schnellsten Runde in Millisekunden
28
29
    
30
      int reset = 12;                         // Zuweisung für Resettaster = Pin 11
31
      int resetdruecken;                      // Variable für Pin Zustand Resettaster
32
      
33
      int auszugebende_Zahl;                  // Variable für auszugebende Zahl, am Display
34
      
35
      void setup()
36
      {                           //Setup Bedingungen des Programms        
37
 
38
        Serial.begin(9600);                   // Start der seriellen Kommunikation mit 9600bps
39
        pinMode(Lichtschranke1,INPUT);        // setzt den DigitalPin als Eingang
40
        pinMode(Lichtschranke2,INPUT);        // setzt den DigitalPin als Eingang
41
      
42
        letzteRunde1 = digitalRead(Lichtschranke1);       // Anfangszustand auslesen
43
        letzteRunde2 = digitalRead(Lichtschranke2);       // Anfangszustand auslesen
44
        resetdruecken =digitalRead(reset);                // Anfangszustand auslesen
45
      
46
        sevseg.Begin(1,2,5,6,32,3,7,28,24,22,4,30,26);    // Pin Belegung des Mikroconrollers für 4 stellige 7 Segement Display
47
        
48
        sevseg.Brightness(10);                           // Helligkeit des Displays Wert von 0-100
49
          
50
      }
51
      
52
       void loop()  
53
       {                         // Bedingungen die ständig wiederholt werden
54
         
55
          sevseg.PrintOutput();               // Erzeugt die Ausgabe am Display
56
          
57
          if (digitalRead(reset) == HIGH) Runde1 = 0;     // Wenn Reset 1, Dann Runde1 = 0, Runde wird zurückgesetzt
58
               
59
60
          Lichtschrankeunterbrochen1 = digitalRead(Lichtschranke1);  // Lichtschranke1 Wert lesen und in Varibale Lichtschrankeunterbrochen1 speichern
61
          if (Lichtschrankeunterbrochen1 != letzteRunde1)            // Der Zustand des Schalters hat sich verändert 
62
         {
63
             if (Lichtschrankeunterbrochen1 == LOW)                  // Wenn Lichtschranke unterbrochen dann  
64
           {
65
              Runde1++;                                              // Runde1 hochzählen +1
66
               
67
             if (Runde1 > 1)                                         // Wenn Runde größer 1 dann 
68
              {
69
                Rundenzeit1 = (millis() - Rundenanfang1)/1000;       // Millis von unten - Rundenanfang1
70
                Serial.print("Rundenzeit Runde ");                   // Ausgabe Serial Monitor
71
                Serial.print(Runde1);
72
                Serial.print(": " );
73
                Serial.print(Rundenzeit1);
74
                Serial.println(" Sekunden");
75
                
76
               Geschwindigkeit1 = 0.0051 / (Rundenzeit1 / 3600) ;        // Rundenzeit 1 / 3600 Sekunden / 0,51 m   =Geschwindigkeit in km/h          
77
               
78
               Serial.print("Durchschnittsgeschwindigkeit der letzten Runde ");                   // Ausgabe Serial Monitor
79
               Serial.print(Geschwindigkeit1);
80
               Serial.println( " km/h");
81
               Serial.println(" ");
82
             }
83
                Rundenanfang1 = millis();
84
                
85
          
86
               if (Runde1==99) {Runde1=0;}                             // Wenn Runde 99 erreicht, dann zurücksetzen auf 0
87
              
88
       
89
          
90
            Serial.print("Wir sind jetzt in der ");                  // Ausgaben zum Serial Monitor, nur sichtbar am PC
91
            Serial.print(Runde1);
92
            Serial.println(". Runde Bahn 1"); 
93
          
94
          }
95
        }
96
    
97
          letzteRunde1 = Lichtschrankeunterbrochen1;                 // Den letzten Schalterzustand merken
98
        
99
        
100
         auszugebende_Zahl = Runde1 * 100 + Runde2;                 // Formel umd Runden am Display anzuzeigen
101
        sevseg.NewNum(auszugebende_Zahl,(byte) 2);                   // Ausgabe zum 4 stelligen 7 Segmentanzeige
102
    
103
      }

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

wenn ich das Programm in das Textfeld einfüge

kommt der immer ohne Einrückung gibt es da einen Trick,

deswegen hab ich auch jetzt das Programm angehängt!

von Karl H. (kbuchegg)


Lesenswert?

biede1987 schrieb:
> wenn ich das Programm in das Textfeld einfüge
>
> kommt der immer ohne Einrückung gibt es da einen Trick,

vor das Programm
1
[c]
nach den Programmtext
1
[/c]

Siehe auch den Abschnitt "Formatierung" über dem Eingabefeld.

: Bearbeitet durch User
von biede1987 (Gast)


Lesenswert?

ok danke

wenn ich jetzt bei dem Programm die Gesamtzeit nach 5 Runden anzeige 
will

Dann schreib ich jetzt auch wieder:
[c]

             if (Runde1 == 5 )                                // Ende 
nach 5 Runden
              {
                Gesamtzeit1 = (millis() - Start1)/1000;       // Millis 
von unten - Rundenanfang1
                Serial.print("Gesamtzeit ");                   // 
Ausgabe Serial Monitor
                Serial.print(": " );
                Serial.print(Gesamtzeit1);
                Serial.println(" Sekunden");

[c/]


wie kann ich meine Start1 ( Startzeit) im Programm ermittlen?

klar wenn die Lichtschranke das erste mal auslöst

am besten so oder?

 if (Runde1==1){   Start1 = millis();}

von biede1987 (Gast)


Lesenswert?

ok danke

wenn ich jetzt bei dem Programm die Gesamtzeit nach 5 Runden anzeige
will

Dann schreib ich jetzt auch wieder:

1
             
2
              if (Runde1==1){ 
3
                Start1 = millis();}
4
             
5
             if (Runde1 == 5 )                                // Ende nach 5 Runden
6
              {
7
                Gesamtzeit1 = (millis() - Start1)/1000;       // Millis von unten - Rundenanfang1
8
                Serial.print("Gesamtzeit ");                   // Ausgabe Serial Monitor
9
                Serial.print(": " );
10
                Serial.print(Gesamtzeit1);
11
                Serial.println(" Sekunden");


wie kann ich meine Start1 ( Startzeit) im Programm ermittlen?

klar wenn die Lichtschranke das erste mal auslöst

am besten so oder?

 if (Runde1==1){   Start1 = millis();}

von biede1987 (Gast)


Lesenswert?

hallo ok das mit der gesamtzeit funktioniert jetzt auch nochmals danke
1
    
2
    
3
      #include "SevSeg.h"                     //4 stellige 7 Segemnt Library hinzufügen
4
      SevSeg sevseg;        
5
6
      int Lichtschranke1 = 11;                // Zuweisung für Lichtschranke Bahn1 = Pin 11
7
      int Lichtschranke2 = 13;                // Zuweisung für Lichtschranke Bahn2 = Pin 13
8
      int Lichtschrankeunterbrochen1;         // Variable für Pin Zustand Bahn 1
9
      int Lichtschrankeunterbrochen2;         // Variable für Pin Zustand Bahn 2
10
      int letzteRunde1;                       // Variable für den letzten Schalterzustand letzte Runde Bahn1
11
      int letzteRunde2;                       // Variable für den letzten Schalterzustand letzte Runde Bahn2
12
      int Runde1 = 0;                         // Varialbe für Rundeanzahl Bahn 1, am Anfang Runde = 0  
13
      int Runde11;                            // Varialbe für Rundeanzahl -1 fuer Anzeige Bahn1   
14
      int Runde2 = 0;                         // Varialbe für Rundeanzahl Bahn 2, am Anfang Runde = 0  
15
      int Runde22;                            // Varialbe für Rundeanzahl -1 fuer Anzeige Bahn2 
16
    
17
      float Rundenanfang1 = 0;                // Start der letzten Runde in Millisekunden Bahn1
18
      float Rundenanfang2 = 0;                // Start der letzten Runde in Millisekunden Bahn2
19
      float Start1;                           // Start am Anfang des Rennens in Millisekunden Bahn1
20
      float Start2;                           // Start am Anfang des Rennens in Millisekunden Bahn2
21
      float Rundenzeit1;                      // Ergebnis Rundenzeit Bahn1
22
      float Rundenzeit2;                      // Ergebnis Rundenzeit Bahn2
23
      float Gesamtzeit1;                      // Ergebnis Gesamt Rundenzeit Bahn1
24
      float Gesamtzeit2;                      // Ergebnis Gesamt Rundenzeit Bahn2
25
      float Geschwindigkeit1;                 // Ergebnis Geschwindigkeit Bahn1
26
      float Geschwindigkeit2;                 // Ergebnis Geschwindigkeit Bahn2
27
      float Gesamtgeschwindigkeit1;           // Ergebnis Gesamt Geschwindigketi Bahn1
28
      float Gesamtgeschwindkgkeit2;           // Ergebnis Gesamt Geschwindigkeit Bahn2
29
30
    
31
      int reset = 12;                         // Zuweisung für Resettaster = Pin 11
32
      int resetdruecken;                      // Variable für Pin Zustand Resettaster
33
      
34
      int auszugebende_Zahl;                  // Variable für auszugebende Zahl, am Display
35
      
36
      void setup(){                           //Setup Bedingungen des Programms        
37
 
38
        Serial.begin(9600);                   // Start der seriellen Kommunikation mit 9600bps
39
        pinMode(Lichtschranke1,INPUT);        // setzt den DigitalPin als Eingang
40
        pinMode(Lichtschranke2,INPUT);        // setzt den DigitalPin als Eingang
41
      
42
        letzteRunde1 = digitalRead(Lichtschranke1);       // Anfangszustand auslesen
43
        letzteRunde2 = digitalRead(Lichtschranke2);       // Anfangszustand auslesen
44
        resetdruecken =digitalRead(reset);                // Anfangszustand auslesen
45
      
46
        sevseg.Begin(1,2,5,6,32,3,7,28,24,22,4,30,26);    // Pin Belegung des Mikroconrollers für 4 stellige 7 Segement Display
47
        
48
        sevseg.Brightness(10);                           // Helligkeit des Displays Wert von 0-100
49
          
50
      }
51
      
52
       void loop()                            // Bedingungen die ständig wiederholt werden 
53
   {                         
54
         
55
          sevseg.PrintOutput();               // Erzeugt die Ausgabe am Display
56
          
57
          // Rundenmessung Bahn1
58
          
59
          if (digitalRead(reset) == HIGH)     // Wenn Reset 1, Dann Runde1 = 0, Runde wird zurückgesetzt
60
               Runde1 = 0;
61
62
          Lichtschrankeunterbrochen1 = digitalRead(Lichtschranke1);  // Lichtschranke1 Wert lesen und in Varibale Lichtschrankeunterbrochen1 speichern
63
          if (Lichtschrankeunterbrochen1 != letzteRunde1)            // Der Zustand des Schalters hat sich verändert 
64
          { 
65
            if (Lichtschrankeunterbrochen1 == LOW)                   // Wenn Lichtschranke unterbrochen dann  
66
            { Runde1++;                                              // Runde1 hochzählen +1
67
              
68
              Runde11 = Runde1 - 1;                                  // Variable für Ausgaben Rundenzeit Runde -1 wegen Anzeige auf Serialmonitor
69
              
70
              
71
              
72
                if (Runde1 > 1)                                      // Wenn Runde größer 1 dann 
73
              {
74
                Rundenzeit1 = (millis() - Rundenanfang1)/1000;       // Rundenzeit1 = Millis  - Rundenanfang1 /1000 wegen Sekunden
75
                Serial.print("Runde Bahn 1: ");
76
                Serial.println(Runde11);
77
                Serial.print("Rundenzeit Runde ");                   // Ausgabe Serial Monitor Rundenzeit1
78
                Serial.print(": " );
79
                Serial.print(Rundenzeit1);
80
                Serial.println(" Sekunden");
81
                
82
               Geschwindigkeit1 = 0.0051 / (Rundenzeit1 / 3600) ;    // Geschwindigkeit1 in km/h  = 0,51 m Steckenlänge/ (Rundenzeit1 in Millisekunden / 3600 Sekunden)         
83
               
84
               Serial.print("Durchschnittsgeschwindigkeit der letzten Runde ");        // Ausgabe Serial Monitor
85
               Serial.print(Geschwindigkeit1);
86
               Serial.println( " km/h");
87
               Serial.println(" ");
88
             } 
89
             if (Runde1==1){Start1 = millis();}                     // Wenn Runde1 ==1 dann Start1 mit Gesamtmessung 
90
             
91
             if (Runde11 == 3)                                      // Ende nach gewünschten Runden z.B 10 Runden i
92
             {
93
                Gesamtzeit1 = (millis() - Start1)/1000;             // Gesamtzeit1 = Millis  - Start1/1000 wegen Sekunden
94
                Serial.print("Gesamtzeit Bahn1 ");                  // Ausgabe Serial Monitor
95
                Serial.print(": " );
96
                Serial.print(Gesamtzeit1);
97
                Serial.println(" Sekunden");
98
                Serial.println(" ");
99
             }
100
               Rundenanfang1 = millis();                            // Wenn Lichtschranke unterbrochen dann mit Rundenmessung beginnen
101
               if (Runde1==99) { Runde1=0;}                         // Wenn Runde 99 erreicht, dann zurücksetzen auf 0
102
               
103
          }
104
        }
105
    
106
          letzteRunde1 = Lichtschrankeunterbrochen1;                 // Den letzten Schalterzustand merken
107
          
108
          // Zeitmessung Bahn2
109
          
110
           if (digitalRead(reset) == HIGH)     // Wenn Reset 1, Dann Runde2 = 0, Runde wird zurückgesetzt
111
               Runde2 = 0;
112
113
          Lichtschrankeunterbrochen2 = digitalRead(Lichtschranke2);  // Lichtschranke2 Wert lesen und in Varibale Lichtschrankeunterbrochen2 speichern
114
          if (Lichtschrankeunterbrochen2 != letzteRunde2)            // Der Zustand des Schalters hat sich verändert 
115
          { 
116
            if (Lichtschrankeunterbrochen2 == LOW)                   // Wenn Lichtschranke unterbrochen dann  
117
            { Runde2++;                                              // Runde2 hochzählen +1
118
              
119
              Runde22 = Runde2 - 1;                                  // Variable für Ausgaben Rundenzeit Runde -1 wegen Anzeige auf Serialmonitor
120
              
121
             
122
                if (Runde2 > 1)                                      // Wenn Runde größer 1 dann 
123
              {
124
                Rundenzeit2 = (millis() - Rundenanfang2)/1000;       // Rundenzeit2 = Millis  - Rundenanfang2 /1000 wegen Sekunden
125
                Serial.print("Runde Bahn 2: ");
126
                Serial.println(Runde22);
127
                Serial.print("Rundenzeit Runde ");                   // Ausgabe Serial Monitor Rundenzeit2
128
                Serial.print(": " );
129
                Serial.print(Rundenzeit2);
130
                Serial.println(" Sekunden");
131
                
132
               Geschwindigkeit2 = 0.0051 / (Rundenzeit2 / 3600) ;    // Geschwindigkeit2 in km/h  = 0,51 m Steckenlänge/ (Rundenzeit2 in Millisekunden / 3600 Sekunden)         
133
               
134
               Serial.print("Durchschnittsgeschwindigkeit der letzten Runde ");        // Ausgabe Serial Monitor
135
               Serial.print(Geschwindigkeit2);
136
               Serial.println( " km/h");
137
               Serial.println(" ");
138
             } 
139
             if (Runde2==1){Start2 = millis();}                     // Wenn Runde2 ==1 dann Start2 mit Gesamtmessung 
140
             
141
             if (Runde22 == 3)                                      // Ende nach gewünschten Runden z.B 10 Runden i
142
             {
143
                Gesamtzeit2 = (millis() - Start2)/1000;             // Gesamtzeit2 = Millis  - Start2/1000 wegen Sekunden
144
                Serial.print("Gesamtzeit Bahn2 ");                  // Ausgabe Serial Monitor
145
                Serial.print(": " );
146
                Serial.print(Gesamtzeit2);
147
                Serial.println(" Sekunden");
148
                Serial.println(" ");
149
             }
150
              Rundenanfang2 = millis();                              // Wenn Lichtschranke unterbrochen dann mit Rundenmessung beginnen
151
              
152
               if (Runde2==99) { Runde2=0;}                         // Wenn Runde 99 erreicht, dann zurücksetzen auf 0
153
               
154
          
155
        }
156
    
157
          letzteRunde2 = Lichtschrankeunterbrochen2;                 // Den letzten Schalterzustand merken
158
          
159
      }
160
        auszugebende_Zahl = Runde1 * 100 + Runde2;                   // Formel umd Runden am Display anzuzeigen
161
        sevseg.NewNum(auszugebende_Zahl,(byte) 2);                   // Ausgabe zum 4 stelligen 7 Segmentanzeige
162
}

von biede1987 (Gast)


Lesenswert?

Hallo nochmals ich möchte jetzt noch die beste Rundenzeit auswerten!

wie kann ich das machen?

wie kann ich es machen das sich der Atmega die Rundenzeiten sich merkt 
und vergleicht?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.