A09|03 Optischer Näherungserkennung TMD27713
Infrared Optical Proximity Detection
Sensorwerte / Distanzen messen
Der APDS-9930 beinhaltet eine digitale Umgebungslichterkennung und ein komplettes Infrarot-Näherungserkennungssystem in einem einzigen 8-Pin-Gehäuse. Die Näherungsfunktion bietet Plug-and-Play-Erkennung bis 100mm. Dadurch entfällt die Notwendigkeit einer Werkskalibrierung. Die Näherungserkennung funktioniert sowohl bei hellem Sonnenlicht als auch in dunklen Räumen. Der weite dynamische Bereich ermöglicht auch den Betrieb bei kurzen Distanzen hinter dunklem Glas, wie z.B. bei einem Mobiltelefon.
Spezifikationen
- Signalart: digital
- Spannung: 3,3V
- Pinabstand: 2,54mm
- Reichweite:100mm
- Kommunikation: IIC
- Temperaturbereich:
-30℃ bis +85℃
Der Lichtsensor bietet eine sehr empfindliche Reaktion auch bei sehr schwachen Lichtverhältnissen. Diese Art von Sensoren sind besonders nützlich für den Einsatz bei Displays, um die Akkuleistung von mobilen Endgeräten zu optimieren, in dem sie die Energieversorgung bei unterschiedlichen Lichtverhältnissen anpassen. Die Hintergrundbeleuchtung von Displays und Tastaturen kann bis zu 30% bis 40% der gesamten Plattformleistung ausmachen. Der Umgebungslicht-Sensor ist ideal für den Einsatz in Notebooks, LCD-Monitoren, Flachbildfernsehern oder Mobiltelefonen. Die Näherungsfunktion ist speziell für Nahfeldanwendungen ausgerichtet. In Mobiltelefonen kann die Näherungserkennung erkennen, wenn der Benutzer das Smartphone nahe an sein Ohr hält.
Ich möchte an dieser Stelle noch den APDS-9960 erwähnen. Im Zusammenhang mit dem APDS-9930 ist oft die Rede vom APDS-9960. Dies ist eine Weiterführung mit zusätzlichen Funktionen. Es besitzt ein Gestenerkennungssensor mit Näherungssensor, ein Umgebungslichtsensor und ein RGBC Farbsensor. Die Gestenerkennung nutzt vier Fotodioden zur Erfassung der reflektierten IR-Energie, um physische Bewegungsinformationen (z. B. Geschwindigkeit, Richtung und Entfernung) in digitale Daten umzuwandeln.
Wir brauchen eine Bibliothek
Manche Elektronik-Module benötigen eine oder mehrere Bibliotheken, um zu funktionieren. Was ist eine Bibliothek und wozu brauchen wir sie? Eine Bibliothek reduziert für uns den Programmieraufwand. Dadurch sparen wir uns sehr viel Zeit. Außerdem wird unser Sketch weitaus übersichtlicher und im Ablauf stabiler. Du kannst dir eine Bibliothek so vorstellen, dass sie zusätzlicher Code ist, der vor uns versteckt wird und im Hintergrund arbeitet. Die Bibliothek kann sehr komplex aufgebaut sein, aber das ist kein Problem für uns, da wir auf die einzelnen Funktionen mit Schlüsselwörtern zugreifen. Wir müssen den komplizierten Programmablauf nicht verstehen, sondern für uns relevante Funktionen aufrufen. Das ist das Tolle an Bibliotheken. In der Programmierung kommen Wiederholungen von Programmteilen häufig vor. Um nicht jedes Mal das Rad von neuen zu erfinden, wird Programmcode in Bibliotheken ausgelagert, um sie wiederzuverwenden. Für das IR-Empfangmodule benötigen wir eine Library. Die Installation folgt weiter unten.
Der Aufbau
TWI: 2 (SDA) and 3 (SCL). Support TWI communication using the Wire library.
Der minimal Sketch
WICHTIG: Der APDS-9930 kann nur mit 3,3V betrieben werden!
/********************************************************
A09|03 Die optische Näherungserkennung TMD27713
Der Minimal-Sketch
Beispielcode und Library: https://github.com/Depau/APDS9930#readme
Mr Robot UXSD / www.mrrobotuxsd.com
*********************************************************/
#define DUMP_REGS
#include //rufe die Wire-Bibliothek für die I2C-Kommunikation auf
#include //rufe die Bibliothek für das APDS9930-Bibliothek auf
#define APDS9930_INT 2 //muss ein Interrupt-Pin sein!
//Konstanten
#define PROX_INT_HIGH 600 //Näherungspegel für den Interrupt
#define PROX_INT_LOW 0 //die untere Grenze für den Interrupt
// Globale Variablen
APDS9930 apds = APDS9930();
float ambient_light = 0; //kann auch ein unsigned long sein
uint16_t proximity_data = 0;
volatile bool isr_flag = false;
void setup()
{
pinMode(APDS9930_INT, INPUT); //den Interrupt-Pin als Eingang einstellen
Serial.begin(9600); //initialisiere serielle Kommunikation mit 9600bauds:
//Initialisierung der Interrupt-Service-Routine
attachInterrupt(digitalPinToInterrupt(APDS9930_INT), interruptRoutine, FALLING);
//APDS-9930 initialisieren (I2C und Anfangswerte konfigurieren)
if (apds.init())
{
Serial.println(F("APDS-9930 Initialisierung komplett."));
}
else
{
Serial.println(F("Beim der APDS-9930 Initialisierung ist etwas schief gelaufen!"));
}
//Einstellen der Verstärkung des Näherungssensors
if (!apds.setProximityGain(PGAIN_2X))
{
Serial.println(F("Bei der Einstellung von PGAIN ist etwas schief gelaufen"));
}
//Schwellenwerte für Näherungsalarme festlegen
if (!apds.setProximityIntLowThreshold(PROX_INT_LOW))
{
Serial.println(F("Fehler beim Schreiben der unteren Schwellgrenze."));
}
if (!apds.setProximityIntHighThreshold(PROX_INT_HIGH))
{
Serial.println(F("Fehler beim Schreiben der oberen Schwellgrenze."));
}
////starte den APDS-9930 Näherungssensor (interrupts)//////
if (apds.enableProximitySensor(true))
{
Serial.println(F("Der Näherungssensor läuft jetzt."));
}
else
{
Serial.println(F("Bei der Sensorinitialisierung ist etwas schief gelaufen!"));
}
////starte den APDS-9930 Lichtsensor (no interrupts)///////
if (apds.enableLightSensor(false))
{
Serial.println(F("Der Lichtsensor läuft jetzt."));
}
else
{
Serial.println(F("Etwas ist bei der Lichtsensor-Initialisierung schief gelaufen!"));
}
}
void loop()
{
// Wenn ein Interrupt auftritt, wird der Näherungswert gesendet
if (isr_flag)
{
//Näherungswert auslesen und senden
if (!apds.readProximity(proximity_data))
{
Serial.println("Fehler beim Lesen des Näherungswerts.");
}
else
{
Serial.print("Annäherung entdeckt! Stufe: ");
Serial.print(proximity_data);
Serial.print(" ");
}
apds.readAmbientLightLux(ambient_light);
//lesen der Lichtwerte (Umgebung, Rot, Grün, Blau)
if (!apds.readAmbientLightLux(ambient_light))
{
Serial.println(F("Fehler beim Lesen der Lichtwerte."));
}
else
{
Serial.print(F("Umgebungslicht: "));
Serial.println(ambient_light);
}
// Flag zurücksetzen und APDS-9930-Interrupt löschen (WICHTIG!)
isr_flag = false;
if (!apds.clearProximityInt())
{
Serial.println("Es ist ein Fehler beim Löschen des Interrupts aufgetreten.");
}
}
}
void interruptRoutine()
{
isr_flag = true;
}
Falls du die hier beschriebenen Elektronik-Module nicht hast kannst du sie in meiner Einkaufsliste finden. Warum ich selber hauptsächlich mit Modulen der Marke Keyestudio arbeite erläutere ich unter diesem Blog-Artikel.