対象読者
IoTに興味があり、C#とRaspberry Pi(Linux環境)の基本的な知識がある方を対象とします。Linuxや電子工作の初歩的な説明は割愛していますので、「Raspberry Piをつかったセンサープログラミング超入門」の記事なども併せて参照してください。
はじめに
前回は、OLEDディスプレイモジュールに直線や文字を表示しました。最終回となる今回は、温湿度センサーを使って、温度と湿度を計測し、その値を表示してみます。
温湿度センサー
今回は、SENSIRION社の高精度温湿度センサSHT31-DISを搭載したセンサーモジュールを使いました。環境情報のセンサーといえば、ボッシュ社のBME280を搭載したセンサーモジュールのほうがおなじみかもしれません。ただBME280は、計測値の換算(補正が必要)が複雑で、気温に関しては、SHT31のほうが精度が高いようなので、こちらを選択しました。
センサーモジュールの準備
今回のセンサーモジュールも、I2C通信で制御できます。ピンヘッダを次のようにハンダ付けしました。なお、ADR端子はアドレス選択用端子で、今回のようにグランドに接続するとI2Cアドレスは、0x44、解放では0x45となります。
接続
I2C通信のデバイスは、SDA、SCL端子を並列に接続することで、複数のデバイスを制御することが可能です。今回は、次のように配線しています。OLEDディスプレイモジュールと、センサーモジュールのSDA、SCL端子を、Raspberry PiのSDA、SCLに並列に接続します。
I2C通信の受信
前回までは、I2C通信は送信のみでしたが、今回は測定値を受信する必要があります。そのため、WiringPiラッパークラスに、受信メソッドを追加しておきます。送信同様、WiringPiには、I2C通信の受信関数が用意されています。
ただ今回の温湿度センサーモジュールでは、どうしてもうまく読み出すことができなかったので、より低レベルである標準Cライブラリのread関数を用いました。read関数は、指定のファイルディスクリプタからデータを読み出す関数で、共有ライブラリのlibc.so.6に含まれています。正常に受信できれば読み出したバイト数、受信できなかったときは-1を返します。
// Wiring Piラッパークラス public class WiringPi { ~中略~ // I2Cデータ受信 [DllImport("libc.so.6", EntryPoint = "read")] public extern static int Read(int fd, byte[] data, int length); }