Lauf­licht mit einem Gesten-Sensor

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

Der APDS-9960 ana­ly­siert mit Hil­fe einer Infrarot-LED Bewe­gun­gen in sei­nem Sicht­be­reich. Dabei kann er vier Rich­tun­gen (links, rechts, nach vorn, nach hin­ten) unter­schei­den, die Hand­be­we­gun­gen vom Sen­sor weg und zum Sen­sor hin erken­nen und die Far­ben Rot, Grün und Blau „sehen“.
Er wird über I2C ange­steu­ert.

Die LEDs sol­len als Lauf­licht arbei­ten:

  • bewegt sich ein Objekt über dem Sen­sor von links nach rechts, star­tet das Lauf­licht von links nach rechts
  • streicht ein Objekt von rechts nach links über den Sen­sor, bewegt sich das Lauf­licht von rechts nach links
  • eine Bewe­gung von unten nach oben schal­tet alle LEDs ein
  • wird ein Objekt von oben nach unten über den Sen­sor geführt, wer­den alle LEDs aus­ge­schal­tet

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

  • 5 LEDs
  • 5 Wider­stän­de > 100 Ω
  • Lei­tungs­dräh­te
  • APDS-9960

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

Der Sen­sor muss zwin­gend an 3,3 V ange­schlos­sen wer­den.
Ach­te auf die Anord­nung der Pins, die sich je nach Modell unter­schei­den kön­nen.

Benö­tig­te Biblio­thek:
Sketch → Biblio­thek ein­bin­den → Biblio­the­ken ver­wal­ten

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

# include <Arduino_APDS9960.h>

// Array mit 5 Elementen und den zugehörigen Ports
int LED[5] = {3, 4, 5, 6, 7, 8};

// Anzahl der LEDs ermitteln
int LEDMax = sizeof(LED) / sizeof(LED[0]);

int Leuchtdauer = 200;
bool Status;

Der setup-Teil. Beach­te die Kom­men­ta­re.

void setup()
{
  for (int zaehler = 0; zaehler <= LEDMax; zaehler++)
  {
    pinMode(LED[zaehler], OUTPUT);
  }

  Serial.begin(9600);

  // APDS.begin() -> Sensor starten
  // wenn der Start misslingt -> Mitteilung anzeigen
  if (!APDS.begin())
  {
    Serial.println("Sensor nicht entdeckt, bitte Kabel testen!");
  }

  else Serial.println("Initialisierung erfolgreich!");
  /*
    GestureSensitivity -> Empfindlichkeit:
    je höher der Wert, desto empfindlicher, allerdings kann dann
    eine falsche Geste entdeckt werden
    Standardwwert: 80
  */
  //APDS.setGestureSensitivity(80);

  Serial.println("Gesten entdecken ...");
}

Der loop-Teil. Beach­te die Kom­men­ta­re.

void loop()
{
  // wenn der APDS-9660 erkannt wird
  if (APDS.gestureAvailable())
  {
    // Geste lesen
    int Geste = APDS.readGesture();

    /*
      Konstanten für die Gesten:
      GESTURE_UP -> nach oben
      GESTURE_DOWN -> nach unten
      GESTURE_LEFT -> nach links
      GESTURE_RIGHT -> nach rechts 
    */  
    switch (Geste)
    {
      case GESTURE_UP:
        Serial.println("oben");
        LEDSchalten(true);
        break;
      case GESTURE_DOWN:
        Serial.println("unten");
        LEDSchalten(false);
        break;
      case GESTURE_LEFT:
        Serial.println("links");

        // alle LEDs ausschalten
        LEDSchalten(false);
        for (int zaehler = 0; zaehler < LEDMax; zaehler++)
        {
          digitalWrite(LED[zaehler], HIGH);
          delay(Leuchtdauer);
          digitalWrite(LED[zaehler], LOW);
        }
        break;

      case GESTURE_RIGHT:
        Serial.println("rechts");

        // alle LEDs ausschalten
        LEDSchalten(false);
        for (int zaehler = LEDMax - 1; zaehler >= 0; zaehler--)
        {
          digitalWrite(LED[zaehler], HIGH);
          delay(Leuchtdauer);
          digitalWrite(LED[zaehler], LOW);
        }
        break;
    }
  }
}

Jetzt fehlt nur noch die Metho­de LED­Schal­ten(). Ihr wird als Para­me­ter true oder fal­se über­ge­ben. Alle LEDs wer­den ent­we­der ein­ge­schal­tet (true) oder aus­ge­schal­tet (fal­se).

void LEDSchalten(bool Status)
{
  for (int zaehler = 0; zaehler < LEDMax; zaehler++)
  {
    digitalWrite(LED[zaehler], Status);
  }
}


Ver­wand­te Auf­ga­ben:


Letzte Aktualisierung: 12. Jul 2020 @ 19:55