환경 센서

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

참조 사항