使用光传感器数据

可通过两种建议的方式来解释和使用来自环境光传感器的照度数据。

  • 将转换应用于数据,以便可以按与程序行为或交互成正比的方式使用规范化的亮度级。例如,按与规范化数据(或者,举例来说,对应于室外的规范化数据范围)成正比的方式改变程序中按钮的大小。此方法可提供最佳的实现。
  • 处理照度数据范围,并将程序行为和响应映射到这些照度数据范围的阈值上限和下限。这是一种响应光照条件的简单方式,可能无法获得最佳用户体验。不过,如果无法实现平滑转换,则此方法很有效。

处理来自多个光传感器的数据

若要生成当前光照条件的最准确近似值,您可以使用来自多个环境光传感器的数据。由于环境光传感器可能会被阴影或盖在传感器上的物体部分或完全遮盖,因此,与单个传感器相比,放在一定距离之外的多个传感器可提供当前光照条件更准确的近似值。

若要跟踪来自多个传感器的数据,您可以使用以下两种方法:

  • 可保留每个环境光传感器的最新的数据值,以及传感器数据报告中其中每个读数的时间戳。可以保留为每个传感器读数收到的最后一个 ISensorDataReport,它可提供这两个值以供稍后参考。通过参考每个传感器数据报告的时间戳,可以基于数据的存留期对数据进行管理。例如,如果数据是超过 2 秒以前的数据,则可以忽略该数据。根据较新的传感器数据值,可以使用最高的读数,因为将假定对应的传感器未被遮盖。
  • 您可以使用报告的最后一个环境光传感器值。此实现将不是最佳的,因为来自多个传感器的值不会相互比较来获得最准确的结果。我们不建议使用此方法。

示例代码

下面的示例代码演示 OnDataUpdated 事件的实现。事件处理程序调用名为 UpdateUI 的帮助程序函数,该函数基于照度值来更改用户界面。您负责编写 UpdateUI 的实现。

// 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;
}

 

 

社区附加资源

添加
显示:
© 2015 Microsoft