Ampel mit Ardui­no WiFi und Blue­tooth schalten

Lese­zeit: 4 Minu­ten
Lösung
Seite als PDF
Navi­ga­ti­on

Die ein­zel­nen LEDs sol­len über das Smart­pho­ne gesteu­ert wer­den.
Zusätz­lich kann eine auto­ma­ti­sche Ampel­schal­tung gestar­tet werden

Für die­se Anlei­tung benö­tigst du einen Ardui­no WiFi Rev2.

Benö­tig­te Bauteile:

  • 3 LEDs (rot, gelb, grün)
  • 3 Wider­stän­de > 100 Ω
  • Lei­tungs­dräh­te

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

Light­Blue

Bluetooth-Modul scan­nen

UUID aus­wäh­len

Wert schrei­ben

Typ des Werts festlegen

Daten sen­den

Vor­be­rei­tun­gen:

Board instal­lie­ren:
Werk­zeu­ge → Board → Board­ver­wal­ter
Board mega­AVR auswählen

Bin­de die benö­tig­te Biblio­thek ein und defi­nie­re die Variablen:

# include <ArduinoBLE.h>

/* 
  eindeutige  UUID bestimmen: 
  https://www.guidgenerator.com/online-guid-generator.aspx
  https://www.uuidgenerator.net/
  BLERead | BLEWrite | BLENotify
  -> schreiben, lesen, Info
*/
// Name BLE-Service
BLEService LEDSchalten("19b10000-e8f2-537e-4f6c-d104768a1214");

BLEUnsignedCharCharacteristic Auswahl("19b10000-e8f2-537e-4f6c-d104768a1214", BLERead | BLEWrite | BLENotify);

enum Ampel
{
  ROT = 5,
  GELB,
  GRUEN
};

Der setup-Teil:

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

  // pinmode festlegen
  for (int i = ROT; i <= GRUEN; i++)
  {
    pinMode(i, OUTPUT);
  }

  // BLE starten
  if (!BLE.begin()) Serial.println("Bluetooth-Modul konnte nicht gestartet werden!");
  else Serial.println("Bluetooth-Modul erfolgreich gestartet!");

  // Name festlegen (wird in der App angezeigt) und den Service (LEDSchalten) zuweisen
  BLE.setLocalName("LEDs schalten");
  BLE.setAdvertisedService(LEDSchalten);

  // Auswahl als Platzhalter für den in der App gewählten Wert
  LEDSchalten.addCharacteristic(Auswahl);

  // Service LEDSchalten hinzufügen
  BLE.addService(LEDSchalten);

  // Startwert für die Kommunikation schreiben
  Auswahl.writeValue(0);

  // Zuweisung starten
  BLE.advertise();
}

Den jewei­li­gen LEDs wer­den in der App Wer­te zugewiesen:

Akti­onTas­te
rot ein10
gelb ein11
grün ein12
rot aus20
gelb aus21
grün aus22
Auto­ma­ti­sche Ampelschaltung30

Im loop-Teil wird den Wer­ten jeweils eine Akti­on zugeordnet.

Beach­te die Kommentare.

void loop()
{
  // auf die Verbindung zu Geräten warten
  BLEDevice Verbindung = BLE.central();

  // wenn der Arduino mit einem Gerät verbunden ist ...
  if (Verbindung)
  {
    Serial.println("Verbunden ... ");

    // solange der Arduino mit einem Gerät verbunden ist ...
    while (Verbindung.connected())
    {
      /*
        Dezimal -> Hex-Umrechnung
        10 -> A
        11 -> B
        12 -> C
        20 -> 14
        21 -> 15
        22 -> 16
        30 -> 1E
      */
      if (Auswahl.written())
      {
        if (Auswahl.value() == 10)
        {
          Serial.print(Auswahl.value());
          Serial.println(" -> rot ein");
          digitalWrite(ROT, HIGH);
        }

        if (Auswahl.value() == 11)
        {
          Serial.print(Auswahl.value());
          Serial.println(F(" -> gelb ein"));
          digitalWrite(GELB, HIGH);
        }

        if (Auswahl.value() == 12)
        {
          Serial.print(Auswahl.value());
          Serial.println(F(" -> gr\u00fcn ein"));
          digitalWrite(GRUEN, HIGH);
        }
        if (Auswahl.value() == 20)
        {
          Serial.print(Auswahl.value());
          Serial.println(F(" -> rot aus"));
          digitalWrite(ROT, LOW);
        }

        if (Auswahl.value() == 21)
        {
          Serial.print(Auswahl.value());
          Serial.println(F(" -> gelb aus"));
          digitalWrite(GELB, LOW);
        }

        if (Auswahl.value() == 22)
        {
          Serial.print(Auswahl.value());
          Serial.println(F(" -> gr\u00fcn aus"));
          digitalWrite(GRUEN, LOW);
        }

        // Ampel schalten
        if (Auswahl.value() == 30)
        {
          Serial.print(Auswahl.value());
          Serial.println(F(" -> Ampel schalten"));
          digitalWrite(ROT, HIGH);
          delay(5000);
          digitalWrite(GELB, HIGH);
          delay(1000);
          digitalWrite(ROT, LOW);
          digitalWrite(GELB, LOW);
          digitalWrite(GRUEN, HIGH);
          delay(3000);
          digitalWrite(GRUEN, LOW);
          digitalWrite(GELB, HIGH);
          delay(1000);
          digitalWrite(GELB, LOW);
          digitalWrite(ROT, HIGH);
        }
      }
    }
  }
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 3. Sep 2021 @ 8:13