Arduino Anfänger benötigt Hilfe bei seinem 4. Projekt

Hi Leute
ich beschäftige mich seit einer Woche mit Arduino ... habe keiner lei vorkenntnisse da ich erst im 1.Ausbildungsjahr zum Mechatroniker bin
und habe mir dementsprechen ein Buch mit Aufgaben gekauft

nun hatte ich die Aufgabe eine LED mittels eines Tasters an und aus zu schalten wobei nach einem Tasterdruck die LED anbleiben soll und beim darauffolgendem Druck wieder ausgeht

dies wurde mir dann so vorgeschlagen >>>

int tasterpin = 8;
int tasterwert = 0;
int vorhertasterwert = 0;
int ledpin = 10;
int zaehler = 0;

void setup(){
  pinMode (tasterpin, INPUT);
  pinMode (ledpin, OUTPUT);
}
void loop(){
  tasterwert = digitalRead(tasterpin);
  
  if(vorhertasterwert != tasterwert){
    if(tasterwert == HIGH){
      zaehler++;
    }

was ich jetzt nicht verstehe ist dieser Befehl:
if(vorhertasterwert != tasterwert)
genau genommen meine ich das "!="

nachdem ich diese Schaltung verstanden habe
soll ich nach dem gleichen Prinzip eine Schaltung aufbauen und natürlich
mit der Arduino Software schreiben dass ich eine Kette von LED mittels eines Tasters in einer Reihenfolge anschalten

tasterdruck>
led1 geht an
tasterdruck>
led1 bleibt an und led 2 geht an
tasterdruck>
led 1 +2 bleiben anund 3 geht an... usw

bis ich bei led 5 angekommen bin und alles wieder von vorne beginnt

mein Vorschlag (leider funktioniert das nicht):

int tasterpin = 8;
int tasterwert = 0;
int vorhertasterwert = 0;
int led0 = 2;
int led1 = 3;
int led2 = 4;
int led3 = 5;
int led4 = 6;
int zaehler = 0;

void setup(){
  pinMode (tasterpin, INPUT);
  pinMode (led0, OUTPUT);
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  pinMode (led3, OUTPUT);
  pinMode (led4, OUTPUT);
        
}
void loop(){
  tasterwert = digitalRead(tasterpin);
  
  if(vorhertasterwert != tasterwert){
    delay(10);
    if(tasterwert == HIGH){
      zaehler++;
    }
  }
  
  vorhertasterwert = tasterwert;
  
  if(zaehler>5) zaehler == 0;
   digitalWrite(led0, LOW);
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
   
  if(zaehler == 1)
   digitalWrite (led0, HIGH);
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
   
  if(zaehler == 2)
   digitalWrite (led0, HIGH);
   digitalWrite (led1, HIGH);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
  
  if(zaehler == 3)
   digitalWrite (led0, HIGH);
   digitalWrite (led1, HIGH);
   digitalWrite (led2, HIGH);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
  
   
  if(zaehler == 4)
   digitalWrite (led0, HIGH);
   digitalWrite (led1, HIGH);
   digitalWrite (led2, HIGH);
   digitalWrite (led3, HIGH);
   digitalWrite(led4, LOW);
      
  if(zaehler == 5)
   digitalWrite (led0, HIGH);
   digitalWrite (led1, HIGH);
   digitalWrite (led2, HIGH);
   digitalWrite (led3, HIGH);
   digitalWrite (led4, HIGH);
   
}

wie schon gesagt funktioniert das nicht
weil die ersten 4 LED durchgehend an gehen
und LED 5 einmal für 5 Tasterdrücke geschalten wird und dann einfach ausbleibt :frowning:

UND JETZT ZU MEINEN FRAGEN

1.kann mir jemand diesen Befehl erklären
_if(vorhertasterwert != tasterwert)

2.wie löse ich die Aufgabe mit den 5 LEDs

Danke

gruss kevin l.

  1. Das Programm läuft Zeile nach Zeile bis es am Ende angekommen ist und von vorn beginnt. Der Wert vorhertasterwert wird somit erst nach der Abfrage neubeschrieben. Im neuen Durchlauf behält dieser sich nun den Wert und vergleicht ihn mit dem jetzten Wert von tasterwert. != bedeutet ungleich. Wenn vorhertasterwert den Wert 1 und tasterwert 0 hat, ist die If Abfrage erfüllt.

Zu 2., fehlen da nicht die { } bei mehr als einer Anweisung?

if(Ausdruck) {
Anweisung 1;
Anweisung 2;
}

Alternativ kannst du auch mit einem SwitchCase arbeiten.

switch(zaehler) {
case 0:
Anweisung 1;
Anweisung 2;
break;

case 1:
Anweisung 1;
Anweisung 2;
break;

case 2:
Anweisung 1;
Anweisung 2;
break;

....

default: // Setzt wenn der Zaehler > 0 ist den Wert wieder auf 0.
zaehler = 0;
}

Du arbeitest bei den if-Anweisungen mit Einrückungen, was die Lesbarkeit des Codes erhöht und schon zu einem guten, strukturierten Programmierstil gehört. Allerdings hast du die geschweiften Klammern drumherum vergessen! :wink:

Du brauchst die geschweiften Klammern, da du mehr als eine Anweisung ausführst.

Wenn du nur eine Anweisung ausführst, brauchst du keine:

if (abcd <= 20)
   tuwas();

wenn du mehrere Anweisungen geben willst, brauchst du sie dagegen:

if (abcd <= 20)
{
   tudies();
   tudas();
   unddasauchnoch();
}

Ich habe zwar (noch) kein Arduino hier um es nachzuvollziehen, aber ich bin mir ziemlich sicher, dass es an den doppelten Gleichheitszeichen liegt. Diese stehen in der Programmierung für gewöhnlich für einen Vergleich, im Prinzip das Gegenstück zu dem != nach dem du weiter oben gefragt hast.

== liefert true, wenn beide Seiten des Vergleichs übereinstimmen
!= liefert true, wenn sich beide Seiten des Vergleichs unterscheiden.

Eine Zuweisung braucht nur ein einfaches Gleichheitszeichen.

Außerdem würde ich diese Zuweisung an deiner Stelle auch in die geschweiften Klammern setzen.