پلتفرم اندروید چهار حسگر را ارائه میکند که به شما امکان نظارت بر ویژگیهای مختلف محیطی را میدهد. می توانید از این حسگرها برای نظارت بر رطوبت نسبی محیط، روشنایی، فشار محیط و دمای محیط در نزدیکی دستگاه مجهز به اندروید استفاده کنید. هر چهار حسگر محیطی مبتنی بر سخت افزار هستند و تنها در صورتی در دسترس هستند که سازنده دستگاه آنها را در دستگاهی تعبیه کرده باشد. به استثنای سنسور نور، که اکثر سازندگان دستگاه ها از آن برای کنترل روشنایی صفحه استفاده می کنند، سنسورهای محیط همیشه در دستگاه ها در دسترس نیستند. به همین دلیل، به ویژه مهم است که در زمان اجرا بررسی کنید که آیا یک حسگر محیطی وجود دارد یا خیر، قبل از اینکه بخواهید اطلاعاتی از آن به دست آورید.
برخلاف اکثر سنسورهای حرکت و حسگرهای موقعیت، که یک آرایه چند بعدی از مقادیر حسگر را برای هر SensorEvent
برمیگردانند، حسگرهای محیطی یک مقدار حسگر واحد را برای هر رویداد داده برمیگردانند. برای مثال، دما بر حسب درجه سانتی گراد یا فشار بر حسب hPa. همچنین، بر خلاف سنسورهای حرکت و سنسورهای موقعیت، که اغلب به فیلتر بالا گذر یا پایین گذر نیاز دارند، سنسورهای محیطی معمولاً نیازی به فیلتر کردن داده یا پردازش داده ندارند. جدول 1 خلاصه ای از حسگرهای محیطی را ارائه می دهد که در پلتفرم اندروید پشتیبانی می شوند.
جدول 1. حسگرهای محیطی که در پلتفرم اندروید پشتیبانی می شوند.
سنسور | داده های رویداد حسگر | واحدهای اندازه گیری | توضیحات داده ها |
---|---|---|---|
TYPE_AMBIENT_TEMPERATURE | event.values[0] | درجه سانتی گراد | دمای هوای محیط |
TYPE_LIGHT | event.values[0] | lx | روشنایی. |
TYPE_PRESSURE | event.values[0] | hPa یا mbar | فشار هوای محیط |
TYPE_RELATIVE_HUMIDITY | event.values[0] | % | رطوبت نسبی محیط |
TYPE_TEMPERATURE | event.values[0] | درجه سانتی گراد | دمای دستگاه 1 |
1 پیاده سازی ها از دستگاهی به دستگاه دیگر متفاوت است. این سنسور در اندروید 4.0 (سطح API 14) منسوخ شده است.
از سنسورهای نور، فشار و دما استفاده کنید
دادههای خامی که از سنسورهای نور، فشار و دما به دست میآورید معمولاً نیازی به کالیبراسیون، فیلتر کردن یا اصلاح ندارند، که باعث میشود آنها یکی از آسانترین حسگرها برای استفاده باشند. برای به دست آوردن اطلاعات از این حسگرها ابتدا نمونه ای از کلاس 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)] )](https://developer.android.com/static/images/guide/topics/sensors/dew_point.png?hl=fa)
کجا،
- t d = دمای نقطه شبنم بر حسب درجه سانتیگراد
- t = دمای واقعی بر حسب درجه سانتیگراد
- RH = رطوبت نسبی واقعی بر حسب درصد (%)
- m = 17.62
- T n = 243.12
رطوبت مطلق
رطوبت مطلق جرم بخار آب در حجم معینی از هوای خشک است. رطوبت مطلق بر حسب گرم بر متر 3 اندازه گیری می شود. معادله زیر نشان می دهد که چگونه می توانید رطوبت مطلق را محاسبه کنید:
![d_v(t،RH) = (RH/100) · A · exp(m· t/(T_n+t)/(273.15 + t)](https://developer.android.com/static/images/guide/topics/sensors/absolute_humidity.png?hl=fa)
کجا،
- d v = رطوبت مطلق بر حسب گرم در متر 3
- t = دمای واقعی بر حسب درجه سانتیگراد
- RH = رطوبت نسبی واقعی بر حسب درصد (%)
- m = 17.62
- T n = 243.12 درجه سانتیگراد
- A = 6.112 hPa