Forum: Mikrocontroller und Digitale Elektronik Arduino Codefrage?


von eizi (Gast)


Lesenswert?

Hallo

Ich habe mir ein paar Taster gekauft, und habe in weiter ferne geplant, 
mir daraus ein Codeschloss zu basteln - mit Arduino.

Nun begann ich mit den Grundlagen und es klappte auch ziemlich gut. Ich 
habe 4 Taster mit einem Pullup Widerstand 22kOhm & 470kOhm gemischt da 
ich keine 4 22kOhm habe^^

Nun gut, jetzt habe ich vom Steckbrett 4 Adern von den Tastern zum 
Arduino gezogen und diesen mit folgender Source bespielt.
1
 
2
3
4
int ledPin13 = 13;                // PIN 13 = LED
5
int ledPin12 = 12;
6
7
int inputPin1 = 7;               // Taster auf Pin 7 
8
int inputPin2 = 6;
9
int inputPin3 = 5;
10
int inputPin4 = 4;
11
12
int ledvar1 = 0;                    // Variable für Pin (HIGH oder LOW)
13
int ledvar2 = 0;
14
int ledvar3 = 0;
15
int ledvar4 = 0;
16
17
void setup() {
18
19
pinMode(ledPin13, OUTPUT);      // LED-Pin als OUTPUT deklarieren
20
21
pinMode(inputPin1, INPUT);     // Verschiedene Taster als INPUT deklarieren
22
pinMode(inputPin2, INPUT);
23
pinMode(inputPin3, INPUT);
24
pinMode(inputPin4, INPUT);
25
26
}
27
28
void loop(){
29
  
30
int ledvar1 = digitalRead(inputPin1);  // Input auslesen
31
if (ledvar1 == HIGH) {            // Wenn Input= HIGH 
32
digitalWrite(ledPin13, LOW);  // dann LED aus
33
}
34
else {
35
digitalWrite(ledPin13, HIGH); // andernfalls LED an.
36
}
37
38
ledvar2 = digitalRead(inputPin2);  // Input auslesen
39
if (ledvar2 == HIGH) {            // Wenn Input= HIGH 
40
digitalWrite(ledPin12, LOW);  // dann LED aus
41
}
42
else {
43
digitalWrite(ledPin12, HIGH); // andernfalls LED an.
44
}
45
46
47
ledvar3 = digitalRead(inputPin3);  // Input auslesen
48
if (ledvar3 == HIGH) {            // Wenn Input= HIGH 
49
digitalWrite(ledPin13, LOW);  // dann LED aus
50
}
51
else {
52
digitalWrite(ledPin13, HIGH); // andernfalls LED an.
53
}
54
55
ledvar4 = digitalRead(inputPin4);  // Input auslesen
56
if (ledvar4 == HIGH) {            // Wenn Input= HIGH 
57
digitalWrite(ledPin13, LOW);  // dann LED aus
58
}
59
else {
60
digitalWrite(ledPin13, HIGH); // andernfalls LED an.
61
62
63
64
}
65
}

Das Ergebnis soll sein, das jeder Schalter eine verschiedene LED 
schaltet. Jedoch funktionierte vorher nur die erste LED also ledPin13 
und nach einer vergessenen Änderung an der Source funktioniert diese 
auch nicht mehr.  LED´s sind garantiert richtig angesteckt. Ich weiß 
natürlich, das dies ohne Arduino möglich ist und auch ein vielfaches 
leichter...jedoch geht es um den Lerneffekt für das spätere Codeschloss.

Woran kann es liegen? :/

von Stefan (Gast)


Lesenswert?

Ich bin jetzt kein Arduino Spezilist, aber das finde ich schon sehr 
merkwürdig:
1
int ledPin13 = 13;                // PIN 13 = LED
2
int ledPin12 = 12;
3
4
int inputPin1 = 7;               // Taster auf Pin 7 
5
int inputPin2 = 6;
6
int inputPin3 = 5;
7
int inputPin4 = 4;
Denn die I/O Pins des Mikrocontrollers sind zu je 8 Stück gebündelt in 
einem Port. Irgendwo musst Du den Port und dann das Bit innerhalb des 
Ports adressieren.

Weiterhin sind die Pull-Up Widerstände nicht unbedingt nötig, denn der 
Mikrocontroller enthält schon welche, die Du per Befehl einschalten 
kannst.

Die Ausgänge sind auch zu aktievieren, und zwar alle, nicht nur für eine 
LED:
1
pinMode(ledPin13, OUTPUT); 
2
pinMode(ledPin12, OUTPUT);
Aber auch da stimmt die Adressierung des Ports vermutlich nicht.

von Stefan (Gast)


Lesenswert?

> Das Ergebnis soll sein, das jeder Schalter eine verschiedene
> LED schaltet.

Wie soll das gehen, bei 4 Schaltern und nur 2 LED's?

von Stefan (Gast)


Lesenswert?

> Irgendwo musst Du den Port und dann das Bit innerhalb
> des Ports adressieren.

Ich nehme das zurück. Diese Grundlagen verbirgt die Arduino Library 
wohl.

von Digi S. (digispark)


Lesenswert?

da der Code gleich mehrere Fehler beinhaltet, tasten wir uns mal langsam 
an die Probleme heran ;-)


wo wird der pinMode für Pin 12 gesetzt?

dann ist der Code mit den Taster-Auswertungen mehr als wirr.  Du hast 
zum Beispiel 3 IF-Then-Else, in denen Du jedesmal den gleichen Ausgang 
setzt. Nun ist es aber so, dass immer einer der beiden Zweige der 
If-Abfrage ausgeführt wird. Das heißt, bei jedem Durchlauf der 
Main-Schleife, wird der Zustand des Ausgangs 3 mal gesetzt ... mal so 
... mal so. Da dürftest Du wenn überhaupt, dann nur ein mehr oder 
weniger permanentes glimmen der LED sehen, das durch das häufige 
Umschalten ausgelöst wird.

Was willst Du denn eigentlich erreichen? Aus dem Code wird das nämlich 
nicht ersichtlich ;-)

von Karl H. (kbuchegg)


Lesenswert?

> Woran kann das liegen?

Lass mich mal den Code ein wenig abspecken
1
void loop()
2
{
3
  int ledvar1 = digitalRead(inputPin1);  // Input auslesen
4
  if (ledvar1 == HIGH) {            // Wenn Input= HIGH 
5
    digitalWrite(ledPin13, LOW);  // dann LED aus
6
  }
7
  else {
8
    digitalWrite(ledPin13, HIGH); // andernfalls LED an.
9
  }
10
11
  ...
12
  ledvar4 = digitalRead(inputPin4);  // Input auslesen
13
  if (ledvar4 == HIGH) {            // Wenn Input= HIGH 
14
    digitalWrite(ledPin13, LOW);  // dann LED aus
15
  }
16
  else {
17
    digitalWrite(ledPin13, HIGH); // andernfalls LED an.
18
  }
19
...
20
}

Sowoahl inputPin1 als auch inputPin4 wirken sich auf die ledPin13 aus.
Aber: sie tun das ohne voneinander zu wissen.

Drückst du auf den ersten Taster, dann schaltest du die LED aus. Aber: 
ein paar Mykrosekunden später befragt das Programm den anderen Taster. 
Der ist aber nicht gedrückt. Und daher wird die LED sofort wieder 
eingeschaltet. Wird loop das nächste mal aufgerufen dreht sich dann 
sofort alles wieder um, denn der erste Taster ist ja gedrückt und daher 
wird die LED ausgeschaltet. Allerdings nicht sehr lange, denn gleich 
darauf ergibt die Auswertung des inputPin4, dass die LED wieder 
einzuschalten ist. etc. etc. ad infinitum.

In diesem abgespeckten Beispiel müsstest du daher beide Taster drücken, 
damit sich für die LED ein stabiler Zustand ergibt und nicht die 
Auswertung eines Tasters die Auswertung des anderen Tasters sofort 
wieder rückgängig macht.

von Digi S. (digispark)


Lesenswert?

außerdem fürchte ich, dass sich Dein Code gar nicht fehlerfrei 
compilieren läßt, da Du auch die ledvar-Variablen mehrfach deklarierst.


versuch mal (ungetestet):
1
#declare ledPin13 = 13              
2
#declare ledPin12 = 12
3
4
#declare inputPin1 = 7            
5
#declare inputPin2 = 6
6
#declare inputPin3 = 5
7
#declare inputPin4 = 4
8
9
void setup() {
10
11
pinMode(ledPin13, OUTPUT);     
12
pinMode(ledPin12, OUTPUT);
13
14
pinMode(inputPin1, INPUT);     
15
pinMode(inputPin2, INPUT);
16
pinMode(inputPin3, INPUT);
17
pinMode(inputPin4, INPUT);
18
19
}
20
21
void loop(){
22
23
  if (digitalRead(inputPin1) == HIGH){
24
    digitalWrite(ledPin12, HIGH);
25
  }  
26
27
  if (digitalRead(inputPin2) == HIGH){
28
    digitalWrite(ledPin12, LOW);
29
  }  
30
31
  if (digitalRead(inputPin3) == HIGH){
32
    digitalWrite(ledPin13, HIGH);
33
  }  
34
35
  if (digitalRead(inputPin4) == HIGH){
36
    digitalWrite(ledPin13, LOW);
37
  }
38
}

von eizi (Gast)


Lesenswert?

Danke für eure Antworten! :)


Stefan schrieb:
> Weiterhin sind die Pull-Up Widerstände nicht unbedingt nötig, denn der
> Mikrocontroller enthält schon welche, die Du per Befehl einschalten
> kannst.

Tatsächlich mit pinMode( pin, INPUT_PULLUP ); danke für die Info das 
wusste ich nicht..:)


Digi Spark schrieb:
> wo wird der pinMode für Pin 12 gesetzt?

Oh mann, den pinMode hab ich ganz vergessen ^^

Digi Spark schrieb:
> Was willst Du denn eigentlich erreichen? Aus dem Code wird das nämlich
> nicht ersichtlich ;-)

Das Ergebnis soll sein, das jeder Schalter eine verschiedene LED
schaltet. Weiß zwar das das viel einfacher geht aber nachher soll ein 
Codeschloss entstehen daher lern ich mal die Grundlagen dachte ich.

von Digi S. (digispark)


Lesenswert?

ah sorry ... Du hast ja PullUp und keine PullDown Widerstände ... dann 
muss mein Code etwas anders aussehen:
1
#declare ledPin13 = 13              
2
#declare ledPin12 = 12
3
4
#declare inputPin1 = 7            
5
#declare inputPin2 = 6
6
#declare inputPin3 = 5
7
#declare inputPin4 = 4
8
9
void setup() {
10
11
pinMode(ledPin13, OUTPUT);     
12
pinMode(ledPin12, OUTPUT);
13
14
pinMode(inputPin1, INPUT);     
15
pinMode(inputPin2, INPUT);
16
pinMode(inputPin3, INPUT);
17
pinMode(inputPin4, INPUT);
18
19
}
20
21
void loop(){
22
23
  if (digitalRead(inputPin1) == LOW{
24
    digitalWrite(ledPin12, HIGH);
25
  }  
26
27
  if (digitalRead(inputPin2) == LOW{
28
    digitalWrite(ledPin12, LOW);
29
  }  
30
31
  if (digitalRead(inputPin3) == LOW{
32
    digitalWrite(ledPin13, HIGH);
33
  }  
34
35
  if (digitalRead(inputPin4) == LOW{
36
    digitalWrite(ledPin13, LOW);
37
  }
38
}

von Karl H. (kbuchegg)


Lesenswert?

eizi schrieb:

> Das Ergebnis soll sein, das jeder Schalter eine verschiedene LED
> schaltet.

OK. Schön.
Aber wo sind denn deine 'verschiedenen LED' im Code?
Bis jetzt sind das ja nur 2 (eigentlich 1 1/4) LEDs, die da im Spiel 
sind. Wenn du 4 Taster hast und jeder Taster eine andere LED bearbeiten 
soll, dann brauchst du auch 4 LED. Und zwar sowohl real als auch im 
Programm.

Im Moment ist deine LED an Pin 13 der 'Mann in der Mitte', dem die einen 
'geh nach rechts' und die anderen 'geh nach links' zurufen. Ja, was denn 
nun?

von eizi (Gast)


Lesenswert?

Okey. Ich beginne nochmal ganz von vorne.


Ich habe jetzt die Schaltung nach diesem 
(http://www.physical-computing.de/blog/2008/04/digitaler-input-einstieg/)
Tutorial nachgebaut, habe aber auf den Pullupwiderstand verzichtet 
sondern dies auf dem Arduino eingestellt.


Mein Problem ist, dass bei meinem Taster wo das Signal HIGH sein sollte, 
dieses LOW ist. Was läuft da verkehrt?

Seht selbst
Orginalcode:
1
int ledPin = 13;                // choose the pin for the LED
2
int inputPin = 8;               // choose the input pin (for a pushbutton)
3
int val = 0;                    // variable for reading the pin status
4
5
void setup() {
6
pinMode(ledPin, OUTPUT);      // declare LED as output
7
pinMode(inputPin, INPUT);     // declare pushbutton as input
8
}
9
10
void loop(){
11
val = digitalRead(inputPin);  // read input value
12
if (val == HIGH) {            // check if the input is HIGH
13
digitalWrite(ledPin, LOW);  // turn LED OFF
14
}
15
else {
16
digitalWrite(ledPin, HIGH); // turn LED ON
17
}
18
}



[¢]

int ledPin = 1;                // choose the pin for the LED
int inputPin = 13;               // choose the input pin (for a 
pushbutton)
int val = 0;                    // variable for reading the pin status

void setup() {
pinMode(ledPin, OUTPUT);      // declare LED as output
pinMode(inputPin, INPUT_PULLUP);     // declare pushbutton as input
}

void loop(){
val = digitalRead(inputPin);  // read input value
if (val == LOW) {            // check if the input is HIGH
digitalWrite(ledPin, LOW);  // turn LED OFF
}
else {
digitalWrite(ledPin, HIGH); // turn LED ON
}

[/c]

von Karl H. (kbuchegg)


Lesenswert?

eizi schrieb:

> Mein Problem ist, dass bei meinem Taster wo das Signal HIGH sein sollte,
> dieses LOW ist. Was läuft da verkehrt?

Gar nichts.
Das ist völlig normal.

Ist doch nur eine Konvention, ob ein gedrückter Taster ein High oder ein 
Low liefert. Nichts, was man nicht im Programm berücksichtigen könnte.

Allerdings geht es auf einem AVR mit Bordmitteln nicht anders, weil der 
nur eingebaute Pullup Widerstände hat (und keine Pulldowns). Die ziehen 
einen offenen Eingang nun mal auf High (daher ja auch: Pull-Up).

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.