家庭菜園用の土を作る際に、地温を管理する必要があり、ラズパイを使って簡単な測定装置を作ったので紹介します。
考えた測定装置は以下です。今回は温度センサを土の中にいれるので、防水加工されたDS18B20を使用します。(Amazonだと5本で1300円くらいでした)
この中の土の温度を測定します。50℃以下をキープできるようにしないと菌ちゃんが死んでしまうらしいので温度管理は必須です。地温表示と合わせて、50℃以上になるとLINEに通知するとよさそうですね。「菌ちゃんが死にそうです」って題名で通知しようかな・・・
また、センサからの温度を表示する必要があるので、今回は「Blynk」を使って携帯から確認できるようにします。LCDモニタをつけて表示することも考えたのですが、せっかくなのでIoTサービスを活用することにしました。
「Blynk」はiPhoneとAndroid用のアプリがあるので、環境に合わせてインストールします。自分の携帯はiPhoneなので、iPhone用をインストールしました。メールアドレスとパスワードを登録すると、メールで「AUTH TOKEN」が送られてきます。この後、ラズパイ側で設定する際に必要になるので大切に保管してください。試しに、ラズパイZeroにインストールしてCPU温度を表示させてみたのですが、きちんと温度が表示できています。
iphoneでラズパイのCPU温度を表示した画面
まずは、ラズパイ側にBlynkの環境をインストールして、送られてきた「AUTH TOKEN」を登録します。
Blynkをインストールする前に、WiringPiが必要みたいなので事前にインストールしてください。
Blynkのインストール手順&設定手順
Blynkのインストール手順は以下です。
$ cd $ mkdir -p src/blynk $ cd src/blynk $ wget https://github.com/blynkkk/blynk-library/releases/download/v0.5.4/Blynk_Release_v0.5.4.zip $ unzip Blynk_Release_v0.5.4.zip $ cd libraries/Blynk/linux $ make clean all target=raspberry
blyncへのリンクを作成しておくと便利です。
$ cd ~ $ ln –s /home/[ユーザー名]/src/blynk/libraries/Blynk/linux blync
次に、Blynkのサンプルプログラムを編集して、ウィジットをシェルスクリプトを編集するだけで使用できるようにします。
ここでは、V0〜V9 をディスプレイ系(読出し)のウィジット用、V10〜V19 をコントローラー系(書込み)のウィジット用として割り当てます。
blynk-library/linux/main.cpp を編集します。
以下の4行をコメントアウト
BLYNK_WRITE(V1)
{
printf("Got a value: %s\n", param[0].asStr());
}
以下を追記
void blynk_read_exec(int pin) {
char command[256] = "";
char buff[256] = "";
FILE *fp;
sprintf(command, "/home/pi/blynk/BLYNK_READ_V%d.sh", pin);
if((fp=popen(command,"r")) != NULL) {
if(fgets(buff, 255, fp) != NULL) strtok(buff, "\n\0");
}
pclose(fp);
Blynk.virtualWrite(pin, buff);
BLYNK_LOG("Command: %s -> %s", command, buff);
}
void blynk_write_exec(int pin, const BlynkParam& param) {
char command[256] = "";
char buff[256] = "";
sprintf(command, "/home/pi/blynk/BLYNK_WRITE_V%d.sh", pin);
for (int i=0; i<3; i++) {
if(! param[i].isValid()) break;
sprintf(buff, " %d", param[i].asInt());
strcat(command, buff);
}
BLYNK_LOG("Command: %s", command);
system(command);
}
BLYNK_READ(V0) { blynk_read_exec(V0); }
BLYNK_READ(V1) { blynk_read_exec(V1); }
BLYNK_READ(V2) { blynk_read_exec(V2); }
BLYNK_READ(V3) { blynk_read_exec(V3); }
BLYNK_READ(V4) { blynk_read_exec(V4); }
BLYNK_READ(V5) { blynk_read_exec(V5); }
BLYNK_READ(V6) { blynk_read_exec(V6); }
BLYNK_READ(V7) { blynk_read_exec(V7); }
BLYNK_READ(V8) { blynk_read_exec(V8); }
BLYNK_READ(V9) { blynk_read_exec(V9); }
BLYNK_WRITE(V10) { blynk_write_exec(V10,param); }
BLYNK_WRITE(V11) { blynk_write_exec(V11,param); }
BLYNK_WRITE(V12) { blynk_write_exec(V12,param); }
BLYNK_WRITE(V13) { blynk_write_exec(V13,param); }
BLYNK_WRITE(V14) { blynk_write_exec(V14,param); }
BLYNK_WRITE(V15) { blynk_write_exec(V15,param); }
BLYNK_WRITE(V16) { blynk_write_exec(V16,param); }
BLYNK_WRITE(V17) { blynk_write_exec(V17,param); }
BLYNK_WRITE(V18) { blynk_write_exec(V18,param); }
BLYNK_WRITE(V19) { blynk_write_exec(V19,param); }
編集が終わったら、以下のコマンドで再コンパイルします。
$ cd /home/[ユーザー名]/src/blynk/libraries/Blynk/linux $ make clean all target=raspberry
これで、C言語のプログラムを変更せずに、シェルスクリプトを作成するだけで、V0~V19のウィジェットを使用することができます。
ディスプレイ系(読出し)のウィジット:BLYNK_READ_V0~9.sh
コントローラー系(書込み)のウィジット:BLYNK_WRITE_V10~19.sh
温度センサからのデータを表示する場合は、Blynk側で割り当てるウィジェットに合わせて、BLYNK_READ_V0~9.shでシェルスクリプトを作成します。
無料で使用できるENERGYが”2000”なので、温度表示用のウィジェット(400ENERGY)だと、5個までは無料で使えますね。
温度センサ(DS18B20)の測定準備
1-wireデバイス用のモジュールを起動時に読み込むように設定します。
/etc/modules に以下の2行を追加します。
w1-gpio w1-therm
1-wireデバイス用のモジュールを有効にするため、/boot/config.txt の最後に以下の行を追加します。今回購入した温度センサの配線は3本配線なのでpullupは必要なさそうです。
dtoverlay=w1-gpio,gpiopin=4
2本配線のParasite Modeでは、pullupを指定した方が良さそうです。
dtoverlay=w1-gpio-pullup,gpiopin=4
今回は、3本配線(Parasite Modeではない)なので、pullupなしで設定しました。
最後に設定を反映するため再起動します。
$ sudo reboot
再起動後に、lsmodコマンドでモジュールが正しく読み込まれていることを確認します。
$ lsmod |grep w1 w1_therm 20480 0 w1_gpio 16384 0 wire 40960 2 w1_gpio,w1_therm
w1_thermとw1_gpioの表示が確認できれば正しく読み込まれています。
以上で、ラズパイ側の準備は完了です。
温度センサ(DS18B20)の接続確認
温度センサをラズパイに接続して、温度センサが正しく認識できているかを確認します。
まず、ユニバーサル基板に接続コネクタを取り付けて、ジャンパ線でラズパイと温度センサを取り付けます。
正しく認識されると、「/sys/bus/w1/devices/」にディレクトリが表示されます。
lsコマンドで確認すると、「28-000」で始まるディレクトリです。
$ ls /sys/bus/w1/devices/ 28-000xxxxxxxxx w1_bus_master1
この「28-000」で始まるディレクトリが、温度センサのデバイスIDになります。
温度センサから値を取得する場合は、「28-000」で始まるディレクトリ内の「w1_slave」ファイルを読みます。こんな感じで読めるみたいです。
$ cat /sys/bus/w1/devices/28-000xxxxxxxxx/w1_slave 8c 01 4b 46 7f ff 04 10 2e : crc=2e YES 8c 01 4b 46 7f ff 04 10 2e t=28650
実際の温度データは「t=」の値で、1000倍された値が表示されます。上記値だと、28.650℃になります。
あとは、t=の値のみを切り出して、1000で割ると、温度データのみが取り出せます。温度データを取り出すシェルスクリプトは以下です。
#!/bin/sh DEVID="28-000xxxxxxxxx" cat /sys/bus/w1/devices/$DEVID/w1_slave \ | perl -e 'while(<stdin>){ if(/t=([-0-9]+)/){print $1/1000,"\n";} }'
これを、Blynkで実行するシェルスクリプトとして「BLYNK_READ_V1.sh」というファイル名で保存して実行権を付与します。
試しに実行してみると、温度データのみが表示されるはずです。
$ chmod +x BLYNK_READ_V1.sh $ ./BLYNK_READ_V1.sh 28.65
あとは「Blynk」側のウィジェット(V1)に割り付けると、温度データを携帯の画面で確認することができます。INPUTをV1に割り付けて、取得周期を5秒に設定しました。
V1でCPU温度を表示して、V2,V3で2個のセンサをモニタできるようにしました。
意外と簡単にセンサからデータを取得することができるので、いろんなところで活用してくれそうですね。これで、我が家の菌ちゃんも安心して活動してくれると思います。