다음을 통해 공유


광원 센서 데이터 사용

중요합니다

대신 UWP 센서 API 를 사용합니다.

COM 기반 센서 API는 더 이상 사용되지 않으며 새 애플리케이션에서 사용해서는 안 됩니다. 추가 기능 또는 향상된 기능은 계획되지 않으며 지원이 제한됩니다.

주변 광원 센서에서 제공되는 럭스 데이터를 해석하고 사용하는 두 가지 권장 방법이 있습니다.

  • 정규화된 조명 수준을 프로그램 동작 또는 상호 작용에 직접 비례하여 사용할 수 있도록 데이터에 변환을 적용합니다. 예를 들어 정규화된 데이터(또는 야외에 해당하는 정규화된 데이터의 범위)에 직접 비례하여 프로그램의 단추 크기를 변경합니다. 이 방법은 최적의 구현을 제공합니다.
  • 럭스 데이터의 범위를 처리하고 프로그램 동작 및 반응을 이러한 럭스 데이터 범위의 상한 및 하한 임계값에 매핑합니다. 이는 조명 조건에 응답하는 간단한 방법이며 최적의 사용자 환경을 제공하지 못할 수 있습니다. 그러나 원활한 전환이 가능하지 않은 경우 이 방법은 잘 작동합니다.

여러 광원 센서에서 데이터 처리

현재 조명 조건의 가장 정확한 근사치를 생성하려면 여러 주변 광원 센서의 데이터를 사용할 수 있습니다. 주변 광원 센서는 센서를 덮는 그림자나 물체에 의해 부분적으로 또는 완전히 가려질 수 있기 때문에, 멀리 떨어진 곳에 배치된 여러 센서는 단일 센서보다 현재 조명 조건을 훨씬 더 잘 근사치로 제공할 수 있습니다.

여러 센서에서 들어오는 데이터를 추적하기 위해 다음 두 가지 기술을 사용할 수 있습니다.

  • 각 주변 광원 센서에 대한 최신 데이터 값은 이러한 각 판독값에 대한 센서 데이터 보고서의 타임스탬프와 함께 보존할 수 있습니다. 각 센서 판독값에 대해 수신된 마지막 ISensorDataReport 보존할 수 있으며 이후 참조를 위해 두 값을 모두 제공할 수 있습니다. 각 센서 데이터 보고서의 타임스탬프를 참조하여 해당 연령에 따라 데이터를 관리할 수 있습니다. 예를 들어 데이터가 2초 이상 오래된 경우 생략할 수 있습니다. 최신 센서 데이터 값에 따라 해당 센서가 가려지지 않을 것으로 추정되므로 가장 높은 판독값을 사용할 수 있습니다.
  • 보고된 마지막 주변 광원 센서 값을 사용할 수 있습니다. 여러 센서의 값이 가장 정확한 결과를 얻기 위해 서로 비교되지 않으므로 이 구현은 최적이 아닙니다. 이 메서드는 권장하지 않습니다.

예제 코드

다음 예제 코드는 OnDataUpdated 이벤트에 대한 구현을 보여 줍니다. 이벤트 처리기는 UpdateUI명명된 도우미 함수를 호출하여 lux 값에 따라 사용자 인터페이스를 변경합니다. 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;
}