Forum: Mikrocontroller und Digitale Elektronik Arduino Münzprüfer Fehler bei mehreren Eingängen


von Marian G. (houwdy)


Lesenswert?

Hallo,
ich habe einen simplen Münzprüfer gebaut welcher nach Münzeinwurf und 
betätigen eines Tasters die darunterliegende Steckdose für 3 Stunden mit 
Strom versorgt. Bei Einwurf einer Münze welche über eine Rampe mit 
Öffnungen rollt wird wenn sie die mechanische Prüfung besteht und nicht 
durch die Öffnungen fällt ein Taster (Pin0) betätigt. Anschliesend soll 
einer der 16 Taster (Pin1-16) für die jeweilige Schuko gedrückt werden, 
dadurch wird der jeweilige Ausgang( Pin 18-33) für eine einstellbare 
Zeit auf High geschaltet.

Soweit die Theorie. Das ganze funktioniert mit zwei IOs auch ganz 
normal. leider mit 16 nicht mehr und ich schau schon seit 2 Stunden 
darauf und find den Fehler nicht...

kann von euch bitte mal einer darüberschauen und mir meinen Fehler 
sagen?
Die Hardware ist ein Arduino Mega2560

Ich bedanke mich schon mal herzlich.

hier der Code:
1
const int coinPin = 0;
2
3
const int buttonPin01 = 1;
4
const int buttonPin02 = 2;
5
const int buttonPin03 = 3;
6
const int buttonPin04 = 4;
7
const int buttonPin05 = 5;
8
const int buttonPin06 = 6;
9
const int buttonPin07 = 7;
10
const int buttonPin08 = 8;
11
const int buttonPin09 = 9;
12
const int buttonPin10 = 10;
13
const int buttonPin11 = 11;
14
const int buttonPin12 = 12;
15
const int buttonPin13 = 13;
16
const int buttonPin14 = 14;
17
const int buttonPin15 = 15;
18
const int buttonPin16 = 16;
19
20
const int ledPin1 =  18;
21
const int ledPin2 =  19;
22
const int ledPin3 =  20;
23
const int ledPin4 =  21;
24
const int ledPin5 =  22;
25
const int ledPin6 =  23;
26
const int ledPin7 =  24;
27
const int ledPin8 =  25;
28
const int ledPin9 =  26;
29
const int ledPin10 =  27;
30
const int ledPin11 =  28;
31
const int ledPin12 =  29;
32
const int ledPin13 =  30;
33
const int ledPin14 =  31;
34
const int ledPin15 =  32;
35
const int ledPin16 =  33;
36
37
int buttonState01 = 0;
38
int buttonState02 = 0;
39
int buttonState03 = 0;
40
int buttonState04 = 0;
41
int buttonState05 = 0;
42
int buttonState06 = 0;
43
int buttonState07 = 0;
44
int buttonState08 = 0;
45
int buttonState09 = 0;
46
int buttonState10 = 0;
47
int buttonState11 = 0;
48
int buttonState12 = 0;
49
int buttonState13 = 0;
50
int buttonState14 = 0;
51
int buttonState15 = 0;
52
int buttonState16 = 0;
53
54
int buttonVal01 =0;
55
int buttonVal02 =0;
56
int buttonVal03 =0;
57
int buttonVal04 =0;
58
int buttonVal05 =0;
59
int buttonVal06 =0;
60
int buttonVal07 =0;
61
int buttonVal08 =0;
62
int buttonVal09 =0;
63
int buttonVal10 =0;
64
int buttonVal11 =0;
65
int buttonVal12 =0;
66
int buttonVal13 =0;
67
int buttonVal14 =0;
68
int buttonVal15 =0;
69
int buttonVal16 =0;
70
71
int coinState =0;
72
int Coin =0;
73
int timeVal = 50;
74
75
void setup() {
76
77
pinMode(ledPin1, OUTPUT);
78
pinMode(ledPin2, OUTPUT);
79
pinMode(ledPin3, OUTPUT);
80
pinMode(ledPin4, OUTPUT);
81
pinMode(ledPin5, OUTPUT);
82
pinMode(ledPin6, OUTPUT);
83
pinMode(ledPin7, OUTPUT);
84
pinMode(ledPin8, OUTPUT);
85
pinMode(ledPin9, OUTPUT);
86
pinMode(ledPin10, OUTPUT);
87
pinMode(ledPin11, OUTPUT);
88
pinMode(ledPin12, OUTPUT);
89
pinMode(ledPin13, OUTPUT);
90
pinMode(ledPin14, OUTPUT);
91
pinMode(ledPin15, OUTPUT);
92
pinMode(ledPin16, OUTPUT);
93
94
pinMode(buttonPin01, INPUT);
95
pinMode(buttonPin02, INPUT);
96
pinMode(buttonPin03, INPUT);
97
pinMode(buttonPin04, INPUT);
98
pinMode(buttonPin05, INPUT);
99
pinMode(buttonPin06, INPUT);
100
pinMode(buttonPin07, INPUT);
101
pinMode(buttonPin08, INPUT);
102
pinMode(buttonPin09, INPUT);
103
pinMode(buttonPin10, INPUT);
104
pinMode(buttonPin11, INPUT);
105
pinMode(buttonPin12, INPUT);
106
pinMode(buttonPin13, INPUT);
107
pinMode(buttonPin14, INPUT);
108
pinMode(buttonPin15, INPUT);
109
pinMode(buttonPin16, INPUT);
110
111
pinMode(coinPin, INPUT);
112
113
}
114
void loop(){
115
coinState = digitalRead(coinPin);
116
117
if (coinState == LOW) {
118
  Coin = 1;
119
}
120
if (digitalRead(buttonPin01) == LOW&& Coin ==1) {
121
  buttonVal01 = timeVal;
122
  Coin =0;
123
}
124
else if (digitalRead(buttonPin02) == LOW&& Coin ==1) {
125
  buttonVal02 = timeVal;
126
  Coin =0;
127
}
128
129
else if (digitalRead(buttonPin03) == LOW&& Coin ==1) {
130
  buttonVal03 = timeVal;
131
  Coin =0;
132
}
133
else if (digitalRead(buttonPin04) == LOW&& Coin ==1) {
134
  buttonVal04 = timeVal;
135
  Coin =0;
136
}
137
else if (digitalRead(buttonPin05) == LOW&& Coin ==1) {
138
  buttonVal05 = timeVal;
139
  Coin =0;
140
}
141
else if (digitalRead(buttonPin06) == LOW&& Coin ==1) {
142
  buttonVal06 = timeVal;
143
  Coin =0;
144
}
145
else if (digitalRead(buttonPin07) == LOW&& Coin ==1) {
146
  buttonVal07 = timeVal;
147
  Coin =0;
148
}
149
else if (digitalRead(buttonPin08) == LOW&& Coin ==1) {
150
  buttonVal08 = timeVal;
151
  Coin =0;
152
}
153
else if (digitalRead(buttonPin09) == LOW&& Coin ==1) {
154
  buttonVal09 = timeVal;
155
  Coin =0;
156
}
157
else if (digitalRead(buttonPin10) == LOW&& Coin ==1) {
158
  buttonVal10 = timeVal;
159
  Coin =0;
160
}
161
else if (digitalRead(buttonPin11) == LOW&& Coin ==1) {
162
  buttonVal11 = timeVal;
163
  Coin =0;
164
}
165
else if (digitalRead(buttonPin12) == LOW&& Coin ==1) {
166
  buttonVal12 = timeVal;
167
  Coin =0;
168
}
169
else if (digitalRead(buttonPin13) == LOW&& Coin ==1) {
170
  buttonVal13 = timeVal;
171
  Coin =0;
172
}
173
else if (digitalRead(buttonPin14) == LOW&& Coin ==1) {
174
  buttonVal14 = timeVal;
175
  Coin =0;
176
}
177
else if (digitalRead(buttonPin15) == LOW&& Coin ==1) {
178
  buttonVal15 = timeVal;
179
  Coin =0;
180
}
181
else if (digitalRead(buttonPin16) == LOW&& Coin ==1) {
182
  buttonVal16 = timeVal;
183
  Coin =0;
184
}
185
186
if (buttonVal01 <<0 ) {
187
  digitalWrite(ledPin1, HIGH);
188
  buttonVal01=buttonVal01-1;
189
}
190
if (buttonVal01 ==0 ) {
191
  digitalWrite(ledPin1, LOW);
192
}
193
if (buttonVal02 <<0 ) {
194
  digitalWrite(ledPin2, HIGH);
195
  buttonVal02=buttonVal02-1;
196
}
197
if (buttonVal02 ==0 ) {
198
  digitalWrite(ledPin2, LOW);
199
}
200
201
if (buttonVal03 <<0 ) {
202
  digitalWrite(ledPin3, HIGH);
203
  buttonVal03=buttonVal03-1;
204
}
205
if (buttonVal03 ==0 ) {
206
  digitalWrite(ledPin3, LOW);
207
}
208
209
if (buttonVal04 <<0 ) {
210
  digitalWrite(ledPin4, HIGH);
211
  buttonVal04=buttonVal04-1;
212
}
213
if (buttonVal04 ==0 ) {
214
  digitalWrite(ledPin4, LOW);
215
}
216
217
if (buttonVal05 <<0 ) {
218
  digitalWrite(ledPin5, HIGH);
219
  buttonVal05=buttonVal05-1;
220
}
221
if (buttonVal05 ==0 ) {
222
  digitalWrite(ledPin5, LOW);
223
}
224
if (buttonVal06 <<0 ) {
225
  digitalWrite(ledPin6, HIGH);
226
  buttonVal06=buttonVal06-1;
227
}
228
if (buttonVal06 ==0 ) {
229
  digitalWrite(ledPin6, LOW);
230
}
231
if (buttonVal07 <<0 ) {
232
  digitalWrite(ledPin7, HIGH);
233
  buttonVal07=buttonVal07-1;
234
}
235
if (buttonVal07 ==0 ) {
236
  digitalWrite(ledPin7, LOW);
237
}
238
if (buttonVal08 <<0 ) {
239
  digitalWrite(ledPin8, HIGH);
240
  buttonVal08=buttonVal08-1;
241
}
242
if (buttonVal08 ==0 ) {
243
  digitalWrite(ledPin8, LOW);
244
}
245
if (buttonVal09 <<0 ) {
246
  digitalWrite(ledPin9, HIGH);
247
  buttonVal09=buttonVal09-1;
248
}
249
if (buttonVal09 ==0 ) {
250
  digitalWrite(ledPin9, LOW);
251
}
252
if (buttonVal10 <<0 ) {
253
  digitalWrite(ledPin10, HIGH);
254
  buttonVal10=buttonVal10-1;
255
}
256
if (buttonVal10 ==0 ) {
257
  digitalWrite(ledPin10, LOW);
258
}
259
if (buttonVal11 <<0 ) {
260
  digitalWrite(ledPin11, HIGH);
261
  buttonVal11=buttonVal11-1;
262
}
263
if (buttonVal11 ==0 ) {
264
  digitalWrite(ledPin11, LOW);
265
}
266
if (buttonVal12 <<0 ) {
267
  digitalWrite(ledPin12, HIGH);
268
  buttonVal12=buttonVal12-1;
269
}
270
if (buttonVal12 ==0 ) {
271
  digitalWrite(ledPin12, LOW);
272
}
273
if (buttonVal13 <<0 ) {
274
  digitalWrite(ledPin13, HIGH);
275
  buttonVal13=buttonVal13-1;
276
}
277
if (buttonVal13 ==0 ) {
278
  digitalWrite(ledPin13, LOW);
279
}
280
281
if (buttonVal14 <<0 ) {
282
  digitalWrite(ledPin14, HIGH);
283
  buttonVal14=buttonVal14-1;
284
}
285
if (buttonVal14 ==0 ) {
286
  digitalWrite(ledPin14, LOW);
287
}
288
289
if (buttonVal15 <<0 ) {
290
  digitalWrite(ledPin15, HIGH);
291
  buttonVal15=buttonVal15-1;
292
}
293
if (buttonVal15 ==0 ) {
294
  digitalWrite(ledPin15, LOW);
295
}
296
297
if (buttonVal16 <<0 ) {
298
  digitalWrite(ledPin16, HIGH);
299
  buttonVal16=buttonVal16-1;
300
}
301
if (buttonVal16 ==0 ) {
302
  digitalWrite(ledPin16, LOW);
303
}
304
delay(100);
305
}

: Bearbeitet durch Moderator
von Brain 2.0 (Gast)


Lesenswert?

Was genau funktioniert nicht ?

Hast du für die Eingänge Pullup-Widerstände verbaut ?

von houwdy (Gast)


Lesenswert?

Interessanterweise macht er gar nichts mehr mit drei oder mehr 
Eingängen, die Pegel sind definiert mit pullups.

von Dussel (Gast)


Lesenswert?

Was soll
if (buttonVal01 <<0 ) {
bringen? Damit testest du, ob buttonValxx ungleich null ist. Willst du 
das? Warum dann so komisch geschrieben?

von Brain 2.0 (Gast)


Lesenswert?

houwdy schrieb:
> Interessanterweise macht er gar nichts mehr mit drei oder mehr
> Eingängen, die Pegel sind definiert mit pullups.

Seltsam !!
Pullups Hardwaremäßig ?
Wie groß ?

von Kaj (Gast)


Lesenswert?

Ich hab mal den Code aufgeraeumt. Sollte aber äqui­va­lent sein
1
#include <stdint.h>
2
3
4
const int16_t coinPin = 0;
5
6
const int16_t buttonPins[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9,
7
                            10, 11, 12, 13, 14, 15, 16};
8
9
const int16_t ledPins[16] = {18, 19, 20, 21, 22, 23, 24, 25,
10
                         26, 27, 28, 29, 30, 31, 32, 33};
11
12
int16_t buttonState[16] = {0};
13
14
int16_t buttonVal[16] = {0};
15
16
int16_t coinState = 0;
17
int16_t Coin = 0;
18
int16_t timeVal = 50;
19
20
21
void setup()
22
{
23
    for (uint8_t i = 0; i < 16; i++) {
24
        pinMode(ledPins[i], OUTPUT);
25
        pinMode(buttonPins[i], INPUT);
26
    }
27
28
    pinMode(coinPin, INPUT);
29
}
30
31
32
void loop()
33
{
34
    coinState = digitalRead(coinPin);
35
36
    if (coinState == LOW) {
37
        Coin = 1;
38
    }
39
40
41
    for (uint8_t i = 0; i < 16; i++) {
42
        if ((digitalRead(buttonPins[i]) == LOW) && (Coin == 1)) {
43
            buttonVal[i] = timeVal;
44
            Coin = 0;
45
46
            break;
47
        }
48
    }
49
50
51
    for (uint8_t i = 0; i < 16; i++) {
52
        if (buttonVal[i] << 0) {
53
            digitalWrite(ledPins[i], HIGH);
54
            buttonVal[i] -= 1;
55
        }
56
57
        if (buttonVal[i] == 0) {
58
            digitalWrite(ledPins[i], LOW);
59
        }
60
    }
61
62
    delay(100);
63
}
Den fehler vom TO 'if (buttonValxx << 0)' hab ich jetzt einfach mal 
uebernommen. keine Ahnung was er da machen moechte.

von Einer (Gast)


Lesenswert?

Das << sollte von der Logik wohl eher ein > sein.

Beitrag #5125629 wurde von einem Moderator gelöscht.
von Eric B. (beric)


Lesenswert?

Kaj schrieb:
>
1
>     for (uint8_t i = 0; i < 16; i++) {
2
>         if ((digitalRead(buttonPins[i]) == LOW) && (Coin == 1)) {
3
>             buttonVal[i] = timeVal;
4
>             Coin = 0;
5
> 
6
>             break;
7
>         }
8
>     }
9
>

Das kann noch vereinfacht werden:
1
    if (Coin == 1) {
2
        for (uint8_t i = 0; i < 16; i++) {
3
            if (digitalRead(buttonPins[i]) == LOW) {
4
                buttonVal[i] = timeVal;
5
                Coin = 0;
6
7
                break;
8
            }
9
        }
10
    }

Beitrag #5125787 wurde vom Autor gelöscht.
von Marian G. (houwdy)


Lesenswert?

Hallo,
sorry ich hab mich gestern glaub ich etwas undeutlich ausgedrückt.
Das lag warscheinlich an der späten Stunde.

Hier nocheinmal die Aufgabenstellung:
Wir bewirtschafen eine Schutzhütte und dort ist der Strom recht rar da 
er nur von einer Photovoltaikanlage zur Verfügung. Um dies kontrollieren 
zu können ( da einige Herrschaften von Fön bis Tauchsieder alles 
mitttragen und uns damit die Hütte finster machen) und auch die 
Betriebskosten zu senken kann man bei uns neben der Küchentüre mit einem 
Euro für 3h Strom kaufen. Diese Schukos sind auf 0,5A mittels 
elektronischer Sicherung abgesichert. Wir hatten bis jetzt 6 Schukos, 
allerdings ist der Bedarf gestiegen und somit habe ich das ganze auf 15 
erweitert. Meine erste Version baute ich in der HTL und sie arbeitet mit 
einem PIC. nun bin ich auf Arduino umgestiegen.

Die Handhabung durch den Kunden läuft wiefolgt:

Euro einwerfen,
Taste über Steckdose drücken,
dann ist für 3h an der jeweiligen Schuko Energie verfügbar.

Vom Code hab ich schon jetzt viel von euch gelernt.
bei uns hies es immer es ist ein Nogo bei der Initialisierung Schleifen 
zu
verwenden. Super wenn er das kann.

Das ganze funktioniert intressanterweise mit zwei Ein und Ausgängen ganz 
normal, so ich 3 nehme macht der Arduino gar nichts mehr.

ich mach noch schnell ein Foto von dem Vorgänger damit ihr euch da etwas 
vorstllen könnt.

Danke Marian

von Marian G. (houwdy)


Angehängte Dateien:

Lesenswert?

So sieht die Pic Version aus

von Dussel (Gast)


Lesenswert?

Es ist ja schön, dass du so viel schreibst, aber die Frage bleibt, was 
du mit
if (buttonVal[i] << 0) {
bewirken willst.

von Leroy M. (mayl)


Lesenswert?

Wie ist die Hardware denn ausgeführt/verschaltet?
Werden die LEDs über einen Treiber versorgt? Ich habe die Daten nicht im 
Kopf, aber ich kann mir vorstellen, 16 gleichzeitig leuchtende LEDs sind 
schon ziemlich viel Strom für den kleinen Arduino.


Zumn Code habe ich noch einen Vorschlag. Derzeit ist die Stromausgabe 
nicht verriegelt. Ich kann also mehrfach hintereinander die gleiche 
Steckdose "kaufen".

Für mich wäre es ziemlich ärgerlich, wenn ich mich vertippe, also eine 
bereits eingeschaltete Steckdose auswähle, und dadurch meinen Euro 
verschenke.
Davor solltest du mit der Programmierung vorgehen, heutzutage gibt es 
genug Idioten, für die das bereits aus, um zum Vandalen zu werden...

von Marian G. (houwdy)


Lesenswert?

int timeVal = 50; // gibt mir die Zeit an die der Ausgang gesetzt werden 
soll
1
if (coinState == LOW) {
2
  Coin = 1;            // Wenn eine Münze eingeworfen wird wird Coin zu 1
3
4
if (digitalRead(buttonPin01) == LOW&& Coin ==1) { // wenn Coin 1 und der Schalter der jeweiligen schuko gedrückt wird wird in Button Val die Zeitkonstante geschrieben und coin auf 0 gesetzt
5
  buttonVal01 = timeVal;
6
  Coin =0;
7
}
8
9
//solange Buttonval größer 0 ist wird die Steckdose eingeschaltet 
10
//das habe ich so realisiert damit jeder der 16 Outputs seine "eigene Zeit" //hat 
11
//und immer die ganze schleife durchlaufen wird ohne das der controller in //einer hängen bleibt. buttonval-- wollte der Compiler komischerweise nicht.
12
13
if (buttonVal01 <<0 ) {
14
  digitalWrite(ledPin1, HIGH);
15
  buttonVal01=buttonVal01-1;
16
}
17
18
//hat die ButtonVal variable dann 0 erreicht wird der Output wider auf 0 gesetzt.
19
if (buttonVal01 ==0 ) {
20
  digitalWrite(ledPin1, LOW);
21
}
22
delay(100); // definiert einen Durchlauf auf ~100ms

Die Outputs gehen natürlich via Optokoppler auf eine Relaiskarte.

: Bearbeitet durch User
von Martin K. (maart)


Lesenswert?

Ich habe jetzt keine Lust mich durch den Code zu wühlen.
Ich sitze jetzt vor meinem Mega und habe das Programm aus dem 
Eröffnungpost drauf.
Was muss ich jetzt wo anschließen um es mal zu testen.

von Marian G. (houwdy)


Lesenswert?

an IO 0 kommt ein Taster für die Münzerkennung der kurz betätigt wird

an Io 1-16 die Tster für die Schukofreigabe.

an IO 18-33 die LED bzw Relais

Wenn du das ganze mit 3 Tastern und 3 Leds mit IO 1, 2,3 und IO 18, 19 
20 probierst und du kommentierst den Code von

else if (digitalRead(buttonPin03) == LOW&& Coin ==1) {
  buttonVal03 = timeVal;
  Coin =0;
}

bis

else if (digitalRead(buttonPin16) == LOW&& Coin ==1) {
  buttonVal03 = timeVal;
  Coin =0;
}

aus funktioniert das ganze einwandfrei io 0 betätigen, anschliesend io1 
oder/ und io2 und die Leds leuchten für die Zeit.

so wie du

else if (digitalRead(buttonPin03) == LOW&& Coin ==1) {
  buttonVal03 = timeVal;
  Coin =0;
}

dazu nimmst geht gar nichts mehr??

Danke schonmal

Marian :)

von Marian G. (houwdy)


Lesenswert?

was ich oben noch überlesen habe die Pullups haben 100k ich  könnte aber 
auch  auf die Internen vom Arduino wechseln.

von Patrick B. (p51d)


Lesenswert?

Dussel schrieb:
> Was soll
> if (buttonVal01 <<0 ) {
> bringen?

Einer schrieb:
> Das << sollte von der Logik wohl eher ein > sein.

Kaj schrieb:
> Den fehler vom TO 'if (buttonValxx << 0)' hab ich jetzt einfach mal
> uebernommen. keine Ahnung was er da machen moechte.

Dussel schrieb:
> Es ist ja schön, dass du so viel schreibst, aber die Frage bleibt, was
> du mit
> if (buttonVal[i] << 0) {
> bewirken willst.

Marian G. schrieb:
> //solange Buttonval größer 0 ist wird die Steckdose eingeschaltet
> //das habe ich so realisiert damit jeder der 16 Outputs seine "eigene
> Zeit" //hat
> //und immer die ganze schleife durchlaufen wird ohne das der controller
> in //einer hängen bleibt. buttonval-- wollte der Compiler komischerweise
> nicht.
>
> if (buttonVal01 <<0 ) {
>   digitalWrite(ledPin1, HIGH);
>   buttonVal01=buttonVal01-1;
> }

Ehm, ich will dir nicht zu nahe treten Marian, aber bist du Resistent 
gegen konkrete Verbesserungsvorschläge bei offensichtlichen Fehlern?
Kennst du den Unterschied zwischen
1
buttonVal01 << 0
und
1
buttonVal01 < 0

Das eine ist eine Schiebeoperation, und das andere ein Vergleich!
1
if (buttonVal01 <<0 ) {
2
  //
3
}
4
5
=> Entspricht
6
if ((buttonVal01 <<0 ) != 0) {
7
  //
8
}
Konkret schiebst du die Variable buttonVal01 also um 0 Bit nach links 
und prüfst anschliessend ob diese grösser als 0 ist.


Wenn du auf 0 oder grösser 0 prüfen möchtest, dann mach doch das so wie 
99.99% alle anderen:
1
if(buttonVal01 != 0){
2
}
3
if(buttonVal01 > 0){
4
}
Das kann man wenigstens lesen und versteht es auf anhieb.

Noch was. Du setzt deine Coin Variable nur in der Schlaufe zurück. Ist 
das so gewollt? Sollte das nicht etwa so sein?
1
if (coinState == LOW) {
2
  Coin = 1;
3
}
4
else{
5
  Coin = 0;
6
}

Versuch doch mit diesem Code mit 1, 2, oder 3 "akzeptieren" Kanälen zu 
Arbeiten (for-Schlaufen limitieren). In der Simulation oder beim 
Debuggen Schritt für Schritt. Dann siehste ja sofort, wo etwas wann 
nicht so soll wie gedacht.

von Martin K. (maart)


Lesenswert?

Versuche erst mal das hier:
1
const int coinPin = 17; //war 0
2
3
const int buttonPin01 = 1;
4
const int buttonPin02 = 2;
5
const int buttonPin03 = 3;
6
const int buttonPin04 = 4;
7
const int buttonPin05 = 5;
8
const int buttonPin06 = 6;
9
const int buttonPin07 = 7;
10
const int buttonPin08 = 8;
11
const int buttonPin09 = 9;
12
const int buttonPin10 = 10;
13
const int buttonPin11 = 11;
14
const int buttonPin12 = 12;
15
const int buttonPin13 = 13;
16
const int buttonPin14 = 14;
17
const int buttonPin15 = 15;
18
const int buttonPin16 = 16;
19
20
const int ledPin1 =  18;
21
const int ledPin2 =  19;
22
const int ledPin3 =  20;
23
const int ledPin4 =  21;
24
const int ledPin5 =  22;
25
const int ledPin6 =  23;
26
const int ledPin7 =  24;
27
const int ledPin8 =  25;
28
const int ledPin9 =  26;
29
const int ledPin10 =  27;
30
const int ledPin11 =  28;
31
const int ledPin12 =  29;
32
const int ledPin13 =  30;
33
const int ledPin14 =  31;
34
const int ledPin15 =  32;
35
const int ledPin16 =  33;
36
37
int buttonState01 = 0;
38
int buttonState02 = 0;
39
int buttonState03 = 0;
40
int buttonState04 = 0;
41
int buttonState05 = 0;
42
int buttonState06 = 0;
43
int buttonState07 = 0;
44
int buttonState08 = 0;
45
int buttonState09 = 0;
46
int buttonState10 = 0;
47
int buttonState11 = 0;
48
int buttonState12 = 0;
49
int buttonState13 = 0;
50
int buttonState14 = 0;
51
int buttonState15 = 0;
52
int buttonState16 = 0;
53
54
int buttonVal01 =0;
55
int buttonVal02 =0;
56
int buttonVal03 =0;
57
int buttonVal04 =0;
58
int buttonVal05 =0;
59
int buttonVal06 =0;
60
int buttonVal07 =0;
61
int buttonVal08 =0;
62
int buttonVal09 =0;
63
int buttonVal10 =0;
64
int buttonVal11 =0;
65
int buttonVal12 =0;
66
int buttonVal13 =0;
67
int buttonVal14 =0;
68
int buttonVal15 =0;
69
int buttonVal16 =0;
70
71
int coinState =0;
72
int Coin =0;
73
int timeVal = 5;
74
75
void setup() {
76
77
pinMode(ledPin1, OUTPUT);
78
pinMode(ledPin2, OUTPUT);
79
pinMode(ledPin3, OUTPUT);
80
pinMode(ledPin4, OUTPUT);
81
pinMode(ledPin5, OUTPUT);
82
pinMode(ledPin6, OUTPUT);
83
pinMode(ledPin7, OUTPUT);
84
pinMode(ledPin8, OUTPUT);
85
pinMode(ledPin9, OUTPUT);
86
pinMode(ledPin10, OUTPUT);
87
pinMode(ledPin11, OUTPUT);
88
pinMode(ledPin12, OUTPUT);
89
pinMode(ledPin13, OUTPUT);
90
pinMode(ledPin14, OUTPUT);
91
pinMode(ledPin15, OUTPUT);
92
pinMode(ledPin16, OUTPUT);
93
94
pinMode(buttonPin01, INPUT_PULLUP);
95
pinMode(buttonPin02, INPUT_PULLUP);
96
pinMode(buttonPin03, INPUT_PULLUP);
97
pinMode(buttonPin04, INPUT_PULLUP);
98
pinMode(buttonPin05, INPUT_PULLUP);
99
pinMode(buttonPin06, INPUT_PULLUP);
100
pinMode(buttonPin07, INPUT_PULLUP);
101
pinMode(buttonPin08, INPUT_PULLUP);
102
pinMode(buttonPin09, INPUT_PULLUP);
103
pinMode(buttonPin10, INPUT_PULLUP);
104
pinMode(buttonPin11, INPUT_PULLUP);
105
pinMode(buttonPin12, INPUT_PULLUP);
106
pinMode(buttonPin13, INPUT_PULLUP);
107
pinMode(buttonPin14, INPUT_PULLUP);
108
pinMode(buttonPin15, INPUT_PULLUP);
109
pinMode(buttonPin16, INPUT_PULLUP);
110
111
pinMode(coinPin, INPUT_PULLUP);
112
113
Serial.begin(9600);
114
}
115
void loop(){
116
coinState = digitalRead(coinPin);
117
118
if (coinState == LOW) {
119
  Coin = 1;
120
  Serial.println("Coin aktiv");
121
}
122
if (digitalRead(buttonPin01) == LOW&& Coin ==1) {
123
  Serial.println("Taste 1");
124
  buttonVal01 = timeVal;
125
  Coin =0;
126
}
127
else if (digitalRead(buttonPin02) == LOW&& Coin ==1) {
128
  Serial.println("Taste 2");
129
  buttonVal02 = timeVal;
130
  Coin =0;
131
}
132
133
else if (digitalRead(buttonPin03) == LOW&& Coin ==1) {
134
  Serial.println("Taste 3");
135
  buttonVal03 = timeVal;
136
  Coin =0;
137
}
138
else if (digitalRead(buttonPin04) == LOW&& Coin ==1) {
139
  Serial.println("Taste 4");
140
  buttonVal04 = timeVal;
141
  Coin =0;
142
}
143
else if (digitalRead(buttonPin05) == LOW&& Coin ==1) {
144
  Serial.println("Taste 5");
145
  buttonVal05 = timeVal;
146
  Coin =0;
147
}
148
else if (digitalRead(buttonPin06) == LOW&& Coin ==1) {
149
  Serial.println("Taste 6");
150
  buttonVal06 = timeVal;
151
  Coin =0;
152
}
153
else if (digitalRead(buttonPin07) == LOW&& Coin ==1) {
154
  Serial.println("Taste 7");
155
  buttonVal07 = timeVal;
156
  Coin =0;
157
}
158
else if (digitalRead(buttonPin08) == LOW&& Coin ==1) {
159
  Serial.println("Taste 8");
160
  buttonVal08 = timeVal;
161
  Coin =0;
162
}
163
else if (digitalRead(buttonPin09) == LOW&& Coin ==1) {
164
  Serial.println("Taste 9");
165
  buttonVal09 = timeVal;
166
  Coin =0;
167
}
168
else if (digitalRead(buttonPin10) == LOW&& Coin ==1) {
169
  Serial.println("Taste 10");
170
  buttonVal10 = timeVal;
171
  Coin =0;
172
}
173
else if (digitalRead(buttonPin11) == LOW&& Coin ==1) {
174
  Serial.println("Taste 11");
175
  buttonVal11 = timeVal;
176
  Coin =0;
177
}
178
else if (digitalRead(buttonPin12) == LOW&& Coin ==1) {
179
  Serial.println("Taste 12");
180
  buttonVal12 = timeVal;
181
  Coin =0;
182
}
183
else if (digitalRead(buttonPin13) == LOW&& Coin ==1) {
184
  Serial.println("Taste 13");
185
  buttonVal13 = timeVal;
186
  Coin =0;
187
}
188
else if (digitalRead(buttonPin14) == LOW&& Coin ==1) {
189
  Serial.println("Taste 14");
190
  buttonVal14 = timeVal;
191
  Coin =0;
192
}
193
else if (digitalRead(buttonPin15) == LOW&& Coin ==1) {
194
  Serial.println("Taste 15");
195
  buttonVal15 = timeVal;
196
  Coin =0;
197
}
198
else if (digitalRead(buttonPin16) == LOW&& Coin ==1) {
199
  Serial.println("Taste 16");
200
  buttonVal16 = timeVal;
201
  Coin =0;
202
}
203
204
/*
205
if (buttonVal01 <<0 ) {
206
  Serial.println("Dose 1 HIGH");
207
  digitalWrite(ledPin1, HIGH);
208
  buttonVal01=buttonVal01-1;
209
}
210
if (buttonVal01 ==0 ) {
211
  Serial.println("Dose 1 LOW");
212
  digitalWrite(ledPin1, LOW);
213
}
214
if (buttonVal02 << 0 ) {
215
  Serial.println("Dose 2 HIGH");
216
  digitalWrite(ledPin2, HIGH);
217
  buttonVal02=buttonVal02-1;
218
}
219
if (buttonVal02 ==0 ) {
220
  Serial.println("Dose 2 LOW");
221
  digitalWrite(ledPin2, LOW);
222
}
223
224
if (buttonVal03 <<0 ) {
225
  Serial.println("Dose 3 HIGH");
226
  digitalWrite(ledPin3, HIGH);
227
  buttonVal03=buttonVal03-1;
228
}
229
if (buttonVal03 ==0 ) {
230
  Serial.println("Dose 3 LOW");
231
  digitalWrite(ledPin3, LOW);
232
}
233
234
if (buttonVal04 <<0 ) {
235
  Serial.println("Dose 4 HIGH");
236
  digitalWrite(ledPin4, HIGH);
237
  buttonVal04=buttonVal04-1;
238
}
239
if (buttonVal04 ==0 ) {
240
  Serial.println("Dose 4 LOW");
241
  digitalWrite(ledPin4, LOW);
242
}
243
244
if (buttonVal05 <<0 ) {
245
  Serial.println("Dose 5 HIGH");
246
  digitalWrite(ledPin5, HIGH);
247
  buttonVal05=buttonVal05-1;
248
}
249
if (buttonVal05 ==0 ) {
250
  Serial.println("Dose 5 LOW");
251
  digitalWrite(ledPin5, LOW);
252
}
253
if (buttonVal06 <<0 ) {
254
  Serial.println("Dose 6 LOW");
255
  digitalWrite(ledPin6, HIGH);
256
  buttonVal06=buttonVal06-1;
257
}
258
if (buttonVal06 ==0 ) {
259
  Serial.println("Dose 6 LOW");
260
  digitalWrite(ledPin6, LOW);
261
}
262
if (buttonVal07 <<0 ) {
263
  Serial.println("Dose 7 HIGH");
264
  digitalWrite(ledPin7, HIGH);
265
  buttonVal07=buttonVal07-1;
266
}
267
if (buttonVal07 ==0 ) {
268
  Serial.println("Dose 7 LOW");
269
  digitalWrite(ledPin7, LOW);
270
}
271
if (buttonVal08 <<0 ) {
272
  Serial.println("Dose 8 HIGH");
273
  digitalWrite(ledPin8, HIGH);
274
  buttonVal08=buttonVal08-1;
275
}
276
if (buttonVal08 ==0 ) {
277
  Serial.println("Dose 8 LOW");
278
  digitalWrite(ledPin8, LOW);
279
}
280
if (buttonVal09 <<0 ) {
281
  Serial.println("Dose 8 HIGH");
282
  digitalWrite(ledPin9, HIGH);
283
  buttonVal09=buttonVal09-1;
284
}
285
if (buttonVal09 ==0 ) {
286
  Serial.println("Dose 8 LOW");
287
  digitalWrite(ledPin9, LOW);
288
}
289
if (buttonVal10 <<0 ) {
290
  Serial.println("Dose 10 HIGH");
291
  digitalWrite(ledPin10, HIGH);
292
  buttonVal10=buttonVal10-1;
293
}
294
if (buttonVal10 ==0 ) {
295
  Serial.println("Dose 10 LOW");
296
  digitalWrite(ledPin10, LOW);
297
}
298
if (buttonVal11 <<0 ) {
299
  Serial.println("Dose 11 HIGH");
300
  digitalWrite(ledPin11, HIGH);
301
  buttonVal11=buttonVal11-1;
302
}
303
if (buttonVal11 ==0 ) {
304
  Serial.println("Dose 11 LOW");
305
  digitalWrite(ledPin11, LOW);
306
}
307
if (buttonVal12 <<0 ) {
308
  Serial.println("Dose 12 HIGH");
309
  digitalWrite(ledPin12, HIGH);
310
  buttonVal12=buttonVal12-1;
311
}
312
if (buttonVal12 ==0 ) {
313
  Serial.println("Dose 12 LOW");
314
  digitalWrite(ledPin12, LOW);
315
}
316
if (buttonVal13 <<0 ) {
317
  Serial.println("Dose 13 HIGH");
318
  digitalWrite(ledPin13, HIGH);
319
  buttonVal13=buttonVal13-1;
320
}
321
if (buttonVal13 ==0 ) {
322
  Serial.println("Dose 13 LOW");
323
  digitalWrite(ledPin13, LOW);
324
}
325
326
if (buttonVal14 <<0 ) {
327
  Serial.println("Dose 14 HIGH");
328
  digitalWrite(ledPin14, HIGH);
329
  buttonVal14=buttonVal14-1;
330
}
331
if (buttonVal14 ==0 ) {
332
  Serial.println("Dose 14 LOW");
333
  digitalWrite(ledPin14, LOW);
334
}
335
336
if (buttonVal15 <<0 ) {
337
  Serial.println("Dose 15 HIGH");
338
  digitalWrite(ledPin15, HIGH);
339
  buttonVal15=buttonVal15-1;
340
}
341
if (buttonVal15 ==0 ) {
342
  Serial.println("Dose 15 LOW");
343
  digitalWrite(ledPin15, LOW);
344
}
345
346
if (buttonVal16 <<0 ) {
347
  Serial.println("Dose 16 HIGH");
348
  digitalWrite(ledPin16, HIGH);
349
  buttonVal16=buttonVal16-1;
350
}
351
if (buttonVal16 ==0 ) {
352
  Serial.println("Dose 16 LOW");
353
  digitalWrite(ledPin16, LOW);
354
}
355
356
*/
357
delay(1000);
358
}
Prüfe mal mit dem seriellen Monitor, ob die einzelnen Taster überhaupt 
erkannt werden.
Ich habe "Coin" auf Pin 17 geklemmt, sonst ist die serielle 
Schnittstelle nicht nutzbar.

von Martin K. (maart)


Lesenswert?

Taste 13 wird so immer erkannt werden, da der interne Pullup für die 
serienmäßige LED zu schwach ist, also nicht wundern, oder Pin 13 direkt 
auf 5V legen.

von Marian G. (houwdy)


Lesenswert?

Patrick B. schrieb:
> Ehm, ich will dir nicht zu nahe treten Marian, aber bist du Resistent
> gegen konkrete Verbesserungsvorschläge bei offensichtlichen Fehlern?
> Kennst du den Unterschied zwischenbuttonVal01 << 0
> undbuttonVal01 < 0
>
> Das eine ist eine Schiebeoperation, und das andere ein Vergleich!

und genau das war der Fehler!
Es tut mir leid aber das war ein Blackout im Sinne " ich seh den Wald 
vor lauter Bäumen nicht mehr"
Ich hab Dussels Statement durch meinen Tunnelblick nicht kapiert.
Klar kanns mit Bitshiftoperatoren nicht gehn.

Danke jedenfalls für eure Hilfe! ich hab jetz den Ungleichoperator (!=) 
verwendet und jetzt funktioniert es.

Im Moment läuft das ganze noch mit 3 Kanälen am Steckbrettchen aber ich 
denke ich werde es heute Abend auf die Hardware spielen und wenn der 
Code dort funktioniert poste ich denselben nochmal der Vollständigkeit 
halber.

Tausend Dank euch allen erstmal.

Marian

von Hubert G. (hubertg)


Lesenswert?

Ich habe deinen ersten Code verwendet. Interne PullUp aktiviert. 
Funktioniert mit 4 Tasten.
Die Pin 0 und 1 werden für den Upload benötigt und sollten nicht 
verwendet werden.

von Martin K. (maart)


Lesenswert?

Marian G. schrieb:
>> Das eine ist eine Schiebeoperation, und das andere ein Vergleich!
>
> und genau das war der Fehler!

Was aber in deinem Fall durch Zufall nicht schlimm ist. Die if-Bedingung 
trifft zu, solange das Ergebnis ungleich null ist. Die Bitschieberei um 
null Stellen verändert da nichts.
Wie gesagt, bei mir funktioniert auch deine Codevariante.

von Einer K. (Gast)


Lesenswert?

Martin K. schrieb:
> Taste 13 wird so immer erkannt werden, da der interne Pullup für
> die
> serienmäßige LED zu schwach ist, also nicht wundern, oder Pin 13 direkt
> auf 5V legen.

Das ist so nicht richtig!
Siehe: 
https://www.arduino.cc/en/uploads/Main/arduino-mega2560_R3-sch.pdf

von Axel R. (Gast)


Lesenswert?

StromTuner

Marian G. schrieb:
> Im Moment läuft das ganze noch mit 3 Kanälen am Steckbrettchen

...lief es doch vorher auch schon...

>leider mit 16 nicht mehr und ich schau schon seit 2 Stunden
>darauf und find den Fehler nicht...

Ob Du nun Bishiftleft zero machst und auf ungleich null testest, oder 
sorum. Ist zwar mit "<<" völlig am Ziel vorbei, sollte an der 
Fehlerbeschreibung nichts ändern, die am Anfang angegeben hast. Es 
funktioniert ja (hier eher zufällig)
Bin ich ja gespannt!

von Peter D. (peda)


Lesenswert?

Kaj schrieb:
> Ich hab mal den Code aufgeraeumt.

Hier bieten sich Schleifen geradezu an.
Nicht nur der Code wird nen ordentlichen Zacken kürzer und damit 
leserlicher.
Auch sinkt die Fehlerwarscheinlichkeit drastisch. Man muß ja nur einen 
Schleifendurchgang prüfen und nicht 16 Copy&Paste Stellen.

Ich nehme Schleifen schon ab 2 weitgehend identischen Codeteilen. 
Copy&Paste Code vermeide ich, wenn es nur irgend geht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Nur mal kurz in die Runde gefragt, was ist denn daran so schwer zu 
verstehen:
1
Antwort schreiben
2
Wichtige Regeln - erst lesen, dann posten!
3
4
    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang


Ich habe einen Fehler im Programm gefunden:
> delay(100);
Denn in der Hauptschleife aktiv Rechenzeit zu vergeuden ist mit 
Sicherheit ein Fehler.

von Leroy M. (mayl)


Lesenswert?

Lothar M. schrieb:
> Ich habe einen Fehler im Programm gefunden:
>> delay(100);
> Denn in der Hauptschleife aktiv Rechenzeit zu vergeuden ist mit
> Sicherheit ein Fehler.

In dem Fall nicht, das Programm ist einfach laienhaft geschrieben.


Das Delay wird im Endeffekt mit int timeVal multipliziert und ergibt 
somit die Zeit, die der Output high ist.

An den TO:

Wenn du statt

>>if (digitalRead(buttonPin01) == LOW&& Coin ==1) {
>>  buttonVal01 = timeVal;
>>  Coin =0;
>>}

das hier

>>if (digitalRead(buttonPin01) == LOW&& Coin ==1) {
>>  buttonVal01 = buttonVal01 + timeVal;
>>  Coin =0;
>>}

schreibst, kannst du die Zeit verlängern, in der die Steckdose an ist, 
wenn eine neue Münze eingeworfen wurde. ;)

von Lenny D. (le-do)


Lesenswert?

Ob das mit dem Fehler zusammenhängt kann ich nicht beurteilen, aber 
mache dir am besten nochmal Gedanken über entprellung und 
schaltgeschwindigkeit bei den Tastern aber v.a. bei der Münzerkennung.
Wenn ich das richtig sehe kann eine schnell vorbeirollende münze während 
dem delay unerkannt bleiben, wenn man das delay verkürzt eine münze 
aufgrund von Prellung aber mehrfach registriert werden (ok das ignoriert 
der Code bisher, aber vielleicht mal später)

von Martin K. (maart)


Lesenswert?

Arduino F. schrieb:
> Martin K. schrieb:
>> Taste 13 wird so immer erkannt werden, da der interne Pullup für
>> die
>> serienmäßige LED zu schwach ist, also nicht wundern, oder Pin 13 direkt
>> auf 5V legen.
>
> Das ist so nicht richtig!
> Siehe:
> https://www.arduino.cc/en/uploads/Main/arduino-mega2560_R3-sch.pdf

Was genau meinst Du? Ich habe ja den Test vorhin direkt mit der Hardware 
gemacht.

von Peter (Gast)


Lesenswert?

Oh man wie kann man so beratungsresistent sein und den auf einem 
Silbertablett serviereten super zusammen gefasten Code nicht zu nehmen.

von Kaj (Gast)


Lesenswert?

Marian G. schrieb:
> ich hab jetz den Ungleichoperator (!=)
> verwendet und jetzt funktioniert es.
Ja, aber ist das auch das was du willst?
Willst du testen ob es groesser 0 ist (nur positiver Wertebereich, ohne 
die 0), oder willst du testen ob es ungleich 0 ist (negativer und 
positiver Wertebereich, ohne die 0)

von Einer K. (Gast)


Lesenswert?

Martin K. schrieb:
> Was genau meinst Du? Ich habe ja den Test vorhin direkt mit der Hardware
> gemacht.

Auf dem Arduino Mega ist ein Impedanzwandler (OP?) verbaut, um genau das 
von dir genannte Problem zu unterbinden.

Pin13 kann also problemlos mit INPUT_PULLUP verwendet werden.

Warum dein Mega das nicht hat, kann ich dir nicht sagen.

von Martin K. (maart)


Lesenswert?

Arduino F. schrieb:
> Warum dein Mega das nicht hat, kann ich dir nicht sagen.

Ok.
Vermutlich, weil es ein Klon ist.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Martin K. schrieb:
> Vermutlich, weil es ein Klon ist.
Hat bei Dolly aber anders ausgesehen ... äh nein, eigentlich genau 
gleich :)

Was Du meinst: Ein günstiger Nachbau, landläufig aber auch gerne, da 
gebe ich Dir Recht, Klon genannt, wenn's auch nicht wirklich trifft.

Davon ab - laufen jetzt alle 16 Taster/Steckdosen?
Zum Probieren muß man ja nicht jedes Mal 2 Stunden warten - eine Zahl im 
Programm geändert und die Zeit wird auf der Basis 10 Sekunden 
verwurschtelt.

MfG

von Marian G. (houwdy)


Lesenswert?

Lothar M. schrieb:
> Nur mal kurz in die Runde gefragt, was ist denn daran so schwer zu
> verstehen:Antwort schreiben
> Wichtige Regeln - erst lesen, dann posten!
>
>     Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
>
> Ich habe einen Fehler im Programm gefunden:
>> delay(100);
> Denn in der Hauptschleife aktiv Rechenzeit zu vergeuden ist mit
> Sicherheit ein Fehler.

Zum Ersten: dafür entschuldige ich mich und gelobe fürs nächste mal 
Besserung.

Wie würdest du das delay 100 umgehen in diesem Fall?

Peter schrieb:
> Oh man wie kann man so beratungsresistent sein und den auf einem
> Silbertablett serviereten super zusammen gefasten Code nicht zu nehmen.

Ich hab den Code ja genommen, auserdem hab ich mir recht viele Gedanken 
gemacht wie ich das hier gesehene beim nächsten Projekt anwenden kann, 
worauf bezieht sich dann meine Beratungsresistenz? Würde ich so 
programmieren wie ich Wig schweisse dann müsste ich nicht nachfragen.

Patrick J. schrieb:
> Davon ab - laufen jetzt alle 16 Taster/Steckdosen?
> Zum Probieren muß man ja nicht jedes Mal 2 Stunden warten - eine Zahl im
> Programm geändert und die Zeit wird auf der Basis 10 Sekunden
> verwurschtelt.
>
> MfG

10 laufen :) die anderen 6 kommen morgen nach der Arbeit drann :) dann 
teile ich euch das Ergebnis mit.

Mfg Marian

von Axel R. (Gast)


Lesenswert?

Woran lag es "denn dann denn" nun, das erst nur zwei Ausgänge 
funktionierten und nun alles ok ist?
Doch sicher nicht an der (<<0) ...
Kann das mal jemand zusammenfassen?

StromTuner

von Einer K. (Gast)


Lesenswert?

Axel R. schrieb:
> Kann das mal jemand zusammenfassen?

Ich versuchs mal...

Aus einer unsäglichen, fehlerträchtigen, Codewurst, ist ein 
übersichtliches Konstrukt mit Schleifen und Arrays geworden.

von Martin K. (maart)


Lesenswert?

Arduino F. schrieb:
> Axel R. schrieb:
>> Kann das mal jemand zusammenfassen?
>
> Ich versuchs mal...
>
> Aus einer unsäglichen, fehlerträchtigen, Codewurst, ist ein
> übersichtliches Konstrukt mit Schleifen und Arrays geworden.

Ich tippe eher auf Hardwareprobleme. Die "Codewurst" funktioniert ja auf 
meinem Mega.
Das die Wurst nur aus Zufall funktioniert, will ich nicht abstreiten.

von Marian G. (houwdy)


Lesenswert?

Hier der funktionierende Code. ich poste ihn im Beitrag da es ja nur ein 
par Zeilen sind. Ich hoffe das ist in Ordnung.

Danke noch einmal für eure Hilfe. Ich glaube der ist jetzt um einiges
schöner als der Erste.
1
#include <stdint.h>
2
const int16_t coinPin = 4;
3
const int16_t buttonPins[16] =  {23, 25, 27, 29, 31, 53, 51, 49,  
4
                                 47, 45, 43, 41, 39, 37, 35, 33};    
5
const int16_t ledPins[16] =     {14, 15, 16, 17, 18, 19, 20, 36,
6
                                34, 32, 30, 28, 26, 24, 22, 20};
7
int16_t buttonState[16] = {0};
8
unsigned long buttonVal[16] = {0};
9
int16_t coinState = 0;
10
int16_t Coin = 0;
11
unsigned long timeVal = 1000000;
12
13
void setup()
14
{
15
    for (uint8_t i = 0; i < 16; i++) {
16
        pinMode(ledPins[i], OUTPUT);
17
        pinMode(buttonPins[i], INPUT_PULLUP);    }
18
19
    pinMode(coinPin, INPUT_PULLUP); 
20
}
21
void loop()
22
{
23
    if ((digitalRead(coinPin)) == LOW) {
24
        Coin = 1;
25
        
26
    for (uint8_t i = 0; i < 16; i++) {
27
        if ((digitalRead(buttonPins[i]) == LOW) && (Coin == 1)) {
28
            buttonVal[i] = timeVal;
29
            Coin = 0;
30
            break;
31
        } }  }
32
33
    for (uint8_t i = 0; i < 16; i++) {
34
        if (buttonVal[i] != 0) {
35
            digitalWrite(ledPins[i], LOW);
36
            buttonVal[i] -= 1;}
37
38
        if (buttonVal[i] == 0) {
39
            digitalWrite(ledPins[i], HIGH);  }  }
40
41
    delay(10);
42
}

: Bearbeitet durch User
von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Wenn Du die Klammern mit etwas mehr Sinn setzt, ergeben Diese direkt die 
zusammenhängenden Blöcke:
1
 #include <stdint.h>
2
 const int16_t coinPin = 4;
3
 const int16_t buttonPins[16] =  {23, 25, 27, 29, 31, 53, 51, 49,
4
                                  47, 45, 43, 41, 39, 37, 35, 33};
5
 const int16_t ledPins[16] =     {14, 15, 16, 17, 18, 19, 20, 36,
6
                                 34, 32, 30, 28, 26, 24, 22, 20};
7
 int16_t buttonState[16] = {0};
8
 unsigned long buttonVal[16] = {0};
9
 int16_t coinState = 0;
10
 int16_t Coin = 0;
11
 unsigned long timeVal = 1000000;
12
 
13
 void setup()
14
 {
15
     for (uint8_t i = 0; i < 16; i++) {
16
         pinMode(ledPins[i], OUTPUT);
17
         pinMode(buttonPins[i], INPUT_PULLUP);
18
-->  }
19
 
20
     pinMode(coinPin, INPUT_PULLUP);
21
 }
22
 void loop()
23
 {
24
     if ((digitalRead(coinPin)) == LOW) {
25
         Coin = 1;
26
 
27
         for (uint8_t i = 0; i < 16; i++) {
28
            if ((digitalRead(buttonPins[i]) == LOW) && (Coin == 1)) {
29
                buttonVal[i] = timeVal;
30
                Coin = 0;
31
                break;
32
-->         }
33
-->      }
34
-->  }
35
 
36
     for (uint8_t i = 0; i < 16; i++) {
37
         if (buttonVal[i] != 0) {
38
             digitalWrite(ledPins[i], LOW);
39
             buttonVal[i] -= 1;
40
-->      }
41
         if (buttonVal[i] == 0) {
42
             digitalWrite(ledPins[i], HIGH);
43
-->      }
44
-->  }
45
 
46
     delay(10);
47
 }
Alles auf gleicher Ebene ist gleich weit eingerückt, finde ich einfacher 
und besser lesbar.

Danke für's Zeigen!

MfG

von Joachim B. (jar)


Lesenswert?

Patrick J. schrieb:
> Wenn Du die Klammern mit etwas mehr Sinn setzt, ergeben Diese direkt die
> zusammenhängenden Blöcke:
>
1
.....
2
>      for (uint8_t i = 0; i < 16; i++) {
3
>          pinMode(ledPins[i], OUTPUT);
4
>          pinMode(buttonPins[i], INPUT_PULLUP);
5
> -->  }
6
>
> Alles auf gleicher Ebene ist gleich weit eingerückt, finde ich einfacher
> und besser lesbar.

besser lesbar?
halte ich für diskutierbar, ich finde Öffnungsklammern irgendwo hinten 
schlecht lesbar
1
.....
2
void loop()
3
{  if ((digitalRead(coinPin)) == LOW) 
4
   {  Coin = 1;
5
      for (uint8_t i = 0; i < 16; i++) 
6
      {  if ((digitalRead(buttonPins[i]) == LOW) && (Coin == 1)) 
7
         {  buttonVal[i] = timeVal;
8
            Coin = 0;
9
            break;
10
         } 
11
      }  
12
   }
13
14
   for (uint8_t i = 0; i < 16; i++) 
15
   {  if (buttonVal[i] != 0) 
16
      {  digitalWrite(ledPins[i], LOW);
17
         buttonVal[i] -= 1;
18
      }
19
      if (buttonVal[i] == 0) 
20
         digitalWrite(ledPins[i], HIGH);  
21
   }
22
   delay(10);
23
}

das halte ich für lesbarer, Einzeiler brauchen selten Klammern

ist vielleicht nur meine Meinung, aber ich sehe wo Blöcke anfangen und 
wo enden

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.