Arduino-Wo ist der Fehler?

Gast #3326850
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! ;)
#3326874
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
}
#3326886
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.
Gast #3326896
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?
Gast #3328158
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!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.