BT - Modul HC - 05

Hallo Zusammen,

ich hänge gerade bei einem Problem. Ich habe das oben genannte Bt-Modul am Arduino angeschlossen und will verschiedene "Befehle" ausführen.
Das ist mein Sketch mit dem ich es testen will:

char btdata;
int led1 = 50;
int led2 = 51;
int led3 = 52;
int led4 = 53;
int i;




void setup() {
  Serial.begin(9600);
  for (i = 50; i < 54; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {

  if (Serial.available()) {
    btdata = Serial.read();
    Serial.print("btdata:");
    Serial.println(btdata);
  }
  while (btdata == '1') {

    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);

  }
  while (btdata == '2') {
    for (i = 50; i < 54; i++) {
      digitalWrite(i, HIGH); 
    }
    
    delay(500);
    
    for (i = 50; i < 54; i++) {
      digitalWrite(i, LOW);
      }
    delay(500);
  } 
}

Der Sketch ist nur zum Versuchen! Ich will ihn später etwas ausweiten.
Nun mein Problem ist, wenn ich in einer while Schleife bin komme ich nicht mehr raus, ich will es so haben das wenn eine while läuft und das BT-Modul eine neue Zahl erhält, der Arduino die noch laufende Schleife zu Ende führt und an dann die andere ausführt.
Könnt ihr mir dabei helfen?
Im vor raus schonmal vielen dank euch.

Gruß
Andi

Du hast in loop() schon eine Schleife. Weitere Schleifen bereiten bei sowas nur Probleme

Lege dir eine Variable an die den aktuellen Zustand beschreibt. Das hast du mit "btdata" im Prinzip schon.
Je nach dem Zustand kannst du dann unterschiedliche Dinge tun. Aber mit "if" statt "while"! Und nebenher noch die serielle Schnittstelle abfragen ob neue Daten da sind - und wenn ja den Zustand ändern.
Es gibt keinen Grund da zusätzliche Schleifen anzulegen. Wenn du das mit if einmal ausführst sorgt loop() schon dafür dass es nochmal dran kommt.

Naja, da steckt mehr Aufwand dahinter, aber mal zu antesten:

void loop()
{
  if (Serial.available())
  {
    btdata = Serial.read();
    Serial.print("btdata:");
    Serial.println(btdata);
    if (btdata == '1')
    {
      digitalWrite(led1, HIGH);
      digitalWrite(led2, HIGH);
      digitalWrite(led3, HIGH);
      digitalWrite(led4, HIGH);
    }
    if (btdata == '2')
    {
      for (i = 50; i < 54; i++)
      {
        digitalWrite(i, HIGH);
      }
      delay(500);
      for (i = 50; i < 54; i++)
      {
        digitalWrite(i, LOW);
      }
      delay(500);
    }
  }
}

Mehr hab ich in der Zeit nicht geschafft...

Ok, ich Versuche es gleich mal

Bei den meisten Arduinos ist die Serielle schon durch Verbindung zum PC belegt.
Eine Doppelbelegung führt sicherlich zu Problemen

Mit der Doppelbelegung habe ich kein Problem, das funktioniert so.

Kann mir jemand vielleicht noch sagen wie ich es hinbekomme das die LED´s solange blinken bis ich dem BT-Modul die nächste Zahl sende sende um einen anderen Befehl auszuführen.

OK ....
Wenn es dich nicht stört, dass da Treiber gegeneinander arbeiten....

Die Zaubermittel sind hier:

  1. Endliche Automaten (z.B. Schrittketten)
  2. Nebenläufige Programmierung (Multitasking)