照度センサーを使うには(AndroidMode編)

◆PROCESSING 逆引きリファレンス

 カテゴリー:スマホ(AndroidMode)

照度センサーを使うには(AndroidMode編)

【概要】

PROCESSINGにAndroidMode を導入する事で、PROCESSINGで開発したプログラムをAndroid端末上で動かす事ができるようになります。

AndroidModeの導入については「PROCESSINGをAndroid端末で動かすには(4.0版)」記事を参照してください。

スマホの魅力は様々なアプリケーションを動かすことができるだけでなく、いろいろなセンサーを手軽に利用できるところにもあるのではないでしょうか?。

以下では照度センサーから値を得る方法について紹介します。

なおAndroidでセンサーを扱うには、システムからセンサー管理オブジェクトを取得し、扱いたいセンサー制御オブジェクトと共にリスナーを設定する必要があります。

センサー管理オブジェクトとセンサー制御オブジェクトの取得については「利用可能なセンサーを知るには(AndroidMode編)」記事を参照してください。

 

【詳細】

全般的な注意

センサー管理オブジェクト、センサー制御オブジェクトの取得と、読み取りたいセンサーへのリスナー登録は、Androidの画面が準備完了となり画面が表示される直前に行うべきです。

またセンサーを適時読み取る処理はバッテリーを消費するため、必要がなくなった場合(例えば画面が隠れるような状況になった場合)は、これを即座に停止すべきでしょう。

とくにPROCESSINGでセンサーを使うなら、リスナーの登録処理はsetup関数ではなく onResumeメソッドをオーバライドして行うべきです。

またセンサーの開放処理は、onPauseメソッドをオーバライドして行うのが良いでしょう。

このあたりの話題は「PROCESSINGとライフサイクル(AndroidMode編)」記事も参考としてください。

明るさの単位にはルーメン(lm)、カンデラ(cd)、ルクス(lux)がありますが、照度センサーから得られる値の単位はルクス(lux)です。

つまり・・・スマホの照度センサーに、どのくらいの光が届いているか?(照らされているか=スマホ周辺の明るさ)を示しています。

明るさの単位については下記サイト様などが参考となります。ありがとうございます。

 

センサー制御オブジェクト取得

センサー制御オブジェクト取得Sensor sensor = mng . getDefaultSensor(int Type) ;
sensor : センサー制御オブジェクト。利用できない場合は nullが戻る
mng : センサー管理オブジェクト
Type : 取り出すセンサーの種類

Typeに取り出したいセンサーの種類を与えることで、センサー制御用のオブジェクトを取得できます。

照度センサー用の制御オブジェクトを取り出したいなら、TypeにはSensorクラスがもつTYPE_LIGHT定数(Sensor.TYPE_LIGHT)を指定します。

 

リスナー登録・解除

リスナー登録boolean ret = mng . registerListener (SensorEventListener listener,Sensor sensor,int samplingPeriodUs) ;

mng : センサー管理オブジェクト
sensor : センサー制御オブジェクト
listener : リスナーオブジェクト
samplingPeriodUs : 読み取り頻度
ret : 戻り値(true:成功)

リスナーオブジェクトには、SensorEventListenerインタフェースを実装している必要があります。

PROCESSINGで使うなら、Sketchクラスに上記インタフェースを実装するか、専用のクラスを定義するのが良いでしょう。

samplingPeriodUsには、SensorManagerクラスが持つ以下の何れかの定数を与えます。

定数 意味
SENSOR_DELAY_NORMAL 通常のレート。デフォルト値
SENSOR_DELAY_UI 画面表示やUIを伴うレート
SENSOR_DELAY_GAME GAMEに適したレート
SENSOR_DELAY_FASTEST できるだけ早くデータを取得するレート

データをすばやく引き取ろうとすればするほどバッテリーを食いますので、そこは注意してください。

バッテリー消費を最小限に抑え、できるだけゆっくりとイベントを通知すれば良いのであれば、samplingPeriodUsの後ろにmaxReportLatencyUs引数を追加する事が可能です。

maxReportLatencyUsには、イベントをアプリケーションに報告する前に遅延させる最大時間(マイクロ秒)を指定します。

maxReportLatencyUs引数がない場合(上記で紹介した例)は、maxReportLatencyUsに0を指定した場合と等価になります。

 

リスナー解除void mng . unregisterListener (SensorEventListener listener) ;

mng : センサー管理オブジェクト
listener : リスナーオブジェクト

センサーの値を読み取る必要がなくなったら、速やかにリスナーを解除し、データの通知を停止します。

 

データの取得

データの取得void onSensorChanged( SensorEvent event) ;

event : センサーイベント

センサから新しい値を取得した場合に呼び出されるメソッドです。SendorEventについては 公式サイト を参照してください。

どのセンサーからのデータであるかは、SensorEventのsensorで知ることが可能です。

またSendorEventからデータ(values)を取得する際には、できるだけ速やかに取得する必要があります。

照度はルクス(lux)で、event.values[0]の値のみ利用します。他のセンサー(加速度センサーなど)では event.values[1]やevent.values[2]を使うものがありますが、照度センサーでは利用できないので注意してください。

 

【関連記事】

 


サンプルプログラム

シンプルな照度計測例:

シンプルな照度計測例です。検知した明るさを画面に表示します。検知する値の精度は、機種により差異がある可能性があります。

手持ちのスマホ(V580)では、照度センサーはかなり大雑把な値を拾うようでした。

<出力サンプル>

 

照度に応じて電球を光らせる例:

検出した照度に応じて、電球の絵が光ります。ルクスが高ければ暗く、低ければ明るくなります。

上記プログラムで電球を光らせる部分には、Proce55ing.walker,blog 様に掲載されていたロジックを改変して利用させて頂きました。

またルクスの目安については Microsoft 様のサイトを参照しました。ありがとうございます。

<出力サンプル>


(画像URL:photo-ac 様:dronepc55さん)

 


PROCESSING逆引きリファレンス一覧 へ戻る

本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。