Forum: Mikrocontroller und Digitale Elektronik Arduino-Wo ist der Fehler?


von eizi (Gast)


Lesenswert?

Hallo,


Bin gerade ein wenig am Programmieren, und möchte eine LED mit einem von 
2 verfügbaren Tastern schalten um die LED zu leuchten zu bringen.

Beispiel:
Also wenn Taster 1 gedrückt LED soll leuchten.
Wenn Taster 2 gedrückt, LED soll leuchten.


Funktioniert aber mit folgender Source nicht.

1
nt eingang1 = 0;
2
int ausgang1 =8;
3
4
int eingang2 = 1;
5
int ausgang2 = 9;
6
7
int tasterstatus1 =0;
8
int tasterstatus2 =0;
9
10
void setup() {
11
  
12
  pinMode(eingang1, INPUT_PULLUP);
13
  pinMode(ausgang1, OUTPUT);
14
  
15
  pinMode(eingang2, INPUT_PULLUP);
16
  pinMode(ausgang2, OUTPUT);
17
}
18
19
void loop() {
20
  
21
  tasterstatus1 = digitalRead(eingang1);
22
  
23
  if (tasterstatus1 == HIGH) {
24
    digitalWrite(ausgang1, LOW);
25
    
26
  }
27
  else {
28
    digitalWrite(ausgang1, HIGH);
29
}
30
31
32
tasterstatus2 = digitalRead(eingang2);
33
34
if (tasterstatus2 == HIGH) {
35
  digitalWrite(ausgang2, LOW);
36
}
37
else { 
38
  digitalWrite(ausgang2, HIGH);
39
}
40
41
}

Wo ist denn der Fehler?
Egal welchen Taster ich drücke, die LED leuchtet nicht. Außer wenn ich 
beide gleichzeitig drücke.

Bitte kein neues Codebeispiel welches komplett anders ist, ich würde 
gerne Wissen wie das mit diesem Code möglich ist.

Vielen Dank! ;)

von Stefan (Gast)


Lesenswert?

Wie sind die Taster und LED's angeschlossen? Zeige mal den Schaltplan.

von Karl H. (kbuchegg)


Lesenswert?

Das hatten wir doch vor kurzem schon mal?

Dein Problem ist ganz einfach: Geschwindigkeit!

Deine beiden Abfragen wissen nichts voneinander.
Drückst du Taster 1, dann wird hier
1
  if (tasterstatus1 == HIGH) {
2
    digitalWrite(ausgang1, LOW);
3
    
4
  }
5
  else {
6
    digitalWrite(ausgang1, HIGH);
7
}
die LED zwar eingeschaltet, aber gleich darauf wird hier
1
tasterstatus2 = digitalRead(eingang2);
2
3
if (tasterstatus2 == HIGH) {
4
  digitalWrite(ausgang1, LOW);
5
}
6
else { 
7
  digitalWrite(ausgang1, HIGH);
8
}
die LEd sofort wieder ausgeschaltet, weil ja Taster 2 nicht gedrückt 
ist.

Und das ganz auch umgekehrt:
Drückst du Taster 2, dann wird mit dessen if die LED zwar eingeschaltet, 
aber gleich darauf (weil ja loop() sofort wieder aufgerufen wird), wird 
die LED auch wieder ausgeschaltet, weil ja Taster 1 nicht gedrückt ist.

Und das ganze (deswegen Problem: Geschwindigkeit) passiert ein paar 
Zehntausend mal in der Sekunde, wesegen du nicht siehst, dass dein  LED 
zwar eingschaltet aber gleich darauf auch wieder ausgeschaltet wird.

Du musst die beiden Taster miteinander in Beziehung setzen!
1
  wenn( Taster1 gedrückt ODER Taster2 gedrückt
oder was aufs gleiche rauskommt
1
  wenn( Taster1 nicht gedrückt UND Taster2 nicht gedrückt )
1
void loop()
2
{
3
  tasterstatus1 = digitalRead(eingang1);
4
  tasterstatus2 = digitalRead(eingang2);
5
  
6
  // sind beide Taster auf HIGH, dann ist keiner von beiden gedrückt
7
  if (tasterstatus1 == HIGH && tasterstatus2 == HIGH) {
8
    digitalWrite(ausgang1, LOW);
9
  }
10
  else {
11
    digitalWrite(ausgang1, HIGH);
12
  }
13
}

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> Funktioniert aber mit folgender Source nicht.

Mit dem sowieso nicht.
Denn in dem Code werden ganz offensichtlich 2 LED benutzt.
Poste bitte den tatsächlichen Code, mit dem du Ärger hast und nicht 
deine Vorlage aus der du versuchst, dein Programm herzuleiten.
Denn nichts ist schlimmer, als wie wenn deine Beschreibung des Problems 
so gar nicht zum geposteten Code passt.

von Amateur (Gast)


Lesenswert?

Zwei verschiedene Eingänge und zwei verschiedene Ausgänge - müsste 
eigentlich gehen.

Dazu zwei unabhängige Abfragen.
(E1==?  A1=?)
und
(E2==?  A2=?)
beeinflussen sich gegenseitig nicht.

Was meinst Du mit:

>Egal welchen Taster ich drücke, die LED leuchtet nicht. Außer wenn ich
>beide gleichzeitig drücke.

leuchten dann beide? Einzahl/Mehrzahl?

von eizi (Gast)


Lesenswert?

Danke für eure Hilfe! :)

@Karl Heinz Buchegger

Ja stimmt, hab so ein Thema schon mal geöffnet, kam aber ne Zeit lang 
nicht zum Arduino, und deshalb fand ich den alten Thread nicht mehr.

Jedenfalls hat mir deine Erklärung geholfen, vielen Dank!

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.