Cảm biến môi trường

Nền tảng Android cung cấp 4 cảm biến cho phép bạn theo dõi nhiều tính chất môi trường. Bạn có thể sử dụng các cảm biến này để theo dõi độ ẩm tương đối của môi trường xung quanh, độ chiếu sáng, áp suất môi trường xung quanh và nhiệt độ môi trường gần một thiết bị chạy Android. Cả 4 cảm biến môi trường này đều dựa trên phần cứng và chỉ dùng được nếu nhà sản xuất thiết bị tích hợp các cảm biến đó vào một thiết bị. Ngoại trừ cảm biến ánh sáng (mà hầu hết các nhà sản xuất thiết bị đều sử dụng để kiểm soát độ sáng màn hình) không phải lúc nào cảm biến môi trường cũng có sẵn trên các thiết bị. Do đó, trong thời gian chạy, bạn cần phải xác minh xem có cảm biến môi trường hay không trước khi cố gắng lấy dữ liệu qua cảm biến môi trường đó.

Không giống như hầu hết các cảm biến chuyển động và cảm biến vị trí (trả về một mảng giá trị cảm biến đa chiều cho mỗi SensorEvent), cảm biến môi trường trả về một giá trị cảm biến duy nhất cho mỗi sự kiện dữ liệu. Ví dụ: nhiệt độ tính bằng °C hoặc áp suất tính bằng hPa. Ngoài ra, không giống như cảm biến chuyển động và cảm biến vị trí (thường yêu cầu lọc thông cao hoặc thông thấp), cảm biến môi trường thường không yêu cầu lọc dữ liệu hoặc xử lý dữ liệu. Bảng 1 cung cấp thông tin tóm tắt về các cảm biến môi trường được hỗ trợ trên nền tảng Android.

Bảng 1. Cảm biến môi trường được hỗ trợ trên nền tảng Android.

Cảm biến Dữ liệu sự kiện cảm biến Đơn vị đo Mô tả dữ liệu
TYPE_AMBIENT_TEMPERATURE event.values[0] °C Nhiệt độ không khí xung quanh.
TYPE_LIGHT event.values[0] lx Độ chiếu sáng.
TYPE_PRESSURE event.values[0] hPa hoặc mbar Áp suất không khí xung quanh.
TYPE_RELATIVE_HUMIDITY event.values[0] % Độ ẩm tương đối xung quanh.
TYPE_TEMPERATURE event.values[0] °C Nhiệt độ của thiết bị.1

1 Các cách triển khai khác nhau tuỳ theo thiết bị. Cảm biến này không còn được dùng trong Android 4.0 (API cấp 14).

Sử dụng cảm biến ánh sáng, áp suất và nhiệt độ

Dữ liệu thô mà bạn thu được từ cảm biến ánh sáng, áp suất và nhiệt độ thường không cần hiệu chỉnh, lọc hoặc sửa đổi, khiến chúng trở thành một trong những cảm biến dễ sử dụng nhất. Để lấy dữ liệu từ các cảm biến này, trước tiên, bạn cần tạo một thực thể của lớp SensorManager. Bạn có thể sử dụng thực thể này để lấy một thực thể của cảm biến vật lý. Sau đó, bạn đăng ký trình nghe cảm biến trong phương thức onResume() và bắt đầu xử lý dữ liệu cảm biến gửi đến trong phương thức gọi lại onSensorChanged(). Đoạn mã sau đây cho bạn biết cách thực hiện việc này:

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

Bạn phải luôn triển khai cả phương thức gọi lại onAccuracyChanged()onSensorChanged(). Ngoài ra, hãy đảm bảo rằng bạn luôn huỷ đăng ký một cảm biến khi một hoạt động tạm dừng. Điều này ngăn không cho cảm biến liên tục nhận biết dữ liệu và làm tiêu hao pin.

Sử dụng cảm biến độ ẩm

Bạn có thể thu thập dữ liệu thô về độ ẩm tương đối bằng cách sử dụng cảm biến độ ẩm giống như cách bạn sử dụng cảm biến ánh sáng, cảm biến áp suất và nhiệt độ. Tuy nhiên, nếu thiết bị có cả cảm biến độ ẩm (TYPE_RELATIVE_HUMIDITY) và cảm biến nhiệt độ (TYPE_AMBIENT_TEMPERATURE), bạn có thể sử dụng hai luồng dữ liệu này để tính điểm sương và độ ẩm tuyệt đối.

Điểm sương

Điểm sương là nhiệt độ mà tại đó một thể tích không khí nhất định phải được làm mát ở áp suất khí quyển không đổi để hơi nước ngưng tụ thành nước. Phương trình sau đây cho thấy cách bạn có thể tính điểm sương:

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

Địa điểm,

  • td = nhiệt độ điểm sương tính bằng độ C
  • t = nhiệt độ thực tế tính bằng độ C
  • RH = độ ẩm tương đối thực tế tính bằng phần trăm (%)
  • m = 17,62
  • n = 243,12

Độ ẩm tuyệt đối

Độ ẩm tuyệt đối là khối lượng hơi nước trong một thể tích không khí khô nhất định. Độ ẩm tuyệt đối được đo bằng gam/mét3. Phương trình sau đây trình bày cách tính độ ẩm tuyệt đối:

d_v(t;RH) =  (RH/100) · A · exp(m·
t/(T_n+t)/(273,15 + t)

Địa điểm,

  • dv = độ ẩm tuyệt đối tính bằng gam/mét3
  • t = nhiệt độ thực tế tính bằng độ C
  • RH = độ ẩm tương đối thực tế tính bằng phần trăm (%)
  • m = 17,62
  • n = 243,12 độ C
  • A = 6,112 hPa

Bạn cũng nên đọc