Ortam sensörleri

Android platformunda çeşitli çevre özelliklerini izlemenize olanak tanıyan dört sensör bulunur. Android destekli cihazlarda bağıl nemi, aydınlatmayı, ortam basıncını ve ortam sıcaklığını izlemek için bu sensörleri kullanabilirsiniz. Dört ortam sensörünün tümü donanım tabanlıdır ve yalnızca cihaz üreticisi bunları bir cihaza yerleştirdiyse kullanılabilir. Çoğu cihaz üreticisinin ekran parlaklığını kontrol etmek için kullandığı ışık sensörü haricinde, ortam sensörleri cihazlarda her zaman kullanılamaz. Bu nedenle, oradan veri elde etmeye çalışmadan önce çalışma zamanında bir ortam sensörü olup olmadığını doğrulamanız özellikle önemlidir.

Her SensorEvent için çok boyutlu bir sensör değerleri dizisi döndüren çoğu hareket sensörünün ve konum sensörünün aksine ortam sensörleri, her veri etkinliği için tek bir sensör değeri döndürür. Örneğin, °C cinsinden sıcaklık veya hPa cinsinden basınç. Ayrıca, genellikle yüksek veya düşük geçişli filtreleme gerektiren hareket sensörlerinin ve konum sensörlerinin aksine ortam sensörleri genelde herhangi bir veri filtreleme veya veri işleme gerektirmez. Tablo 1'de, Android platformunda desteklenen ortam sensörlerinin bir özeti gösterilmektedir.

Tablo 1. Android platformunda desteklenen ortam sensörleri.

Sensör Sensör etkinlik verileri Ölçü birimleri Veri açıklaması
TYPE_AMBIENT_TEMPERATURE event.values[0] °C Ortam hava sıcaklığı.
TYPE_LIGHT event.values[0] lx Aydınlık.
TYPE_PRESSURE event.values[0] hPa veya mbar Ortam hava basıncı.
TYPE_RELATIVE_HUMIDITY event.values[0] % Ortamın bağıl nemi.
TYPE_TEMPERATURE event.values[0] °C Cihaz sıcaklığı.1

1 Uygulamalar cihaza göre değişiklik gösterir. Bu sensör Android 4.0'da (API Düzeyi 14) kullanımdan kaldırılmıştır.

Işık, basınç ve sıcaklık sensörlerini kullanma

Işık, basınç ve sıcaklık sensörlerinden edindiğiniz ham veriler için genellikle kalibrasyon, filtreleme veya modifikasyon gerekmez. Bu nedenle, kullanımı en kolay sensörlerden bazılarıdır. Bu sensörlerden veri almak için önce SensorManager sınıfının bir örneğini oluşturmanız gerekir. Bu örneği fiziksel sensörün örneğini almak için kullanabilirsiniz. Ardından onResume() yöntemine bir sensör dinleyicisi kaydeder ve gelen sensör verilerini onSensorChanged() geri çağırma yönteminde işlemeye başlarsınız. Aşağıdaki kod bunu nasıl yapacağınızı gösterir:

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

Her zaman hem onAccuracyChanged() hem de onSensorChanged() geri çağırma yöntemlerinin uygulamalarını eklemeniz gerekir. Ayrıca, bir aktivite durduğunda her zaman sensörün kaydını iptal ettiğinizden emin olun. Bu durum, sensörün sürekli olarak verileri algılamasını ve pili bitirmesini engeller.

Nem sensörünü kullanma

Nem sensörünü ışık, basınç ve sıcaklık sensörlerini kullandığınız şekilde kullanarak ham bağıl nem verilerini elde edebilirsiniz. Ancak bir cihazda hem nem sensörü (TYPE_RELATIVE_HUMIDITY) hem de sıcaklık sensörü (TYPE_AMBIENT_TEMPERATURE) varsa çiy noktasını ve mutlak nemi hesaplamak için bu iki veri akışını kullanabilirsiniz.

Çiy noktası

Çiy noktası, su buharının suya yoğunlaşması için belirli bir hacimdeki havanın sabit barometrik basınçta soğutulması gereken sıcaklıktır. Aşağıdaki denklemde çiy noktasını nasıl hesaplayabileceğiniz gösterilmektedir:

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

Burada,

  • td = C derece olarak çiy noktası sıcaklığı
  • t = C derece olarak gerçek sıcaklık
  • Bağıl nem = yüzde (%) cinsinden gerçek bağıl nem
  • e = 17,62
  • Tn = 243,12

Mutlak nem

Mutlak nem, belirli bir kuru hava hacmindeki su buharının kütlesidir. Mutlak nem, gram/metre3 cinsinden ölçülür. Aşağıdaki denklemde mutlak nemi nasıl hesaplayabileceğiniz gösterilmektedir:

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

Burada,

  • dv = gram/metre cinsinden mutlak nem3
  • t = C derece olarak gerçek sıcaklık
  • Bağıl nem = yüzde (%) cinsinden gerçek bağıl nem
  • e = 17,62
  • Tn = 243,12 C derece
  • A = 6,112 hPa

Ayrıca şu makaleleri de okumalısınız: