حسگرهای محیطی

پلاتفرم Android چهار حسگر ارائه می‌دهد که به شما امکان می‌دهد ویژگی‌های مختلف محیطی را پایش کنید. می‌توانید از این حسگرها برای نظارت بر رطوبت نسبی محیط، روشنایی، فشار محیط، و دمای محیط نزدیک دستگاه مجهز به Android استفاده کنید. هر چهار حسگر محیطی مبتنی بر سخت‌افزار هستند و فقط درصورتی دردسترس‌اند که سازنده دستگاه آن‌ها را در دستگاه تعبیه کرده باشد. به‌استثنای حسگر نور که اکثر سازندگان دستگاه از آن برای کنترل روشنایی صفحه‌نمایش استفاده می‌کنند، حسگرهای محیطی همیشه در دستگاه‌ها دردسترس نیستند. به همین دلیل، بسیار مهم است که قبل‌از تلاش برای دریافت داده از حسگر محیطی، وجود آن را در زمان اجرا تأیید کنید.

برخلاف اکثر حسگرهای حرکتی و حسگرهای موقعیت که آرایه‌ای چندبعدی از مقادیر حسگر را برای هر SensorEvent برمی‌گردانند، حسگرهای محیطی یک مقدار حسگر واحد را برای هر رویداد داده برمی‌گردانند. برای مثال، دما برحسب درجه سانتی‌گراد یا فشار برحسب هکتوپاسکال. همچنین، برخلاف حسگرهای حرکتی و حسگرهای موقعیت که اغلب به فیلتر کردن بالاگذر یا پایین‌گذر نیاز دارند، حسگرهای محیطی معمولاً به فیلتر کردن داده یا پردازش داده نیاز ندارند. جدول ۱ خلاصه‌ای از حسگرهای محیطی را که در پلاتفرم Android پشتیبانی می‌شوند ارائه می‌دهد.

جدول ۱. حسگرهای محیطی که در پلاتفرم Android پشتیبانی می‌شوند.

حسگر داده‌های رویداد حسگر واحدهای اندازه‌گیری شرح داده‌ها
TYPE_AMBIENT_TEMPERATURE event.values[0] ‎°C دمای هوای محیط.
TYPE_LIGHT event.values[0] لوکس شدت روشنایی.
TYPE_PRESSURE event.values[0] هکتوپاسکال یا میلی‌بار فشار هوای محیط.
TYPE_RELATIVE_HUMIDITY event.values[0] ٪ رطوبت نسبی محیط.
TYPE_TEMPERATURE event.values[0] ‎°C دمای دستگاه.۱

۱ پیاده‌سازی‌ها از دستگاهی به دستگاه دیگر متفاوت است. این حسگر در Android 4.0 (سطح میانای برنامه‌سازی کاربردی ۱۴) منسوخ شده است.

استفاده از حسگرهای نور، فشار، و دما

داده‌های خامی که از حسگرهای نور، فشار، و دما دریافت می‌کنید معمولاً به کالیبراسیون، فیلتر کردن، یا اصلاح نیاز ندارند، که این امر آن‌ها را به یکی از آسان‌ترین حسگرها برای استفاده تبدیل می‌کند. برای کسب داده از این حسگرها، ابتدا نمونه‌ای از کلاس SensorManager ایجاد می‌کنید که می‌توانید از آن برای دریافت نمونه‌ای از حسگر فیزیکی استفاده کنید. سپس یک شنونده حسگر را در روش onResume() ثبت می‌کنید و شروع به مدیریت داده‌های حسگر ورودی در روش بازخوان onSensorChanged() می‌کنید. کد زیر نحوه انجام این کار را نشان می‌دهد:

کاتلین

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

جاوا

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 = دمای نقطه شبنم به درجه سانتی‌گراد
  • t = دمای واقعی به درجه سانتی‌گراد
  • رطوبت نسبی = رطوبت نسبی واقعی به درصد (%)
  • m = 17.62
  • Tn = 243.12

رطوبت مطلق

رطوبت مطلق عبارت است از جرم بخار آب در حجم معینی از هوای خشک. رطوبت مطلق برحسب گرم/متر3 اندازه‌گیری می‌شود. معادله زیر نشان می‌دهد که چگونه می‌توانید رطوبت مطلق را محاسبه کنید:

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

کجا،

  • dv = رطوبت مطلق برحسب گرم/متر۳
  • t = دمای واقعی به درجه سانتی‌گراد
  • رطوبت نسبی = رطوبت نسبی واقعی به درصد (%)
  • m = 17.62
  • Tn = ۲۴۳٫۱۲ درجه سانتی‌گراد
  • A = 6.112 hPa

همچنین باید این موارد را بخوانید