3

我尝试创建一个通过光传感器计算光的小应用程序,但不同的设备给我的值完全不同。我使用最大值来计算百分比,但我的 xperia 和我的三星在同一个地方(靠近我家外墙,屋顶下),第一个设备给我 90%(90k/102k),第二个给我给我 12% (8k/64k)。有没有办法避免这个问题?

    public final void onSensorChanged(SensorEvent event) 
    {
        if( event.sensor.getType() == Sensor.TYPE_LIGHT)
        {
            currentLux=(int) event.values[0];
            float perc=(currentLux*100)/max;
            lightTextBox.setText(lightTextBox.getText()+String.valueOf(perc)+" * ");    
        }   
    }
4

1 回答 1

1

由于每个传感器对于相同的光照水平都有不同的值,所以我所做的是记录minimummaximum将在应用程序生命周期内捕获的值,并将这些值存储为 aMinMax,在使用应用程序几天后,所有设备都将具有我可以信赖的几乎相同的价值。作为初始状态,我认为最小值为1000,最大值为0。(我将它存储在 SharedPreferences 中)。Lux然后我将通过考虑传感器的当前值来更新这些值。然后我会计算percentage照明的。这是我写的代码:

float luxValue = o.getAsFloat("double_light_lux");

//here I update the value in sharedPreferences
updateMaxAndMinValue(context, luxValue);

float percentageValue = scale(LightMetadata.getMinValue(context),
                LightMetadata.getMaxValue(context),
                0,
                100,
                luxValue);

更新功能:

public static void updateMaxAndMinValue(Context context, float luxValue) {
    float currentMax = LightMetadata.getMaxValue(context); //0 as init.
    float currentMin = LightMetadata.getMinValue(context); //1000 as init.

    if (luxValue > currentMax)
        LightMetadata.setMaxValue(context, luxValue);
    if (luxValue < currentMin)
        LightMetadata.setMinValue(context, luxValue);
}

我通过将值从 min -> max 缩放到 0 -> 100 来计算百分比,这是函数:

/**
 * @param min   old min value
 * @param max   old max value
 * @param a     new min value
 * @param b     new max value
 * @param value the value that want to scale
 * @return new scaled value
 */
public static float scale(float min, float max, float a, float b, float value) {

    //       (b-a)(x - min)
    //f(x) = --------------  + a
    //          max - min

    float scaled;
    float numerator = (b - a) * (value - min);
    float denominator = max - min;

    scaled = (numerator / denominator) + a;
    return scaled;
}
于 2019-06-05T13:25:31.207 回答