Czujniki środowiskowe

Platforma Android ma 4 czujniki, które umożliwiają monitorowanie różnych właściwości środowiskowych. Możesz używać tych czujników do monitorowania względnej wilgotności otoczenia, oświetlenia, ciśnienia otoczenia i temperatury otoczenia w pobliżu urządzenia z Androidem. Wszystkie 4 czujniki środowiskowe są sprzętowe i są dostępne tylko wtedy, gdy producent urządzenia je wbudowany w urządzenie. Z wyjątkiem czujnik światła, którego większość producentów urządzeń używa do sterowania jasnością ekranu i otoczenia Czujniki nie zawsze są dostępne na urządzeniach. Z tego powodu szczególnie ważne jest Sprawdź w czasie działania, czy istnieje czujnik środowiska, zanim spróbujesz pozyskać dane z: .

W przeciwieństwie do większości czujników ruchu i pozycji, które zwracają wielowymiarowy macierz wartości dla każdej wartości SensorEvent, czujniki środowiskowe zwracają 1 czujnik dla każdego zdarzenia danych. Może to być na przykład temperatura w °C lub ciśnienie w hPa. Poza tym w przeciwieństwie do czujników ruchu i pozycji, które często wymagają stosowania ruchów górnych lub dolnoprzepustowych czujniki środowiskowe zwykle nie wymagają filtrowania ani przetwarzania danych. Stół 1 zawiera podsumowanie czujników środowiskowych, które są obsługiwane przez platformę Android.

Tabela 1. Czujniki środowiskowe obsługiwane przez platformę Android.

Czujnik Dane zdarzenia z czujnika Jednostki miary Opis danych
TYPE_AMBIENT_TEMPERATURE event.values[0] °C Temperatura otoczenia.
TYPE_LIGHT event.values[0] lx Iluminancja.
TYPE_PRESSURE event.values[0] hPa lub mbar Ciśnienie powietrza w pomieszczeniu.
TYPE_RELATIVE_HUMIDITY event.values[0] % Wilgotność względna w otoczeniu.
TYPE_TEMPERATURE event.values[0] °C Temperatura urządzenia1.

1 Implementacje różnią się w zależności od urządzenia urządzenia. Ten czujnik został wycofany w Androidzie 4.0 (poziom API 14).

Używaj czujników światła, ciśnienia i temperatury

Nieprzetworzone dane zbierane z czujników światła, ciśnienia i temperatury zwykle nie wymagają kalibracji, filtrowania i modyfikacji, co sprawia, że są to jedne z najprostszych w użyciu czujników. Do pozyskiwania danych z tych czujników tworzysz najpierw instancję klasy SensorManager, której możesz użyć do uzyskania instancji czujnika fizycznego. Następnie zarejestrujesz odbiornik czujnika w metodzie onResume() i zaczniesz obsługiwać przychodzące dane z czujnika w metodzie wywołania zwrotnego onSensorChanged(). Ten kod pokazuje, jak to zrobić:

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

Zawsze musisz zawsze uwzględniać implementacje metod wywołania zwrotnego onAccuracyChanged() i onSensorChanged(). Oprócz tego: aby zawsze wyrejestrować czujnik, gdy aktywność jest wstrzymana. Uniemożliwia to czujnikowi nieustannie wykrywa dane i szybko rozładowuje baterię.

Korzystanie z czujnika wilgotności

Nieprzetworzone dane wilgotności względnej możesz uzyskać, używając czujnika wilgotności w taki sam sposób, w jaki korzystasz czujniki światła, ciśnienia i temperatury. Jeśli jednak urządzenie ma oba czujniki wilgotności, (TYPE_RELATIVE_HUMIDITY) i czujnika temperatury (TYPE_AMBIENT_TEMPERATURE) możesz wykorzystać te 2 strumienie danych do obliczenia punktu rosy i wilgotności bezwzględnej.

Punkt rosy

Temperatura punktu rosy to temperatura, w której należy schłodzić określoną ilość powietrza na stałym poziomie ciśnienia barometryczne, aby para wodna spadła w wodę. Poniższe równanie pokazuje, może obliczyć punkt rosy:

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

Gdzie,

  • td = temperatura punktu rosy w stopniach C
  • t = rzeczywista temperatura w stopniach C
  • RH = rzeczywista wilgotność względna w procentach (%)
  • m = 17,62
  • Tn = 243,12

Wilgotność bezwzględna

Wilgotność bezwzględna to masa pary wodnej w danej objętości suchego powietrza. Bezwzględna wilgotność jest mierzona w gramach/metr3. Poniższe równanie pokazuje, może obliczać wilgotność bezwzględną:

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

Gdzie,

  • dv = wilgotność bezwzględna w gramach/metrze3
  • t = rzeczywista temperatura w stopniach C
  • RH = rzeczywista wilgotność względna w procentach (%)
  • m = 17,62
  • N = 243,12 stopnia C
  • A = 6,112 hPa

Warto też przeczytać