Arduino tasterstatus=digitalRead(taster)?
Ich bin gerade am programmieren mit Arduino mithilfe von Google aber kann gerade irgendwie nicht richtig nachdenken und komme nicht darauf, wieso in diesem Code hier:
int LEDblau=6;
int taster=7;
int tasterstatus=0;
void setup()
{
pinMode(LEDblau, OUTPUT);
pinMode(taster, INPUT);
}
void loop()
{
tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH)
{
digitalWrite(LEDblau, HIGH);
delay (5000);
digitalWrite(LEDblau, LOW);
}
else
{
digitalWrite(LEDblau, LOW);
}
}
Wieso in diesem Code eine Variable mit Tasterstatus angegeben werden muss und wieso ich schreiben muss tasterstatus=digitalRead(taster)
Wieso funktioniert das nicht auch, wenn ich „das tasterstatus=digitalRead(taster)“ weglassen würde und einfach schreiben würde if (taster == HIGH)? Kann einer für Anfänger erklären warum das nicht auch funktioniert, irgendwie komme ich da gerade nicht drauf.
4 Antworten
Der Arduino spricht kein Deutsch und auch keine andere Sprache die Menschen sprechen würden, er spricht und versteht Computersprache.
Wenn du von "Taster" sprichst, dann weiß der Arduino nicht was ein Taster ist. Genauso könntest du das Wort Taster auch mit dem Wort "Druckschalter" ersetzen und der Arduino wüsste trotzdem nicht was gemeint ist.
Deshalb musst du ihm erst erklären was ein Taster ist. Das machst du mit dem Befehl.
tasterstatus=digitalRead(taster);
Hier erklärst du dem Arduino dass der "tasterstatus" ein Zustand ist, der entweder AN oder AUS sein kann. Mit digitalRead fragst du einen PIN ab, an dem bei dir auf den Breadboard der Taster angeschlossen ist. Hast du den Taster gedrückt, dann wird in der Variable tasterstatus gespeichert, dass der Taster gedrückt wurde.
if (tasterstatus == HIGH)
Hier fragst du den Arduino: "Ist der Taster gedrückt worden und hat den Zustand AN/HIGH?"
Falls Ja, geht die blaue LED an.
Man könnte den Code auch kürzer schreiben und zwar so:
void loop()
{
if (digitalRead(7) == HIGH)
{
digitalWrite(LEDblau, HIGH);
delay (5000);
digitalWrite(LEDblau, LOW);
}
else
{
digitalWrite(LEDblau, LOW);
}
}
Funktioniert genauso. Letztendlich wird entweder der numerische Rückgabewert des Funktionsaufrufs digitalRead(xy) in einer Variable gespeichert oder direkt in der Bedingung "if" ausgewertet.
EDIT: Du willst direkt "taster == HIGH" schreiben, das geht nicht. Taster ist nur ein Integer-Wert (Zahl 7). Wenn du den dann mit HIGH (vermutlich ein Define für 0 oder 1) vergleichst, kommt immer FALSE raus. Du musst den Taster 7 der Funktion "digitalRead" übergeben, damit die dir den Zustand dieses Tasters zurückliefert. Daher ist der Aufruf notwendig.
Vielleicht hilft es ihm zu wissen, dass seine Variable "taster" nur beschreibt, an welchem Data Pin auf dem Arduino sein Taster angeschlossen ist
if (taster == HIGH)
Das geht nicht. Wenn man den Code klarer schreiben würde, dann würde da stehen ganz oben
int tasterPinNummer=7;
Daraus folgt dann
if (tasterPinNummer== HIGH)
und das macht keinen Sinn.
Du kannst anstatt:
void loop()
{
tasterstatus=digitalRead(taster);
if (tasterstatus == HIGH)
{
digitalWrite(LEDblau, HIGH);
delay (5000);
digitalWrite(LEDblau, LOW);
}
auch
void loop()
{
if (digitalRead(taster) == HIGH)
{
digitalWrite(LEDblau, HIGH);
delay (5000);
digitalWrite(LEDblau, LOW);
}
schreiben. Aber das andere wird übersichtlicher und spätestens, wenn Du über serialPrint Dir DebugInfos ausgeben lassen willst, ist eine Variable sinnvoller, damit Du auch an jeder Stelle im Programmzyklus das gleiche Signal hast. Auch wenn Du den Eingang an div Stellen auswerten willst, ist eine Variable besser. Der Programmablauf erfolgt Zeilenweise. Wird ein Taster zwei mal eingelesen stat tüber eine Variable zwei mal verarbeitet, kann der Zustand am Anfang des Zyklus z.B. noch HIGH sein und am Ende des Zyklus hat sich der Zustand geändert und ist LOW. Damit hast Du innerhalb eines Programmzyklus für den gleichen EIngang zwei unterschiedliche Signale erhalten, was je nach Programm zu Fehlfunktionen führen kann und jedes Einlesen kostet extra Zeit. Macht meist keine Relevanz, wenn man aber auf µs im Zyklusablauf achten will, spart man sich noch mal ein kleines bisschen...
Und erst recht, wenn Du eine Flankenauswertung machen willst, brauchst Du zwingend variablen, also wenn etwas nur einmal beim Druck ausgeführt werden soll, egal wie lange der Taster gedrückt bleibt...