Guten Tag,
ich habe eine Frage bezüglich einer while Schleife. Hier einmal mein Programm:
#define LEDR 12
int A;
int C;
void setup ()
{
pinMode(LEDR, OUTPUT);
}
void loop ()
{
C = analogRead(A0);
digitalWrite(LEDR, LOW);
if(C > 120 && C <= 240)
{
A = 1;
} else
{
A = 0;
}
while(A == 1)
{
digitalWrite(LEDR, HIGH);
}
}
LEDR : ganz normale LED
A0 : Analoger Eingang für die Abfrage verschiedener Taster
Problem: Die LED leuchtet wenn ich den Taster drücke, hört aber nicht auf zu leuchten, wenn ich ihn loslasse. die Werte für den Taster sind richtig, die nehme ich für andere Programme auch. Im Arduino Tutorial habe ich gelesen, dass das mit der While Schleife so machbar ist, dass sobald die Bedingung in der Klammer nicht mehr erfüllt ist, die Schleife beendet. Das tut es aber leider nicht. Das Programm macht zwar kein Sinn, aber das Problem möchte ich gelöst haben oder geht das mit der while Schleife gar nicht? Mir ist halt wichtig, dass die Anweisung in der while Schleife solange wiederholt wird, bis die Bedingung nicht mehr erfüllt ist.
david_95:
Problem: Die LED leuchtet wenn ich den Taster drücke, hört aber nicht auf zu leuchten, wenn ich ihn loslasse. die Werte für den Taster sind richtig, die nehme ich für andere Programme auch. Im Arduino Tutorial habe ich gelesen, dass das mit der While Schleife so machbar ist, dass sobald die Bedingung in der Klammer nicht mehr erfüllt ist, die Schleife beendet. Das tut es aber leider nicht. Das Programm macht zwar kein Sinn, aber das Problem möchte ich gelöst haben oder geht das mit der while Schleife gar nicht? Mir ist halt wichtig, dass die Anweisung in der while Schleife solange wiederholt wird, bis die Bedingung nicht mehr erfüllt ist.
#define LEDR 12
int A;
int C;
void setup ()
{
pinMode(LEDR, OUTPUT);
}
void loop ()
{
C = analogRead(A0);
if(C > 120 && C <= 240)
{
A = 1;
} else
{
A = 0;
}
ifA == 1)
{
digitalWrite(LEDR, HIGH);
} else
{
digitalWrite(LEDR, LOW);
}
}
michael_x:
Ja, das geht mit einer while Schleife nicht.
Eigentlich möchte ich Dir fast überhaupt nicht widersprechen, aber das ist etwas zu absolut formuliert. Ich wüßte keinen Grund, hier eine while-Schleife zu verwenden, darin stimmen wir überein, aber gehen tut es. Nach einem Blick in die Referenz, wie while so benutzt wird, könnte man es so machen:
#define LEDR 13
int C;
void setup ()
{
Serial.begin(9600);
pinMode(LEDR, OUTPUT);
C = analogRead(A0);
}
void loop ()
{
while (C > 120 && C <= 240)
{
digitalWrite(LEDR, HIGH);
C = analogRead(A0);
Serial.println(C);
}
while (!(C > 120 && C <= 240))
{
digitalWrite(LEDR, LOW);
C = analogRead(A0);
Serial.println(C);
}
}
Man kann viel Unsinn programmieren, der oft trotzdem funktioniert.
Auch dein Gegenbeispiel dient eher als Demo, dass ein while() nichts bringt, selbst wenn es bei genügend Vorsicht funktioniert.
void setup() {
Serial.begin(9600);
mySetup();
while (1) myLoop();
}
void loop() {Serial.println("Das wird nie drankommen");}
SerialEvent geht sicher nicht, sonst nur als abschreckende demo, dass while() möglich ist, zu sehen
michael_x:
Man kann viel Unsinn programmieren, der oft trotzdem funktioniert.
Wohl war! Und manchmal habe ich Lust auf Unsinn :
Eigentlich wollte ich mit meinem Sketch in #10 zeigen, daß keine Ausgabe erzeugt wird, wenn sich der Wert von A0 nicht ändert. Schließlich habe ich hier im Forum gelesen, Serial.print füllt den Ausgabepuffer, der zwischen Ende von loop und Anfang von loop Richtung serieller Schnittstelle gelehrt wird.
Wenn ich mir das richtig gemerkt habe, dann dürfte innerhalb von while nur der Puffer beschrieben werden, bis er überläuft. Irgendwie sind die Heinzelmännchen aber fleißiger als gedacht, denn warum sieht die Ausgabe doch ganz normal aus?
Schließlich habe ich hier im Forum gelesen, Serial.print füllt den Ausgabepuffer, der zwischen Ende von loop und Anfang von loop Richtung serieller Schnittstelle gelehrt wird.
Das stimmt nicht ganz, denke ich:
Sobald Zeichen im Ausgabepuffer und Interrupts offen sind, werden sie langsam eins nach dem andern seriell gesendet, egal wie lange loop irgendwo in while() Schleifen oder delay oder sonstwo hängt.
michael_x:
Sobald Zeichen im Ausgabepuffer und Interrupts offen sind, werden sie langsam eins nach dem andern seriell gesendet, egal wie lange loop irgendwo in while() Schleifen oder delay oder sonstwo hängt.
So wird es wohl sein! Da habe ich durch dieses Thema und meine unsinnige Programmierung doch tatsächlich noch was gelernt