환경 센서

Android 플랫폼은 다양한 환경 속성을 모니터링할 수 있는 센서 4개를 제공합니다. 이러한 센서를 사용하여 Android 지원 기기 근처의 상대 주변 습도, 조도, 주변 압력, 주변 온도를 모니터링할 수 있습니다. 환경 센서 4개는 모두 하드웨어 기반이며 기기 제조업체에서 기기에 내장한 경우에만 사용할 수 있습니다. 대부분의 기기 제조업체가 화면 밝기를 제어하는 데 사용하는 광 센서를 제외하고 기기에서 항상 환경 센서를 사용할 수 있는 것은 아닙니다. 따라서 환경 센서가 데이터 획득을 시도하기 전에 런타임에 환경 센서가 존재하는지 확인하는 것이 특히 중요합니다.

SensorEvent에 관한 센서 값의 다차원 배열을 반환하는 대부분의 움직임 감지 센서 및 위치 센서와 달리 환경 센서는 각 데이터 이벤트의 단일 센서 값을 반환합니다. 예를 들어 온도는 °C, 압력은 hPa로 반환됩니다. 또한 고역 통과 또는 저역 통과 필터링이 자주 필요한 움직임 감지 센서 및 위치 센서와 달리 환경 센서에는 일반적으로 데이터 필터링이나 데이터 처리가 필요하지 않습니다. 표 1에는 Android 플랫폼에서 지원되는 환경 센서가 요약되어 있습니다.

표 1. Android 플랫폼에서 지원되는 환경 센서

센서 센서 이벤트 데이터 측정 단위 데이터 설명
TYPE_AMBIENT_TEMPERATURE event.values[0] °C 주변 기온.
TYPE_LIGHT event.values[0] lx 조도.
TYPE_PRESSURE event.values[0] hPa 또는 mbar 주변 기압.
TYPE_RELATIVE_HUMIDITY event.values[0] % 주변 상대 습도.
TYPE_TEMPERATURE event.values[0] °C 기기 온도.1

1 구현은 기기마다 다릅니다. 이 센서는 Android 4.0(API 레벨 14)에서 지원 중단되었습니다.

조도, 압력 및 온도 센서 사용

빛, 압력 및 온도 센서에서 얻는 원시 데이터는 일반적으로 보정이나 필터링, 수정이 필요하지 않으므로 사용하기가 가장 쉽습니다. 이러한 센서에서 데이터를 획득하려면 먼저 SensorManager 클래스의 인스턴스를 만듭니다. 이 인스턴스는 실제 센서의 인스턴스를 가져오는 데 사용할 수 있습니다. 그런 다음 onResume() 메서드에 센서 리스너를 등록하고 onSensorChanged() 콜백 메서드에서 수신되는 센서 데이터를 처리하기 시작합니다. 다음 코드는 이를 실행하는 방법을 보여줍니다.

Kotlin

class SensorActivity : Activity(), SensorEventListener {

    private lateinit var sensorManager: SensorManager
    private var pressure: Sensor? = null

    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)

        // Get an instance of the sensor service, and use that to get an instance of
        // a particular sensor.
        sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
        pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE)
    }

    override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {
        // Do something here if sensor accuracy changes.
    }

    override fun onSensorChanged(event: SensorEvent) {
        val millibarsOfPressure = event.values[0]
        // Do something with this sensor data.
    }

    override fun onResume() {
        // Register a listener for the sensor.
        super.onResume()
        sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL)
    }

    override fun onPause() {
        // Be sure to unregister the sensor when the activity pauses.
        super.onPause()
        sensorManager.unregisterListener(this)
    }
}

Java

public class SensorActivity extends Activity implements SensorEventListener {
    private SensorManager sensorManager;
    private Sensor pressure;

    @Override
    public final void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      // Get an instance of the sensor service, and use that to get an instance of
      // a particular sensor.
      sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
      pressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
    }

    @Override
    public final void onAccuracyChanged(Sensor sensor, int accuracy) {
      // Do something here if sensor accuracy changes.
    }

    @Override
    public final void onSensorChanged(SensorEvent event) {
      float millibarsOfPressure = event.values[0];
      // Do something with this sensor data.
    }

    @Override
    protected void onResume() {
      // Register a listener for the sensor.
      super.onResume();
      sensorManager.registerListener(this, pressure, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
      // Be sure to unregister the sensor when the activity pauses.
      super.onPause();
      sensorManager.unregisterListener(this);
    }
}

항상 onAccuracyChanged()onSensorChanged() 콜백 메서드의 구현을 모두 포함해야 합니다. 또한 활동이 일시중지되면 항상 센서 등록을 취소해야 합니다. 이렇게 하면 센서가 지속적으로 데이터를 감지하고 배터리를 소모하지 않습니다.

습도 센서 사용

조도, 압력, 온도 센서를 사용하는 것과 동일한 방식으로 습도 센서를 사용하여 원시 상대 습도 데이터를 얻을 수 있습니다. 그러나 기기에 습도 센서(TYPE_RELATIVE_HUMIDITY)와 온도 센서 (TYPE_AMBIENT_TEMPERATURE)가 둘 다 있는 경우에는 이 두 데이터 스트림을 사용하여 이슬점과 절대 습도를 계산할 수 있습니다.

이슬점

이슬점은 수증기가 물로 응축되기 위해 일정한 기압에서 주어진 양의 공기를 냉각해야 하는 온도입니다. 다음 등식은 이슬점을 계산하는 방법을 보여줍니다.

t_d(t,RH) = Tn · (ln(RH/100) + m·t/(T_n+t
))/(m - [ln(RH/100%) + m·t/(T_n+t)])

여기서

  • td = 이슬점 온도(˚C)
  • t = 실제 온도(˚C)
  • RH = 실제 상대 습도(%)
  • m = 17.62
  • Tn = 243.12

절대 습도

절대 습도는 주어진 양의 건조 공기에 포함된 수증기의 질량입니다. 절대 습도는 그램/미터3 단위로 측정됩니다. 다음 등식은 절대 습도를 계산하는 방법을 보여줍니다.

d_v(t,RH) =  (RH/100) · A · exp(m·
t/(T_n+t)/(273.15 + t)

여기서

  • dv = 절대 습도(그램/미터3)
  • t = 실제 온도(˚C)
  • RH = 실제 상대 습도(%)
  • m = 17.62
  • Tn = 243.12˚C
  • A = 6.112 hPa

참고 사항