Pages: [1]   Go Down
Author Topic: Warum funktioniert dieser Sketch ?  (Read 1730 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Guten Tag Zusammen,

wie so viele bin ich Neueinsteiger beim Arduino.
Nun bin ich seit 3 Tagen Besitzer eines Arduino Uno und dem Buch Die elektronische Welt mit Ardiuno entdecken.

Nun ja soweit so gut, alles prima, alles toll.
Nach jedem Projekt gibt es eine Aufgabe um das gelernte zu vertiefen.

Nun war die Aufgabe einen Sketch zu schreiben der LED´s mit einem Taster "weiterschaltet".
Dies ist mir auch gelungen aber ich verstehe nicht warum er geht.

Code:
int ledPin [] = {4,5,6,7,8,9,10,11,12,13};   //  LED 1-10
int taster = 3;                    //  Taster pin 3
int wartezeit = 100;              // Wartezeit fuer entprellen
int tasterStatus = 0;                  // Variable Taster status aktuell
int tasterStatusvorher = 0;            // Variable Taster Status vorher
int zaehler = 0;                       // Variable Zaehler


void setup()
{
  Serial.begin(9600);              // Bautrate fur Serialen Monitor
    pinMode(taster, INPUT);        // Eingang Taster
  for(int u=0; u<10; u++){           // Schleife fuer Ausgänge setzten
    pinMode(ledPin[u], OUTPUT);    // Ausgänge setzten
  }

}

void loop()
{
  tasterStatus = digitalRead(taster);  // Abfrage Taster
  if (tasterStatusvorher != tasterStatus) // Alter Taster STatus mit aktuellem taster Status ungleich ?
  {
    if (tasterStatus ==HIGH)     // ist tasterStatus = wahr
   {
    zaehler ++;     // setzte zaehler +1
    Serial.println(zaehler);
  }
   
  }
  tasterStatusvorher = tasterStatus; // Speichert den aktuellen taster status
 
  if (zaehler >=0){                  // wenn zaehler groesser oder gleich 0
  digitalWrite(ledPin[zaehler], HIGH);
  digitalWrite(ledPin[zaehler], LOW);
  }
  if (zaehler >9)   
  zaehler =0;      //wenn zaehler groesser 9 setze ihn auf 0
}

mir geht es um

 if (zaehler >=0){                  // wenn zaehler groesser oder gleich 0
  digitalWrite(ledPin[zaehler], HIGH);
  digitalWrite(ledPin[zaehler], LOW);

Es ist nun so das wenn ich den Taster drücke geht die nächste LED an und die Aktuelle LED aus,
genau das was passieren soll aber warum ?

Mein Variablle (zaehler) sollte doch identisch sein, Sprich normal dürfte keine LED leuchten.
aber warum zum teufel geht es trotzdem ?

hatte vorher einiges ausprobiert, aber hat nicht zum erfolg geführt und wo ich nicht mit gerechnet hätte gehts.

Danke
Benedikt



Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 359
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zunächst ist die Abfrage if (zaehler >=0){ 
völlig überflüssig. zaehler ist immer größer als Null, denn wenn zaehler 9 ist wird er auf 0 gesetzt
und im nächsten Durchlauf wieder ++ eins hoch gezählt.
Aber die LED dürften doch nur einmal ganz kurz blinken, denn sie werden ja an und sofort wieder
ausgeschaltet. Das es der Reihe nach geht liegt doch am array, denn bei jedem Tastendruck wird doch der
nächste Pin aus dem array angesprochen.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für deine Antwort,

der zaehler ist noch vom eigentlichen Sketch aber hast recht, den hätte ich auch entfernen können.

"Aber die LED dürften doch nur einmal ganz kurz blinken, denn sie werden ja an und sofort wieder
ausgeschaltet."

Das ist das, was ich auch erwartet habe aber es ist so das die LED die An war Aus geht und die Folgende An geht.
 Und das ist ja das was ich nicht kapiere.

mit dem arry hatte ich ja kapiert. Ich verstehe halt nur die sache nicht das die alte LED aus geht und die nächste an.

Ich hatte es vorher mit 2 Variablen versucht hat aber nicht so geklappt wie ich wollte,
Dann hatte ich versucht die gleiche Variable im LOW befehl mit -- eins runter zuzählen aber das gab ganz merkwürdige Ergebnisse.

Daherher ja die frage warum Funktioniert das so ?

Logged

Stuttgart
Offline Offline
God Member
*****
Karma: 13
Posts: 511
logic enrichments
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
 if (zaehler >=0){                  // wenn zaehler groesser oder gleich 0

Ist doch immer erfüllt ?

Code:
digitalWrite(ledPin[zaehler], HIGH);
digitalWrite(ledPin[zaehler], LOW);

Wird ständig durchlaufen. Bist Du dir sicher daß die LEDs nicht flimmern anstatt durchgehend zu leuchten ? In einer Geschwindigkeit, die das Auge nicht mehr wahrnehmen kann.

Edit:

Versuche mal folgende Ergänzung:
Code:
digitalWrite(ledPin[zaehler], HIGH);
delay(500);
digitalWrite(ledPin[zaehler], LOW);
delay(500);

« Last Edit: October 13, 2012, 01:59:48 pm by Realizer » Logged

Eine Kuh macht muuhh.
Viele Kuehe machen Muehe

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke Realizer

Das war des Rätzel´s Lösung.
Die armen LED´s ...

Naja hab es nun mit 2 Variabelen da geht es dann auch mit dem delay smiley

Danke
Grüße
Benedikt
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21269
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die Alternative ist

Quote
digitalWrite(ledPin[zaehler-1], LOW);
digitalWrite(ledPin[zaehler], HIGH);

Dann mußt Du aber den Fall wenn die letzte LED ausgehen soll und die erste an anders realisieren.

Grüße Uwe
 
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Uwe

ich hab es nun so realisiert;
Code:
int ledPin [] = {4,5,6,7,8,9,10,11,12,13};   //  LED 1-10
int taster = 3;                    //  Taster pin 3
int wartezeit = 100;              // Wartezeit fuer entprellen
int tasterStatus = 0;                  // Variable Taster status aktuell
int tasterStatusvorher = 0;            // Variable Taster Status vorher
int zaehler = 0; // Variable Zaehler
int zaehler2 = -1; //Variable Zaehler 2


void setup()
{
  Serial.begin(9600);              // Bautrate fur Serialen Monitor
    pinMode(taster, INPUT);        // Eingang Taster
  for(int u=0; u<10; u++){           // Schleife fuer Ausgänge setzten
    pinMode(ledPin[u], OUTPUT);    // Ausgänge setzten
  }

}

void loop()
{
  tasterStatus = digitalRead(taster);  // Abfrage Taster
  if (tasterStatusvorher != tasterStatus) // Alter Taster STatus mit aktuellem taster Status ungleich ?
  {
    if (tasterStatus ==HIGH)     // ist tasterStatus = wahr
   {
    zaehler ++;     // setzte zaehler +1
    zaehler2 ++;   // setze zaehler2 +1 (auschalten LED)
    Serial.println(zaehler2); //ausgabe zaehler 2
  }
   
  }
  tasterStatusvorher = tasterStatus; // Speichert den aktuellen taster status
 
  {                 
  digitalWrite(ledPin[zaehler], HIGH);
  digitalWrite(ledPin[zaehler2], LOW);
  }
  if (zaehler >9)   
  zaehler =0;      //wenn zaehler groesser 9 setze ihn auf 0
  if (zaehler2 >8)
  zaehler2 = -1;  // wenn zaehler2 groesser 8 setze ihn auf -1
}

es ist sicherlich auch noch nicht die schönste Variante aber ich bin ja noch am üben smiley
2 Kapitel weiter wurde auch schon was erklärt, aber das habe ich dann in der Ampelsteuerung umgesetzt.

es ist sehr interesant wieviele Wege nach Rom führen, aber für mich als Anfänger kann es auch sehr verwirrend sein.
Da ich zugegebener Maßen auch nicht der hellste im Kopf bin dauert es auch länger bis ich etwas verstehe,
Daher kann ich mich auch sehr über 2 blinkende LED´s freuen smiley
Naja wie heist es immer so schön "hätt ich doch mal was gescheites gelernt" dann wäre ich da schon seit 15 jahren im Thema smiley

Grüße
Benedikt



Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21269
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du kannst es auch mit 1 Variablen machen und es ist besser zuerst die vorige LED auszuschalten und dann die LED einzuschalten.

Code:
...
if (tasterStatus ==HIGH)     // ist tasterStatus = wahr
   {
    zaehler ++;     // setzte zaehler +1
    ...
  }
...
if (zaehler >9)
{
zaehler = 0;   
digitalWrite(ledPin[9], LOW);
}
else
{
digitalWrite(ledPin[zaehler-1], LOW);
}
digitalWrite(ledPin[zaehler], HIGH);

Quote
Da ich zugegebener Maßen auch nicht der hellste im Kopf bin dauert es auch länger bis ich etwas verstehe,
Nein, es hat es Dir nur noch niemand richtig gut erklärt.  smiley-wink smiley-wink smiley-wink

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

erst mal Danke für deine netten Worte zum schluss smiley

ich hätte nun aber doch noch 2 Fragen ..

gibt es einen unterschied zwischen -- und -1 ?
Ich hatte bei meinen versuchen mit nur 1 Variable [zaehler--] verwendet und daran bin ich anscheinend gescheitert.
-1 geht -- geht nicht.

aus welchen Gründen ist es besser erst die eine LED auszuschalten um dann die nächste einzuschalten ? Da geht es ja nur um Millisekunden.
Ist das auch so ein Ding was man sich besser dierekt angewöhnt? Damit man bei späteren Projekten nicht mal 2 Verbraucher kurzzeitig an hat die dann zuviel Strom ziehen ?

Gruß
Benedikt
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21269
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

i-- und i=i-1 ist das gleiche.

array[zaehler--] benutzt den Wert der Variablen zaehler als Index des Arrays und zieht dann 1 ab.
Du hast also folgendes gemacht:
array[zaehler];
zaehler--;

array[zaehler-1] benutzt den Wert der Variablen zaehler und subtrahiert davon 1 bevor der Wert als Index des Arrays verwendet wird. Der Wert der Variablen zaehler wird nicht verändert.

Zuerst ausschalten dann einschalten:
In diesem Fall ist es fast egal;
Du hast recht, wenn beide kurz eingeschaltet sind, dann ist kurz der Strom größer.
Es kann auch sein, daß man dieses kurz eingeschaltet sein, sieht. zB bei einer Matrix.
Wie Du richtig bemerkst ist das eines von den Dingen, die man sich angewöhnen sollte, um in bestimmten Fällen, wo es nicht egal ist, dann keinen Fehler zu machen.

Ich bin der Meinung, daß nicht unbedingt der Schüler begriffstützig ist, sondern meist der Lehrer nicht lehren kann. Ich erinnere mich in Film Full Monty wo sie den Tanz einüben. Da sollen einige zurückgehen und andere nach vorne um in einer Reihe zu stehen. Gerald, der den Lehrer macht, bringt das nicht richtig rüber, bis einer sagt: "so wie in einer Abseitsfalle" und allen ist klar was gemeint ist. http://www.youtube.com/watch?feature=player_detailpage&v=y6T9Bz4bBlg#t=119s (sind leider nur 5 Sekunden ohne Ton).

Grüße Uwe
« Last Edit: October 15, 2012, 04:30:54 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

naja nach deiner beschreibung ist für mich nun i-- und i-1 nicht das gleiche smiley

ich hatte das halt so verstanden das ich überall wo ich 1 abziehen möchte -- schreiben kann da es einfach schneller geht als -1

aber es macht ja nun im fall des array doch gravierende Unterschiede so das ich mir hinter die Ohren schreiben muss, das wenn ich den neuen wert als Index haben möchte benutze -1
möchte ich lediglich eine Variable verändern die "irgentwann" abgefragt wird kann ich -- verwenden.
Aber -1 geht dann ja in so einem Fall auch.
Also -- ganz vergessen und immer -1 schreiben und ich hab dieses Problem nie wieder ?
++ geh ich mal davon aus ,dass das Analog läuft.

Wo ich dir auch recht geben muss, ist wenn ein Leherer nicht erklären kann wird es mit dem Verständniss schwer.
Naja bei mir ist der Lehrer nun nur ein Buch, was ich eigentlich auch Recht anschaulich geschrieben finde, aber der nachteil ist halt auch, wenn man eine frage hat ist kein Lehrer da den man dierekt fragen kann wie in der Schule. (und wenn nicht alle benötigten Teile im Haus sind kann man es auch nicht nach Bauen und testen)

Aber Gott sei dank läuft seit Freitag das Internet wieder so das man nette Hilfsbereite Menschen fragen kann.

Grüße
Benedikt

Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21269
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Um eine Variable zu erhöhen oder 1 zu subtrahieren ( erniedrigen darf ich nicht sagen wurde mir gesagt  smiley-wink smiley-wink ) kannst Du beide Versionen verwenden:
i++ bzw i--
oder i=i+1 oder i+=1 bzw i=i-1 oder i-=1;
http://arduino.cc/en/Reference/IncrementCompound

Bei Index ist es anders.
Du willst ja nicht den Wert der Variable die Du als Index verwendest verändern sondern Du willst nur das Element des Arrays, das vor dem Index-Wert ist, nehmen (in Deinem Fall das LED ausschalten das eingescheltet war). ( zB Index ist 5 und Du willst array[4] haben)

Wenn Du da mit -- oder ++ arbeitest veränderst Du den Index.

Man kann auch mit ++i die Variable vor dem Gebrauch erhöhen.
siehe Beispiele auf http://arduino.cc/en/Reference/Increment

Grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok das hab ich soweit verstanden.

es sind halt doch die Kleinigkeiten auf die es ankommt.
Heute Mittag sind meine Register Bausteinschen gekommen.
in dem Kapitel wird viel mit arrays die rauf und runter geschoben werden gearbeitet.
Da wollen wir dann das gelernte mal vertiefen.

Danke
Benedikt



Logged

Pages: [1]   Go Up
Jump to: