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 đặc điểm môi trường. Bạn có thể dùng những cảm biến này để theo dõi độ ẩm tương đối của môi trường xung quanh, độ chói, áp suất xung quanh và nhiệt độ môi trường xung quanh ở gần thiết bị chạy Android. Cả 4 cảm biến môi trường đề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 API này vào 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ị sử dụng để kiểm soát độ sáng màn hình, môi trường cảm biến không phải lúc nào cũng có sẵn trên thiết bị. Do đó, điều đặc biệt quan trọng là bạn phải xác minh xem cảm biến môi trường có tồn tại hay không trước khi bạn cố gắng thu thập dữ liệu từ nó.

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 cảm biến đa chiều giá trị cho mỗi SensorEvent, các cảm biến môi trường sẽ trả về một cảm biến duy nhất cho từng 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 độ phân giải cao hoặc truyền thấp thì 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 nào. Bàn 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ủa 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ách triển khai sẽ khác nhau tuỳ theo thiết bị 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ô bạn thu được từ cảm biến ánh sáng, cảm biến áp suất và nhiệt độ thường không yêu cầu hiệu chuẩn, 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. Người nhận thu thập dữ liệu qua những cảm biến này, trước tiên, bạn sẽ tạo một thực thể của lớp SensorManager. Bạn có thể dùng thực thể này để lấy 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 nhận được trong phương thức gọi lại onSensorChanged(). Chiến lược phát hành đĩa đơn đoạn mã sau đây hướng dẫn bạn cách làm 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ả hai 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. Việc này sẽ ngăn cảm biến liên tục cảm biến dữ liệu và làm tiêu hao pin.

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

Bạn có thể thu được dữ liệu độ ẩm tương đối thô 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, á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à một cảm biến nhiệt độ (TYPE_AMBIENT_TEMPERATURE) mà bạn có thể dùng 2 luồng dữ liệu này để tính toán đ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í cho trước phải được làm mát ở mức không đổi áp suất khí quyển, để hơi nước ngưng tụ thành nước. Phương trình sau đây cho biết 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)])

Ở đâu,

  • 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
  • Tn = 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ô cho trước. Tuyệt đối độ ẩm được đo bằng gam/mét3. Phương trình sau đây cho biết cách bạn có thể tính độ ẩm tuyệt đối:

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

Ở đâu,

  • 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
  • Tn = 243,12 độ C
  • A = 6.112 hPa

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