ITちゃんねる

仕事に役立つIT業界の最新ニュース

C#でラズパイに接続した温湿度センサーで計測しよう

 C#と言えば、Windows環境だけと思われがちですが、.NET CoreをLinux環境にインストールすれば、C#で開発したアプリケーションが動作します。また、Raspberry Pi(ラズベリーパイ)でも、C#を使ってIoT開発を行うことができます。この連載では、C#によるIoTプログラミングを解説します。

対象読者

 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を返します。

[リスト1]Program.csの一部
// Wiring Piラッパークラスpublic class WiringPi{?中略?// I2Cデータ受信[DllImport("libc.so.6", EntryPoint = "read")]public extern static int Read(int fd, byte[] data, int length);}

C#でラズパイに接続した温湿度センサーで計測しよう