Warum funktioniert dieser Sketch ?

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.

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

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.

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 ?

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

Ist doch immer erfüllt ?

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:

digitalWrite(ledPin[zaehler], HIGH);
delay(500);
digitalWrite(ledPin[zaehler], LOW);
delay(500);

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 :slight_smile:

Danke
Grüße
Benedikt

Die Alternative ist

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

Hallo Uwe

ich hab es nun so realisiert;

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 :slight_smile:
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 :slight_smile:
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 :slight_smile:

Grüße
Benedikt

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

...
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);

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. :wink: :wink: :wink:

Grüße Uwe

erst mal Danke für deine netten Worte zum schluss :slight_smile:

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

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. The Full Monty 2 1997 Robert Carlyle - YouTube (sind leider nur 5 Sekunden ohne Ton).

Grüße Uwe

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

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

Um eine Variable zu erhöhen oder 1 zu subtrahieren ( erniedrigen darf ich nicht sagen wurde mir gesagt :wink: :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

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