While-Schleife Beenden funktioniert nicht

Hallo,

bin neu hier, habe meine Arduino UNO auch erst seit 3 Wochen, habe aber sofort großen Gefallen an ihm gefunden :slight_smile:

Nur leider will die "Technik" oft nicht so wie ich es gerne hätte :smiley:
Und bei meinem jetzigen Problem komme ich auch einfach auf keine Lösung.

Mein Arduino soll die Eingaben von meinem Handy auslesen über ein Bluetooth-Modul,
funktioniert soweit auch ohne Probleme.

Allerdings schaffe ich es einfach nicht die While-Schleife(n) zu beenden wenn sich die Variable "mode" ändert:

int ledpin = 3;
int delay_flash = 125;

void setup()
{
  Serial.begin(9600); 
  pinMode(ledpin, OUTPUT);

}

void loop()
{
  int mode = Serial.read();
  
  if(mode == '0') digitalWrite(ledpin, LOW);
  if(mode == '1') digitalWrite(ledpin, HIGH);
  
  while(mode == '2'){
    digitalWrite(ledpin, HIGH);
    delay(delay_flash);
    digitalWrite(ledpin, LOW);
    delay(delay_flash);
  }
}

Habe schon folgendes Probiert:

while(mode == '2'){
  digitalWrite(ledpin, HIGH);
  delay(delay_flash);
  digitalWrite(ledpin, LOW);
  delay(delay_flash);
  if(mode != '2') break;

Und

if(mode == '2'){
  goto1:
  digitalWrite(ledpin, HIGH);
  delay(delay_flash);
  digitalWrite(ledpin, LOW);
  delay(delay_flash);
  if(mode == '2'){goto goto1;}

Und noch ein, zwei andere Sachen,
schaffe es aber nicht.

Ich hoffe von euch kann mir jemand helfen :slight_smile:

mfg

Wenn mode == 2 ist wird die Schleife ausgeführt. Und zwar so lange bis sich mode ändert. Erst dann wird die Schleife verlassen. Wie soll die Schleife was von einer Änderung mitbekommen, wenn Du mode nur außerhalb der Schleife änderst?

Vielen Dank :slight_smile:

Mit

while(mode == '2'){
  digitalWrite(ledpin, HIGH);
  delay(delay_flash);
  digitalWrite(ledpin, LOW);
  delay(delay_flash);
  if(Serial.available()){
    mode = Serial.read();

funktioniert es jetzt :slight_smile:

War mir bis jetzt unbekannt, dass sich die Variablenänderung nicht auf die laufende Schleife auswirkt :wink:

mfg

Crazyfrog:
War mir bis jetzt unbekannt, dass sich die Variablenänderung nicht auf die laufende Schleife auswirkt :wink:

Welche Veränderung denn?

void loop()
{
  int mode = Serial.read();
  
  if(mode == '0') digitalWrite(ledpin, LOW);
  if(mode == '1') digitalWrite(ledpin, HIGH);
  
  while(mode == '2'){
    digitalWrite(ledpin, HIGH);
    delay(delay_flash);
    digitalWrite(ledpin, LOW);
    delay(delay_flash);
  }
}

Dein loop() wird so lange durchlaufen, bis beim read() eine 2 gelesen wird. Damit ist die Bedingung für die While-Schleife gültig. Die wird jetzt so lange durchlaufen, wie die Bedingung gültig ist. Nur die While-Schleife, nix davor. Da damit mode nie ein neuer Wert zugewiesen werden kann, ist die Schleife endlos gültig.

vieledinge:
Dein loop() wird so lange durchlaufen, bis beim read() eine 2 gelesen wird. Damit ist die Bedingung für die While-Schleife gültig. Die wird jetzt so lange durchlaufen, wie die Bedingung gültig ist. Nur die While-Schleife, nix davor. Da damit mode nie ein neuer Wert zugewiesen werden kann, ist die Schleife endlos gültig.

Dann hab ich wohl irgendwo etwas falsch aufgeschnappt.
Dachte nämlich mal gelesen zu haben, dass read() auch funkioniert, wenn eine Schleife bereits läuft :blush:

tut es doch aber read() liest gneu in dem augenblick wo du es aufrufst was aus, und das passierte ja auserhalb deiner schleife. Wenn du erstmal in der Schleife drin bist führtest du ja kein read mer aus. Arduino ist wie wir Menschen eben faul, wenns nix machen muß macht's nix, sprich wenn du ihm nicht sagst ließ es ständig aus dann macht es das genau einmal und dann eben nix mehr :smiley:

Chaos_Lord:
Arduino ist wie wir Menschen eben faul, wenns nix machen muß macht's nix, sprich wenn du ihm nicht sagst ließ es ständig aus dann macht es das genau einmal und dann eben nix mehr :smiley:

MIcrocontroller sind wie Computer: Die machen nicht das was sie sollen, sondern was man ihnen sagt.... :wink: