Verwenden von Lichtsensordaten
Es gibt zwei empfohlene Methoden für die Interpretation und Verwendung von Lux-Daten, die von Umgebungslichtsensoren stammen.
- Wenden Sie eine Transformation auf die Daten an, damit die normalisierte Lichtebene im direkten Verhältnis zum Programmieren von Verhalten oder Interaktionen verwendet werden kann. Ein Beispiel wäre, die Größe einer Schaltfläche in Ihrem Programm im direkten Verhältnis zu den normalisierten Daten (oder einem Bereich der normalisierten Daten, z. B. für den Außenbereich), zu variieren. Dieser Ansatz ermöglicht die optimale Implementierung.
- Behandeln von Lux-Datenbereichen und Zuordnen von Programmverhalten und -reaktionen zu den oberen und unteren Schwellenwerten dieser Lux-Datenbereiche. Dies ist eine einfache Möglichkeit, auf Lichtbedingungen zu reagieren und bietet möglicherweise nicht die optimale Benutzererfahrung. Dieser Ansatz funktioniert jedoch gut, wenn reibungslose Übergänge nicht möglich sind.
Behandeln von Daten von mehreren Lichtsensoren
Um die genaueste Näherung der aktuellen Lichtverhältnisse zu erhalten, können Sie Daten von mehreren Umgebungslichtsensoren verwenden. Da Umgebungslichtsensoren teilweise oder vollständig durch Schatten oder Objekte verdeckt werden können, die den Sensor bedecken, können mehrere Sensoren, die sich etwas voneinander entfernt befinden, eine viel bessere Näherung der aktuellen Lichtverhältnisse bieten als ein einzelner Sensor.
Um die Daten von mehreren Sensoren nachzuverfolgen, können Sie die folgenden beiden Techniken verwenden:
- Der neueste Datenwert für jeden Umgebungslichtsensor kann zusammen mit dem Zeitstempel aus dem Sensordatenbericht für jeden dieser Werte beibehalten werden. Der letzte ISensorDataReport, der für jeden Sensorwert empfangen wurde, kann beibehalten werden und beide Werte zur späteren Referenz bereitstellen. Wenn Sie auf den Zeitstempel für jeden Sensordatenbericht verweisen, können die Daten basierend auf ihrem Alter verwaltet werden. Wenn die Daten beispielsweise mehr als 2 Sekunden alt sind, können sie weggelassen werden. Basierend auf den neueren Sensordatenwerten könnte der höchste Wert verwendet werden, da davon ausgegangen wird, dass der entsprechende Sensor nicht verdeckt ist.
- Sie können den zuletzt gemeldeten Umgebungslichtsensorwert verwenden. Diese Implementierung wäre nicht optimal, da die Werte mehrerer Sensoren nicht miteinander verglichen werden, um das genaueste Ergebnis zu erhalten. Diese Methode wird nicht empfohlen.
Beispielcode
Der folgende Beispielcode zeigt eine Implementierung für das OnDataUpdated-Ereignis . Der Ereignishandler ruft eine Hilfsfunktion namens UpdateUI auf, die die Benutzeroberfläche basierend auf dem Lux-Wert ändert. Das Schreiben der Implementierung von UpdateUI liegt bei Ihnen.
// Override of ISensorEvents::OnDataUpdated
// Part of an event sink implementation for ISensorEvents
STDMETHODIMP CALSEventSink::OnDataUpdated(
ISensor* pSensor,
ISensorDataReport* pNewData)
{
HRESULT hr = S_OK;
if(pSensor == NULL ||
pNewData == NULL)
{
return E_POINTER;
}
// Declare and initialize the PROPVARIANT
PROPVARIANT lightLevel;
PropVariantInit(&lightLevel);
// Get the sensor reading from the ISensorDataReport object
hr = pNewData->GetSensorValue(
SENSOR_DATA_TYPE_LIGHT_LEVEL_LUX,
&lightLevel);
if(SUCCEEDED(hr))
{
if(lightlevel.vt == VT_R4)
{
// Extract the float value from the PROPVARIANT object
float luxValue = lightLevel.fltVal;
// Normalize the light sensor data
double lightNormalized = ::log10(luxValue) / 5.0;
// Handle UI changes based on the normalized LUX data
// which ranges from 0.0 - 1.0 for a lux range of
// 0 lux to 100,000 lux.
UpdateUI(lightNormalized);
}
}
// Release the variant.
PropVariantClear(&lightLevel);
return hr;
}