LEDs mit Blue­tooth schal­ten

Lese­zeit: 6 Minu­ten
Navi­ga­ti­on

Mit einer Smartphone-App sol­len über das Bluetooth-Modul LEDs geschal­tet wer­den.

Die Bluetooth-Module HC-05 und HM-10 unter­schei­den sich in der Ver­wen­dung von Apps für Android und iOS..
Die Pro­gram­mie­rung ist iden­tisch.

Der HC-05 und funk­tio­niert nur mit Smart­pho­nes mit Android-Betriebssystem, der HM-10 kann mit Android-Betriebssystem und iOS umge­hen.
Apple-Geräte ver­wen­den BLE (Blue­tooth Low Ener­gy), mit dem der HC-05 nicht arbei­ten kann.

Benö­tig­te Bau­tei­le:

  • 5 LEDs
  • 5 Wider­stän­de > 100 Ω
  • Bluetooth-Modul HC05/HM-10
  • Lei­tungs­dräh­te

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­ge der Bau­tei­le zu sehen)

Für Android und iOS ver­füg­ba­re Apps:

DSD Tech Blue­tooth

Bluetooth-Modul scan­nen

Daten sen­den

Ardui­no Blue­tooth Con­trol­ler

Bluetooth-Modul scan­nen

Ter­mi­nal aus­wäh­len

Ein­stel­lun­gen

Tas­ta­tur wäh­len

Daten sen­den

Die eigent­lich vor­ge­se­he­nen Pins RX (0) und TX (1) wer­den beim Hoch­la­den ver­wen­det. Des­halb müss­te das Bluetooth-Modul vor dem Hoch­la­den her­aus­ge­zo­gen und anschlie­ßend wie­der ein­ge­steckt wer­den.
Über die Biblio­thek Soft­ware­Se­ri­al kön­nen die Pins RX und TX ande­ren digi­ta­len Pins zuge­ord­net wer­den. Das Her­aus­zie­hen und Wie­der­ein­ste­cken ent­fällt dann.

Im Kopf des Pro­gramms wer­den die Varia­blen defi­niert. Die ein­ge­bun­de­ne Biblio­thek Soft­ware­Se­ri­al ist eine Stan­dard­bi­blio­thek, sie muss nicht instal­liert wer­den.

# include <SoftwareSerial.h>

// TX -> 2, RX -> 3
SoftwareSerial BTSerial(2, 3);

int LED[5] = {4, 5, 6, 7, 8};

// über Bluetooth vom Smartphone gesendeter Wert
char btDaten;

Der setup-Teil defi­niert ledig­lich die pin­Mo­des für die LEDs und star­tet den über Soft­ware­Se­ri­al zuge­wie­se­nen Seri­el­len Moni­tor BTSe­ri­al:

void setup()
{
  BTSerial.begin(9600);
  Serial.begin(9600);

  // pinMode LEDs
  for (int i = 0; i <= 4; i ++)
  {
    pinMode(LED[i], OUTPUT);
  }

  // Menü im Seriellen Monitor
  Serial.println("Men\u00fc:");
  Serial.println("1 -> Lauflicht vor");
  Serial.println("2 -> Lauflicht zur\u00fcck");
  Serial.println("3 -> alle an");
  Serial.println("4 -> blinkende LEDs");
  Serial.println("8 -> alle aus");
}

Den jewei­li­gen LEDs wur­den in der App Wer­te zuge­wie­sen, die im Pro­gramm mit BTSe​ri​al​.read() gele­sen wer­den:

Steue­rung der LEDs über Blue­tooth

Akti­onTas­te
Lauf­licht vor­wärts1
Lauf­licht rück­wärts2
alle LEDs ein­schal­ten3
blin­ken­de LEDs4
alle LEDs aus­schal­ten8

Im loop-Teil wird den Wer­ten jeweils eine Akti­on zuge­ord­net:

void loop()
{
  // vom Smartphone gesendeten Wert lesen
  btDaten = BTSerial.read();

  switch (btDaten)
  {
    case '1':
    {
      BTSerial.print("Lauflicht vor");

      // Status true übergeben
      LauflichtVor(true);
      break;
    }
    
    case '2':
    {
      BTSerial.print("Lauflicht zur\u00fcck");

      // Status true übergeben
      LauflichtZurueck(true);
      break;
    }
    
    case '3':
    {
      BTSerial.print("alle an");
      AlleLEDAus();
      AlleLEDAn();
      break;
    }
    case '4':
    {
      BTSerial.print("alle blinken");

      // Status true übergeben
      LEDBlinken(true);
      break;
    }

    case '8':
    {
      BTSerial.print("alle aus");
      AlleLEDAus();
      break;
    }
  }
}

Die ver­schie­de­nen Aktio­nen wer­den jeweils in einer Metho­de aus­ge­la­gert. Beach­te die Kom­men­ta­re.

void LauflichtVor(bool Status)
{
  // Status ist true
  while (Status)
  {
    for (int i = 0; i <= 4; i ++)
    {
      /*
        Eingabe Smartphone abfragen
        wenn Wert 8 (ausschalten):
        -> for-Schleife unterbrechen
        -> Status auf false setzen,
        -> while wird unterbrochen
      */
      btDaten = BTSerial.read();

      if (btDaten == '8')
      {
        Status = !Status;
        BTSerial.print("alle aus");
        AlleLEDAus();
        break;
      }

      // aktuelle LED i einschalten
      digitalWrite(LED[i], HIGH);
      delay(100);
      // aktuelle LED i ausschalten
      digitalWrite(LED[i], LOW);
    }
  }
}

void LauflichtZurueck(bool Status)
{
  // Status ist true
  while (Status)
  {
    for (int i = 4; i >= 0; i --)
    {
      btDaten = BTSerial.read();
      if (btDaten == '8')
      {
        Status = !Status;
        BTSerial.print("alle aus");
        AlleLEDAus();
        break;
      }

      // aktuelle LED i einschalten
      digitalWrite(LED[i], HIGH);
      delay(100);

      // aktuelle LED i ausschalten
      digitalWrite(LED[i], LOW);
    }
  }
}

void AlleLEDAn()
{
  for (int i = 0; i <= 4; i ++)
  {
    // aktuelle LED i einschalten
    digitalWrite(LED[i], HIGH);
  }
}

void LEDBlinken(bool Status)
{
  // Status ist true
  while (Status)
  {
    for (int i = 0; i <= 4; i ++)
    {
      btDaten = BTSerial.read();
      if (btDaten == '8')
      {
        Status = !Status;
        BTSerial.print("alle aus");
        AlleLEDAus();
        break;
      }

      // aktuelle LED i einschalten
      digitalWrite(LED[i], HIGH);
    }
    delay(100);

    for (int i = 0; i <= 4; i ++)
    {
      btDaten = BTSerial.read();
      if (btDaten == '8')
      {
        Status = !Status;
        BTSerial.print("alle aus");
        AlleLEDAus();
        break;
      }

      // aktuelle LED i ausschalten
      digitalWrite(LED[i], LOW);
    }
    delay(100);
  }
}

void AlleLEDAus()
{
  for (int i = 0; i <= 4; i ++)
  {
    // aktuelle LED i ausschalten
    digitalWrite(LED[i], LOW);
  }
}


Ver­wand­te Auf­ga­ben:


Letzte Aktualisierung: 23. Aug 2020 @ 13:36