Hochzählen mit 7 Segmentanzeige

Gast #3361833
Lesenswert?

Hallo
ich möchte mit einer 7 Segmentanzeige und einem Taster die funktion 
darstellen, sobald ich den Taster drücke, soll die 7 Segmentanzeige 
hochzählen.

Ich programmier mit dem Board arduino duemilanove



ich hab aus dem Internent ein Programm gefunden (tutorial), bei dem ich 
das versuche zu verstehn. aber es kommt bei arduino immer eine 
fehlermeldung,

wisst ihr warum, wer schön wenn ihr mir helfen könntet

http://www.freeduino.de/books/arduino-tutorial-lady-ada/lektion-5-arduino-inputs/tastendr%C3%BCcke-z%C3%A4hlen
Gast #3361846
Lesenswert?

"
sketch_oct16a.ino: In function 'void setup()':
sketch_oct16a:19: error: a function-definition is not allowed here 
before '{' token
sketch_oct16a:29: error: expected `}' at end of input"

hast du auch ein arduino?

da passt irgendwas nicht mit den klammern?
Gast #3361848
Lesenswert?

das programm von der seite

hat nichts mit der 7 segemntanzeige zu tun, das mach ich für mich selber

ich hab das nur versucht zu verstehn wie er addiert, da ich aber das 
programm nicht draufspielen kann, weiß ich nicht obs überhaupt geht!
#3361860
Lesenswert?

biede1987 schrieb:
> "
> sketch_oct16a.ino: In function 'void setup()':
> sketch_oct16a:19: error: a function-definition is not allowed here
> before '{' token
> sketch_oct16a:29: error: expected `}' at end of input"
>
> hast du auch ein arduino?
>
> da passt irgendwas nicht mit den klammern?

Richtig.

Hier ist das Original, wenn man es mal ein wenig ordentlich formatiert
1
/* * Tastendrücke zählen */
2
int switchPin = 2;         // Schalter ist mit Pin 2 verbunden
3
int val;                   // Variable für den Pin Zustand
4
int buttonState;           // Variable für den letzten Schalterzustand
5
int buttonPresses = 0;     // Wie oft ist der Schalter gedrückt
6

7
void setup()
8
{
9
  pinMode(switchPin, INPUT);             // Schalter-Pin ist Input
10
  Serial.begin(9600);                    // Start der seriellen Kommunikation mit 9600bps
11
  buttonState = digitalRead(switchPin);  // Anfangszustand lesen
12
}
13

14
void loop()
15
{
16
  val = digitalRead(switchPin);          // Eingabewert lesen und in val speichern
17
  if (val != buttonState) {              // Der Zustand des Schalters hat sich verändert
18
    if (val == LOW) {                    // Ist der Schalter gedrückt?
19
      buttonPresses++;                   // Inkrementieren der Variablen buttonPresses
20
      Serial.print("Schalter wurde ");
21
      Serial.print(buttonPresses);
22
      Serial.println(" gedrueckt");
23
    }
24
  }
25

26
  buttonState = val;                     // Den Zustand merken
27
}

da ist nichts von fehlerhaften Klammern zu sehen.
D.h. es ist die Vermutung naheliegend, dass du selbst irgendwo einen 
Fehler gemacht hast, als du den Code übernommen, formatiert bzw. 
angepasst hast.

-> zeige nicht den Code den du von irgendwo übernommen hast, sondern 
zeige immer den Code, so wie DU ihn verwendest.


> ich hab das nur versucht zu verstehn wie er addiert, da
> ich aber das programm nicht draufspielen kann, weiß ich
> nicht obs überhaupt geht!

Lies die Fehlermeldung, versuch sie zu verstehen, bilde eine Hypothese 
und ändere das was du hast entsprechend ab. Das gehört genauso zum 
Programmieren dazu, wie alles andere, dass man mit Fehlermeldungen was 
anfangen kann.
PS: man konzentriert sich immer auf die erste bzw. auf die ersten paar 
Fehlermeldung.
Die erste lautet
> In function 'void setup()':
Das ist für sich alleine gesehen noch nicht sehr aussagekräftig. Aber es 
gibt zumindest mal einen Hinweis darauf, an welcher Stelle ungefähr das 
Problem existiert. Da ist von der Funktion setup die Rede. Also wird man 
dort mal näher nachsehen.

> sketch_oct16a:19: error: a function-definition is not allowed
> here before '{' token

Aha. da ist von der { die Rede.
Also sieht man sich da mal alle offnenden { an. Macht vielleicht erst 
mal fehlende Einrückungen um zu sehen, wo da was nicht stimmt.
#3361884
Lesenswert?

Lass mich raten.

Du hast beim Aufteilen des original Kauderwelsch an dieser Stelle
1
  buttonState = digitalRead(switchPin);  // Anfangszustand lesen
2
}

die } übersehen.

-> Es ist immer eine gute Idee, seinen Code ORDENTLICH zu formatieren. 
Inklusive Einrückungen.
Denn dann SIEHT man optisch, wie die Dinge zusammenhängen. Zum Beispiel 
findet man die zu einer schliessenden } gehörende entsprechende öffnende 
{. Denn die muss in der Zeile stehen, in der der Programmtext in genau 
der gleichen Spalte beginnt.
Gast #3361928
Lesenswert?

ne ich hab ganz zum schluss die Klammer nicht runter gesetzt

 Serial.println(" gedrueckt");
}
}

  buttonState = val;                     // Den Zustand merken}



hätte ich eigentlich selber sehen müssen, trotzdem vielen dank
Gast #3361933
Lesenswert?

hier ist mein Programm für die 7 Segment anzeige
1
  // Lichtschranke ist ein Taster und alle Segmente werden angesteuert bei 0 und bei 1 gehen sie aus
2

3
    int Lichtschranke = 11; // oder Taster
4
    int Runde; // Variable für den Pin Zustand 
5
    int buttonState; // Variable für den letzten Schalterzustand 
6
    int buttonPresses = 0; // Wie oft ist der Schalter gedrückt   
7

8
    int a = 2; // a
9
    int b = 3;
10
    int c = 4;
11
    int d = 5;
12
    int e = 6;
13
    int f = 7;
14
    int g = 8;
15

16

17

18
    void setup(){
19
 
20
  Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
21
  pinMode(Lichtschranke,INPUT);
22
  pinMode(a,OUTPUT);
23
  pinMode(b,OUTPUT);
24
  pinMode(c,OUTPUT);
25
  pinMode(d,OUTPUT);
26
  pinMode(e,OUTPUT);
27
  pinMode(f,OUTPUT);
28
  pinMode(g,OUTPUT);
29
  
30
  buttonState = digitalRead(Lichtschranke); // Start der seriellen Kommunikation mit 9600bps 
31
  
32
}
33
  
34
  void loop() { 
35
    
36
    Runde = digitalRead(Lichtschranke);
37
    if (Runde != buttonState) { // Der Zustand des Schalters hat sich verändert 
38

39
        if (Runde == HIGH) { // Ist der Schalter gedrückt? 
40

41
        buttonPresses++; // Inkrementieren der Variablen buttonPresses 
42

43
                                   // Serial.println(Runde,DEC);
44
                                     // if (Runde == HIGH)
45
        Serial.print("Schalter wurde ");
46
        Serial.print(buttonPresses);
47
        Serial.println(" gedrueckt");
48
    
49
  
50
    if (Runde=0)
51
    {
52
      digitalWrite(a,LOW);
53
      digitalWrite(b,LOW);
54
      digitalWrite(c,LOW);
55
      digitalWrite(d,LOW);
56
      digitalWrite(e,LOW);
57
      digitalWrite(f,LOW);
58
      digitalWrite(g,HIGH);
59
      }
60

61
      if (Runde=1)
62
      {
63
      digitalWrite(a,1);
64
      digitalWrite(b,0);
65
      digitalWrite(c,0);
66
      digitalWrite(d,1);
67
      digitalWrite(e,1);
68
      digitalWrite(f,1);
69
      digitalWrite(g,1);
70
      }
71
      
72
      if (Runde=2)
73
      {
74
      digitalWrite(a,0);
75
      digitalWrite(b,0);
76
      digitalWrite(c,1);
77
      digitalWrite(d,0);
78
      digitalWrite(e,0);
79
      digitalWrite(f,1);
80
      digitalWrite(g,0);
81
      }
82
      
83
      if (Runde=3)
84
      {
85
      digitalWrite(a,0);
86
      digitalWrite(b,0);
87
      digitalWrite(c,0);
88
      digitalWrite(d,0);
89
      digitalWrite(e,1);
90
      digitalWrite(f,1);
91
      digitalWrite(g,0);
92
      }
93
      
94
      
95
      if (Runde=4)
96
      {
97
      digitalWrite(a,1);
98
      digitalWrite(b,0);
99
      digitalWrite(c,0);
100
      digitalWrite(d,1);
101
      digitalWrite(e,1);
102
      digitalWrite(f,0);
103
      digitalWrite(g,0);
104
      }
105
      
106
      if (Runde=5)
107
      {
108
      digitalWrite(a,0);
109
      digitalWrite(b,1);
110
      digitalWrite(c,0);
111
      digitalWrite(d,0);
112
      digitalWrite(e,1);
113
      digitalWrite(f,0);
114
      digitalWrite(g,0);
115
      }
116
      
117
      if (Runde=6)
118
      {
119
      digitalWrite(a,0);
120
      digitalWrite(b,1);
121
      digitalWrite(c,0);
122
      digitalWrite(d,0);
123
      digitalWrite(e,0);
124
      digitalWrite(f,0);
125
      digitalWrite(g,0);
126
      }
127
      
128
      if (Runde=7)
129
      {
130
      digitalWrite(a,0);
131
      digitalWrite(b,0);
132
      digitalWrite(c,0);
133
      digitalWrite(d,1);
134
      digitalWrite(e,1);
135
      digitalWrite(f,1);
136
      digitalWrite(g,1);
137
      }
138
      
139
      if (Runde=8)
140
      {
141
      digitalWrite(a,0);
142
      digitalWrite(b,0);
143
      digitalWrite(c,0);
144
      digitalWrite(d,1);
145
      digitalWrite(e,1);
146
      digitalWrite(f,1);
147
      digitalWrite(g,1);
148
      }
149
      
150
      if (Runde=9)
151
      {
152
      digitalWrite(a,0);
153
      digitalWrite(b,0);
154
      digitalWrite(c,0);
155
      digitalWrite(d,0);
156
      digitalWrite(e,1);
157
      digitalWrite(f,0);
158
      digitalWrite(g,0);
159
      }
160
      
161
        }
162
      }
163
      buttonState = Runde;
164
    }
#3361946
Lesenswert?

Ausserdem.
Überleg noch mal ganz stark, welche Variable im Originalcode welche 
Bedeutung hat. Was repräsentiert sie?

Und dann überlag mal ganz stark, was deine Variable 'Runde' eigentlich 
für eine Aufgabe hat. Kann es sinnvoll sein, in Runde das Ergebnis von
1
    Runde = digitalRead(Lichtschranke);
abzulegen?

Eher nicht.
'Runde' soll darüber Buch führen, in welcher Runde sich dein (Carrera-) 
Auto)?) sich befindet. Was bitte hat das damit zu tun, ob die 
Lichtschranke unterbrochen ist oder nicht?

In welcher Variablen wird denn hier
1
void loop()
2
{
3
  val = digitalRead(switchPin);          // Eingabewert lesen und in val speichern
4
  if (val != buttonState) {              // Der Zustand des Schalters hat sich verändert
5
    if (val == LOW) {                    // Ist der Schalter gedrückt?
6
      buttonPresses++;                   // Inkrementieren der Variablen buttonPresses
7
      Serial.print("Schalter wurde ");
8
      Serial.print(buttonPresses);
9
      Serial.println(" gedrueckt");
10
    }
11
  }
12

13
  buttonState = val;                     // Den Zustand merken
14
}
eigentlich gezählt?

Hinweis: Es ist NICHT 'val'! Die Variable 'val' sollte in diesem Code 
besser 'buttonStateNow' heißen. Der Name dieser Variablen ist nämlich 
irreführend.
1
void loop()
2
{
3
  buttonStateNow = digitalRead(switchPin);          // Eingabewert lesen und in val speichern
4
  if (buttonStateNow != buttonState) {              // Der Zustand des Schalters hat sich verändert
5
    if (buttonStateNow == LOW) {                    // Ist der Schalter gedrückt?
6
      buttonPresses++;                   // Inkrementieren der Variablen buttonPresses
7
      Serial.print("Schalter wurde ");
8
      Serial.print(buttonPresses);
9
      Serial.println(" gedrueckt");
10
    }
11
  }
12

13
  buttonState = buttonStateNow;                     // Den Zustand merken
14
}

Hier ....
1
    if (buttonStateNow == LOW) {                    // Ist der Schalter gedrückt?
2
      buttonPresses++;                   // Inkrementieren der Variablen buttonPresses
... steckt die Zählvariable! buttonPresses repräsentiert den Zähler! 
Erkennt man auch am Kommentar, bzw. daran, dass in weiterer Folge im 
Code mit dieser Variablen etwas gemacht wird ...
1
      Serial.print("Schalter wurde ");
2
      Serial.print(buttonPresses);
3
      Serial.println(" gedrueckt");
... in diesem konkreten Fall eben über die Serielle ausgeben.
Gast #3361959
Lesenswert?

1
// Lichtschranke ist ein Taster und alle Segmente werden angesteuert bei 0 und bei 1 gehen sie aus
2

3
    int Lichtschranke = 11; // oder Taster
4
    int var; // Variable für den Pin Zustand 
5
    int buttonState; // Variable für den letzten Schalterzustand 
6
    int Runde = 0; // Wie oft ist der Schalter gedrückt   
7

8
    int a = 2; // a
9
    int b = 3;
10
    int c = 4;
11
    int d = 5;
12
    int e = 6;
13
    int f = 7;
14
    int g = 8;
15

16

17

18
    void setup(){
19
 
20
  Serial.begin(9600); // Start der seriellen Kommunikation mit 9600bps
21
  pinMode(Lichtschranke,INPUT);
22
  pinMode(a,OUTPUT);
23
  pinMode(b,OUTPUT);
24
  pinMode(c,OUTPUT);
25
  pinMode(d,OUTPUT);
26
  pinMode(e,OUTPUT);
27
  pinMode(f,OUTPUT);
28
  pinMode(g,OUTPUT);
29
  
30
  buttonState = digitalRead(Lichtschranke); // Start der seriellen Kommunikation mit 9600bps 
31
  
32
}
33
  
34
  void loop() { 
35
    
36
    var = digitalRead(Lichtschranke);
37
    if (var != buttonState) { // Der Zustand des Schalters hat sich verändert 
38

39
        if (var == HIGH) { // Ist der Schalter gedrückt? 
40

41
        Runde++; // Inkrementieren der Variablen Runde 
42

43
                                   // Serial.println(var,DEC);
44
                                     // if (var == HIGH)
45
        Serial.print("Schalter wurde ");
46
        Serial.print(Runde);
47
        Serial.println(" gedrueckt");
48
    
49
  
50
    if (Runde==0)
51
    {
52
      digitalWrite(a,1);
53
      digitalWrite(b,1);
54
      digitalWrite(c,1);
55
      digitalWrite(d,1);
56
      digitalWrite(e,LOW);
57
      digitalWrite(f,LOW);
58
      digitalWrite(g,HIGH);
59
      }
60

61
      if (Runde==1)
62
      {
63
      digitalWrite(a,1);
64
      digitalWrite(b,0);
65
      digitalWrite(c,0);
66
      digitalWrite(d,1);
67
      digitalWrite(e,1);
68
      digitalWrite(f,1);
69
      digitalWrite(g,1);
70
      }
71
      
72
      if (Runde==2)
73
      {
74
      digitalWrite(a,0);
75
      digitalWrite(b,0);
76
      digitalWrite(c,1);
77
      digitalWrite(d,0);
78
      digitalWrite(e,0);
79
      digitalWrite(f,1);
80
      digitalWrite(g,0);
81
      }
82
      
83
      if (Runde==3)
84
      {
85
      digitalWrite(a,0);
86
      digitalWrite(b,0);
87
      digitalWrite(c,0);
88
      digitalWrite(d,0);
89
      digitalWrite(e,1);
90
      digitalWrite(f,1);
91
      digitalWrite(g,0);
92
      }
93
      
94
      
95
      if (Runde==4)
96
      {
97
      digitalWrite(a,1);
98
      digitalWrite(b,0);
99
      digitalWrite(c,0);
100
      digitalWrite(d,1);
101
      digitalWrite(e,1);
102
      digitalWrite(f,0);
103
      digitalWrite(g,0);
104
      }
105
      
106
      if (Runde==5)
107
      {
108
      digitalWrite(a,0);
109
      digitalWrite(b,1);
110
      digitalWrite(c,0);
111
      digitalWrite(d,0);
112
      digitalWrite(e,1);
113
      digitalWrite(f,0);
114
      digitalWrite(g,0);
115
      }
116
      
117
      if (Runde==6)
118
      {
119
      digitalWrite(a,0);
120
      digitalWrite(b,1);
121
      digitalWrite(c,0);
122
      digitalWrite(d,0);
123
      digitalWrite(e,0);
124
      digitalWrite(f,0);
125
      digitalWrite(g,0);
126
      }
127
      
128
      if (Runde==7)
129
      {
130
      digitalWrite(a,0);
131
      digitalWrite(b,0);
132
      digitalWrite(c,0);
133
      digitalWrite(d,1);
134
      digitalWrite(e,1);
135
      digitalWrite(f,1);
136
      digitalWrite(g,1);
137
      }
138
      
139
      if (Runde==8)
140
      {
141
      digitalWrite(a,0);
142
      digitalWrite(b,0);
143
      digitalWrite(c,0);
144
      digitalWrite(d,1);
145
      digitalWrite(e,1);
146
      digitalWrite(f,1);
147
      digitalWrite(g,1);
148
      }
149
      
150
      if (Runde==9)
151
      {
152
      digitalWrite(a,0);
153
      digitalWrite(b,0);
154
      digitalWrite(c,0);
155
      digitalWrite(d,0);
156
      digitalWrite(e,1);
157
      digitalWrite(f,0);
158
      digitalWrite(g,0);
159
      }
160
      
161
        }
162
      }
163
      buttonState = var; //Den Zustand merken
164
    }
Gast #3361962
Lesenswert?

ja du hattest recht ich hab die "runde" als "var" geschrieben das war 
falsch,

jetzt hab ich buttonpresses ersetzt durch Runde,

und meine alte Runde ist jetzt einfach ein variabler Wert.

ich glaub jetzt wirds logischer oder was meinst
#3361973
Lesenswert?

biede1987 schrieb:

> ich glaub jetzt wirds logischer oder was meinst

Ich seh noch nicht, inwiefern mir beim lesen des Codes ein Variablenname 
von 'var' etwas über die Funktion der Variablen innerhalb des Programmes 
verrät.

var ist reichlich nichtssagend. Wenn du eine Variable brauchst, deren 
Aussage darin besteht, ob die Lichtschranke unterbrochen ist oder nicht, 
dann sollte wohl der Variablenname das auch irgendwie andeuten. Ich 
würde da irgendwie die Begriffe 'Lichtschranke' bzw. 'Unterbrochen' bzw. 
'Status' ins Spiel bringen. Selbiges für 'buttonState'. Hast du denn 
einen Button (einen Drückknopf)? Nein, hast du nicht. Du hast eine 
Lichtschranke. Eine Lichtschranke ist aber kein Button.


Du magst das jetzt als kleinlich empfinden. Aber in größeren Programmen 
ist es unabdingbar, dass mir der Code selber etwas erzählt. Zb durch gut 
gewählte Variablennamen. Eine Codestelle
1
  NettoPreis = BruttoPreis + BruttoPreis * Steuersatz;
braucht keinen Kommentar. Die Variablennamen sind so gewählt, dass mir 
der Code selber erzählt, was hier passiert. Und genau das ist das Ziel: 
Kommentare überflüssig machen, indem der Kommentar schon in der 
Formulierung des Codes integriert ist.
Gast #3361976
Lesenswert?

jep funktioniert war noch ein fehler drin bei der

8

die hab falsch dargestellt,



und am anfang wenn 0 Runden sind,

zeigt er mir eine 8 statt eine 0 obwohl ich die ausgänge richtig gesetzt 
habe

weißt du warum?
#3361979
Lesenswert?

Wenn du deinen Code ordentlich Einrücken würdest, würdest du es auch 
sehen.

Wenn am Anfang alles auf 0 ist, ist den Ausgängen noch nie irgendetwas 
zugewiesen worden.
Erst mit dem ersten Puls, den dein Programm mittels Lichtschranke 
feststellt, steuert dein Programm das erste mal die 7-Segment Ausgänge 
an.
Deine Anzeige zeigt daher am Anfang deswegen '8' an, weil es so ist, 
dass der Default-Zustand der Ausgänge nun mal 0 ist. D.h. alle deine 
Ausgänge sind auf 0, womit alle Segmente leuchten und du das als 8 
fehlinterpretierst. Wäre der Dezimalpunkt deiner Anzeige auch 
angeschlossen, dann könntest du sehen, dass der genauso leuchtet.

deine Programmlogik sieht zur Zeit so aus
1
void loop()
2
{
3
  if( Puls an der Lichtschranke )
4
  {
5
    erhöhe Zähler
6
    gib den Zähler aus
7
  }
8
}

Aber was ist am Anfang? Wenn noch kein Puls von der Lichtschranke 
festgestellt wurde? Dann ist auch nie irgendetwas ausgegeben worden.



-> deutlicher Hinweis darauf, dass die Größe der Funktion loop schon das 
Mass überschritten hast, das du noch überblicken kannst.
Es wird Zeit, dass du die Ansteurung der 7_Segment Anzeige in eine 
eigene Funktion auslagerst.
Gast #3361993
Lesenswert?

ok ich versuch jetzt mal mit Hilfe eines zweiten Schalters die Runden 
immer am Anfang auf 0 zurücksetzten. Ein Resetschalter.


wenn das funktioniert, will ich mich informieren wie ich eine  4 
Segmentanzeige ansteuere.da kommen dann bestimmt wieder fragen auf!

ich versuch des jetzt mal mit dem Resettaster und tu nochmal mein 
Programm verbessern.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren