While Schleife

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.

Danke schon mal im Voraus!

Bitte "code tags" benutzen, sowie

 while(A == 1)
  {
   digitalWrite(LEDR, HIGH);
  }

was uebrigens eine unendliche Schleife ist. In der Schleife wird A nie geaendert.

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

or this if you don't need to keep the A variable:

#define LEDR 12

int  C;


void setup ()
{
  pinMode(LEDR, OUTPUT);
}


void loop ()
{
  
  C = analogRead(A0); 
  
  if(C > 120 && C <= 240)
  {
    digitalWrite(LEDR, HIGH);
  } else
  {
    digitalWrite(LEDR, LOW);
  } 
}

Was haltet ihr von

digitalWrite(LEDR, (C >120 && C<=240));

?

Die Globale Variable C stört mich :wink:

... ooooch, dat is ja bis hier hin auch noch kein richtiges programm ... :wink:

michael_x:
Die Globale Variable C stört mich :wink:

na gut, dann halt so:

digitalWrite(LEDR, (digitalRead(LEDR) >120 && digitalRead(LEDR) <=240));
digitalWrite(LEDR, (analogRead(A0) >120 && analogRead(A0) <=240));

Du meinst wohl analogRead :wink:
Aber zwei mal analogRead aufrufen um einmal digitalWrite zu sparen, kanns nicht sein, oder ?

const byte LEDR =12;
void setup() {
   pinMode(LEDR, OUTPUT);
}

void loop() {
byte val = analogRead(A0)>>2; 
digitalWrite(LEDR, 120/4 < val && val <= 240/4 ); 
}

Das ist jetzt ein kompletter Arduino-Sktech. ( 120/4 rechnet übrigens der Compiler gratis aus )

das Problem möchte ich gelöst haben oder geht das mit der while Schleife gar nicht?

Ja, das geht mit einer while Schleife nicht.

loop() ist die Scheife.
Dein while führt dazu, dass der Arduino hängt.

ja, meinte analogRead, habs mal verbessert, für den Fall, dass ........

aber war eigentlich um die globale Variable C zu sparen :wink:

ElEspanol:
ja, meinte analogRead, habs mal verbessert, für den Fall, dass ........

... ich das lese. Ich vermute mal, Du meinst:

digitalWrite(LEDR, (analogRead(A0) >120 && analogRead(A0) <=240));

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

das ist etwas zu absolut formuliert

Das ist Absicht.

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

agmue:

digitalWrite(LEDR, (analogRead(A0) >120 && analogRead(A0) <=240));

Genau, dass passiert halt wenn man auf die schnelle am Smartphone was machen will.

habs mal verbessert, für den Fall, dass ........

michael_x:
Man kann viel Unsinn programmieren, der oft trotzdem funktioniert.

Wohl war! Und manchmal habe ich Lust auf Unsinn ::slight_smile:

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? :confused:

Und manchmal habe ich Lust auf Unsinn

handshake - da sind wir ja schon zwei :wink:

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