Compartilhar via


Usando dados do sensor de luz

Há duas maneiras recomendadas de interpretar e usar dados lux provenientes de sensores de luz ambiente.

  • Aplique uma transformação aos dados para que o nível de luz normalizado possa ser usado em proporção direta a comportamentos ou interações do programa. Um exemplo seria variar o tamanho de um botão em seu programa em proporção direta aos dados normalizados (ou um intervalo dos dados normalizados, correspondente ao ar livre, por exemplo). Essa abordagem fornece a implementação ideal.
  • Lidar com intervalos de dados lux e mapear comportamentos e reações do programa para os limites superior e inferior desses intervalos de dados lux. Essa é uma maneira simples de responder às condições de iluminação e pode não gerar a experiência ideal do usuário. No entanto, essa abordagem funciona bem se transições suaves não forem viáveis.

Manipulando dados de vários sensores de luz

Para produzir a aproximação mais precisa das condições de iluminação atuais, você pode usar dados de vários sensores de luz ambiente. Como os sensores de luz ambiente podem ser parcial ou totalmente obscurecidos por sombras ou objetos que cobrem o sensor, vários sensores colocados a alguma distância podem fornecer uma aproximação muito melhor das condições de iluminação atuais do que um único sensor.

Para acompanhar os dados provenientes de vários sensores, você pode usar as duas técnicas a seguir:

  • O valor de dados mais recente para cada sensor de luz ambiente pode ser retido, juntamente com o carimbo de data/hora do relatório de dados do sensor para cada uma dessas leituras. O último ISensorDataReport recebido para cada leitura de sensor pode ser retido e pode fornecer os dois valores para referência posterior. Ao se referir ao carimbo de data/hora de cada relatório de dados do sensor, os dados podem ser gerenciados com base em sua idade. Por exemplo, se os dados tiverem mais de 2 segundos, eles poderão ser omitidos. Com base nos valores de dados mais recentes do sensor, a leitura mais alta poderia ser usada porque o sensor correspondente não seria obscurecido.
  • Você pode usar o último valor do sensor de luz ambiente relatado. Essa implementação não seria ideal porque os valores de vários sensores não são comparados uns com os outros para obter o resultado mais preciso. Não recomendamos esse método.

Código de exemplo

O código de exemplo a seguir mostra uma implementação para o evento OnDataUpdated . O manipulador de eventos chama uma função auxiliar, chamada UpdateUI, que altera a interface do usuário com base no valor lux. Escrever a implementação de UpdateUI cabe a você.

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