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.
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.
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.
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.
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.
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
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
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
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 ?
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. The Full Monty 2 1997 Robert Carlyle - YouTube (sind leider nur 5 Sekunden ohne Ton).
naja nach deiner beschreibung ist für mich nun i-- und i-1 nicht das gleiche
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.
Um eine Variable zu erhöhen oder 1 zu subtrahieren ( erniedrigen darf ich nicht sagen wurde mir gesagt ) 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.
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.