חיישני סביבה

בפלטפורמת Android יש ארבעה חיישנים שמאפשרים לעקוב אחרי מאפיינים סביבתיים שונים. אפשר להשתמש בחיישנים האלה כדי לעקוב אחרי הלחות היחסית בסביבה, רמת ההארה, לחץ הסביבה וגם טמפרטורת הסביבה ליד מכשיר מבוסס Android. כל ארבעת חיישני הסביבה מבוססים על חומרה והם זמינים רק אם יצרן המכשיר כלל אותם במכשיר. מלבד חיישן האור, שמשמש רוב יצרני המכשירים כדי לשלוט בבהירות המסך, החיישנים לא תמיד זמינים במכשירים. לכן, חשוב במיוחד לבדוק בזמן הריצה אם קיים חיישן סביבה לפני שמנסים לקבל נתונים את זה.

בשונה מרוב חיישני התנועה וחיישני המיקום, שמחזירים מערך רב-ממדי של חיישנים ערכים לכל SensorEvent, חיישני סביבה מחזירים חיישן יחיד עבור כל אירוע נתונים. לדוגמה, הטמפרטורה ב-C או הלחץ ב-hPa. כמו כן, בשונה מחיישני תנועה וחיישני מיקום, שלרוב דורשים בהם ציונים גבוהים או נמוכים ובחיישני הסביבה לא נדרשים בדרך כלל סינון נתונים או עיבוד נתונים. שולחן סיכום של חיישני הסביבה שנתמכים בפלטפורמת Android.

טבלה 1. חיישני סביבה שנתמכים בפלטפורמת Android.

חיישן נתוני אירועים מחיישנים יחידות מידה תיאור הנתונים
TYPE_AMBIENT_TEMPERATURE event.values[0] ‎°C טמפרטורת האוויר בסביבה.
TYPE_LIGHT event.values[0] לוקס תאורה.
TYPE_PRESSURE event.values[0] hPa או mbar לחץ האוויר בסביבה.
TYPE_RELATIVE_HUMIDITY event.values[0] % הלחות היחסית של הסביבה.
TYPE_TEMPERATURE event.values[0] ‎°C טמפרטורת המכשיר.1

1 ההטמעות משתנות ממכשיר למכשיר במכשיר. החיישן הזה הוצא משימוש ב-Android 4.0 (רמת API 14).

שימוש בחיישני האור, הלחץ והטמפרטורה

לנתונים הגולמיים שאתם מקבלים מחיישני האור, הלחץ והטמפרטורה, בדרך כלל לא נדרשים נתונים כיול, סינון או שינוי, ולכן הם חלק מהחיישנים הקלים ביותר לשימוש. שפת תרגום כדי להשיג נתונים מהחיישנים האלה, קודם יוצרים מכונה מהמחלקה SensorManager, ואפשר להשתמש בה כדי לקבל מופע של חיישן פיזי. לאחר מכן רושמים חיישן להאזנה בשיטת onResume() ומתחילים לטפל בנתוני חיישנים נכנסים בשיטת הקריאה החוזרת של onSensorChanged(). הקוד הבא מראה איך לעשות את זה:

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

תמיד צריך לכלול הטמעות של שיטות הקריאה החוזרת 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 = הטמפרטורה של נקודת הטל במעלות C
  • t = הטמפרטורה בפועל במעלות C
  • RH = הלחות היחסית בפועל באחוזים (%)
  • m = 17.62
  • Tn = 243.12

הלחות האבסולוטית

הלחות המוחלטת היא המסה של אדי המים בנפח נתון של אוויר יבש. מוחלט הלחות נמדדת בגרם למטר3. המשוואה הבאה מראה איך יכול לחשב את הלחות המוחלטת:

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

איפה,

  • dv = הלחות המוחלטת בגרם למטר3
  • t = הטמפרטורה בפועל במעלות C
  • RH = הלחות היחסית בפועל באחוזים (%)
  • m = 17.62
  • Tn = 243.12 מעלות C
  • A = 6.112 hPa

כדאי גם לקרוא