09 March 2013

Sensor API in Android - การใช้งาน Humidity Sensor

Updated on

        คราวนี้ขอต่อกันด้วยเซนเซอร์แปลกๆบ้าง อย่าง Humidity Sensor ซึ่งอาจจะดูไม่แปลกสำหรับผู้ที่หลงเข้ามาอ่านบางคน แต่มันจะดูแปลเมื่อมาอยู่บนอุปกรณ์แอนดรอยด์นี่ล่ะ เพราะว่าเครื่องส่วนใหญ่จะไม่ค่อยมี Sensor ตัวนี้ซักเท่าไร



        สำหรับ Humidity Sensor แปลตรงตัวเลยง่ายๆ ก็คือวัดความชื้นที่เอาไว้วัดความชื้นสัมพัทธ์ของอากาศ โดยมีหน่วยเป็น %RH หรือ %

        สำหรับการทำงานของคำสั่งหลักๆเจ้าของบล็อกจะไม่อธิบายนะ ให้ผู้ที่หลงเข้ามาอ่านเข้าไปอ่านจากบทความ [Android Code] การใช้งาน Accelerometer เพราะว่าการเรียกใช้งานนั้นเหมือนกันเป๊ะๆ ต่างกันแค่ว่าค่าที่ได้นั่นเอง


        ในการใช้งานก็จะเปลี่ยนคำสั่งจากเดิมที่เป็น Accelerometer ให้กลายเป็น Humidity Sensor ด้วยนะ อย่าลืมซะล่ะ

SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_RELATIVE_HUMIDITY);

        ส่วนคำสั่งอื่นๆ ทั้งหมดก็จะเหมือนกับ Accelerometer เลย ยกเว้นค่าที่ได้ เพราะว่า Accelerometer จะได้ออกมาเป็น Float Array จำนวน 3 ตัวด้วยกันคือ XYZ แต่สำหรับ Humidity Sensor จะได้ออกมาแค่ 1 ตัว ซึ่งมีหน่วยเป็น %RH


        ทีนี้ก็มาดูตัวอย่างในบทความนี้ต่อเลยดีกว่าละกัน
Main.java
package app.akexorcist.sensor_humidity;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.widget.TextView;

public class Main extends Activity {
    
    TextView textHumidity;
    SensorManager sensorManager;
    Sensor sensor;
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensor = sensorManager.getDefaultSensor(Sensor.TYPE_RELATIVE_HUMIDITY);
        
        textHumidity = (TextView) findViewById(R.id.textHumidity);
    }
 
    public void onResume() {
        super.onResume();
        sensorManager.registerListener(humidListener, sensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }
 
    public void onStop() {
        super.onStop();
        sensorManager.unregisterListener(humidListener);
    }

    public SensorEventListener humidListener = new SensorEventListener() {
        public void onAccuracyChanged(Sensor sensor, int acc) { }
 
        public void onSensorChanged(SensorEvent event) {
            float pressure = event.values[0];
            textHumidity.setText("Humidity is: " + pressure + " %");
        }
    };
}

        เจ้าของบล็อกไม่อธิบายใน Main.java แล้วนะ เพราะเคยอธิบายไปแล้ว ให้อ่านบทความ [Android Code] การใช้งาน Accelerometer แทนนะ

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center" >
    
    <TextView
        android:id="@+id/textLight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp" 
        android:text="" />

</LinearLayout>


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.akexorcist.sensor_humidity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="app.akexorcist.sensor_humidity.Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

        สำหรับ Humidity Sensor นั้นเป็น Sensor เฉพาะทางจริงๆ ซึ่งไม่ได้ถูกเรียกใช้บ่อยมากนัก เปรียบเสมือนลูกเล่นเสริมซะมากกว่า โดยใช้ร่วมกับ Temperature Sensor เพื่อให้วัดได้ทั้งความชื้นสัมพัทธ์และอุณหภูมิ สำหรับไฟล์ตัวอย่างสามารถดาวน์โหลดได้จาก

                Sensor-Humidity [Google Drive]

                Sensor-Humidity [GitHub]

                Sensor-Humidity [Sleeping For Less]