ラズパイで気温と湿度を測定、LINEで通知を受け取る 〜前編〜:名刺サイズの超小型PC「ラズパイ」で遊ぶ(第26回)
今回は温湿度センサーモジュールとラズパイを組み合わせ、LINEと連携させる方法を紹介します。
9月に入ってからも暑さが続き、まだまだエアコンが欠かせない状態です。テレワークにより自宅で仕事をしている方も多いかと思いますが、部屋のコンディションがどのような状況なのかを知っておくのは重要です。そこで気温と湿度を測定して、暑さ指数に基づいた熱中症警報をLINEに飛ばす仕組みを作ってみたいと思います。
温湿度センサー「SHT31」で温度と湿度を測定する
ラズパイで温度と湿度や気圧を測定し、表示させる方法については第1回から第3回で解説しました。この時は気温、湿度、気圧を測定できる温湿度・気圧センサーモジュール「BME280」を使って表示させました。今回は気圧を測定しないので、温湿度センサーモジュール「SHT-31」を使って表示させることにします。
SHT31はBME280と同様に「I2C」という仕組みを使ってデータのやりとりをします。その際にはシリアルクロック(SCL)とシリアルデータ(SDA)の2本の信号線を使います。ラズパイの3番ピンがSDA、5番ピンがSCLに割り当てられており、ここからSHT31のSDAとSCLにつなぎ、データの読み書きをすることになります。
まずはSHT31がどのアドレスを使っているのか、「i2cdetect」コマンドを入力して調べます。
$ i2cdeetect -y 1
すると以下のように表示されます。
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- 45 -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
これで「0x45」のアドレスを利用していることが分かります。
続いては実際にデータを求めていきましょう。SHT31にI2Cアドレスとコマンドコード(MSB)、コマンドコード(LSB)を送ると、温度測定値(MSB)、温度測定値(LSB)、チェックサム、湿度測定値(MSB)、湿度測定値(LSB)、チェックサムという6個のブロックのデータが戻ってきます。これをそれぞれ読み出して、気温と湿度を求めます。
気温と湿度は以下の計算式で求められます。変数「St」は温度測定値(MSB)、温度測定値(LSB)の和、変数「Srh」は湿度測定値(MSB)、湿度測定値(LSB)の和です。
気温 T=−45+175×測定された値St/2の16乗−1
湿度 RH=100×測定された値Srh/2の16乗−1
これを踏まえてプログラムを作ると以下のようになります。「sht31.py」などのプログラム名で保存してください。
#!/usr/bin/env python # -*- coding: utf-8 -*- import smbus smb = smbus.SMBus(1) # SHT31のI2Cアドレス addr = 0x45 # データの読み出し smb.write_i2c_block_data(addr, 0x2C, [0x06]) data = smb.read_i2c_block_data(addr, 0x00, 6) # 気温 st = data[0] <<8 | data[1] roomtemp = -45 + (175 * st/float((2**16 - 1))) # 湿度 srh = data[3] <<8 | data[4] roomhum = 100 * srh/ float((2**16 - 1)) # 気温と湿度の表示 print ('Temp : %.1f C' %roomtemp) print ('Humi : %.1f %%'%roomhum)
では前と同じように、気温と湿度をCSV形式のファイルで保存できるようにします。このためプログラムの最後を書き換えるとともに、変数を追加します。「sht31_kiroku.py」などのプログラム名で保存しておきましょう。
#!/usr/bin/env python # -*- coding: utf-8 -*- import time import smbus import datetime t = datetime.datetime.today() smb = smbus.SMBus(1) # SHT31のI2Cアドレス addr = 0x45 # データの読み出し smb.write_i2c_block_data(addr, 0x2C, [0x06]) data = smb.read_i2c_block_data(addr, 0x00, 6) # 気温 st = data[0] <<8 | data[1] roomtemp = -45 + (175 * st/float((2**16 - 1))) # 湿度 srh = data[3] <<8 | data[4] roomhum = 100 * srh/ float((2**16 - 1)) # 気温と湿度の表示 print t.strftime("%Y/%m/%d,%H:%M"),",%-6.2f,%6.2f" % (roomtemp,roomhum)
このプログラムができたら、定期的に測定結果を保存するよう、cronという仕組みを使います。
$ sudo crontab -e
とエディットモードで表示したら、以下のように記述します。
*/10 * * * * python /home/pi/sht31_kiroku.py >> /home/pi/kiroku.csv
これでホームディレクトリに「kiroku.csv」というファイルができ、毎10分ごとに温度と湿度を記録してくれます。
次回はラズパイからLINEへ気温と湿度の測定値を送るとともに、暑さ指数を警告してくれる仕組みについてご紹介します。
関連記事
- ラズパイを無線LANルーター化する 〜アクセスポイント編〜
家庭内で無線LANルータを使っている人は多いかと思います。今回はそのルーター機能をラズパイに持たせて、ラズパイを使った無線LANルーターの構築方法についてご紹介します。 - 本格的な撮影が楽しめる公式カメラモジュール「Raspberry Pi High Quality Camera」を試す
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。Raspberry Pi公式のカメラとして本格的な撮影が楽しめる「Raspberry Pi High Quality Camera」を紹介します。 - ラズパイで新型コロナウイルス解析に参加する 〜Ubuntu Serverの構築編〜
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。今回はラズパイで。 - ラズパイでスマートスピーカーを作る 「アレクサ!あしたの天気は?」 〜ソフトウェア準備編〜
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。今回は米Amazonが開発したAIアシスタント「Alexa」をラズパイで使えるようにしてみます。 - これが“らずキャン△”だ! キャンプ場で役立つ「気温・湿度・気圧センサー」の作り方
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。まずはキャンプ場で気温、湿度、気圧を測れるデバイスを作ってみます。 - ラズパイで「YouTube」と「Amazon プライムビデオ」を見る
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。音楽や動画のメディアサーバ化するために入れたOS「OSMC」で、YouTubeやAmazon プライムビデオなどを楽しんでみましょう。 - ラズパイで自宅ファイルサーバを作る
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。ネット経由でアクセスできる自宅ファイルサーバをラズパイで構築してみます。 - ラズパイで動体検知対応の監視カメラを作る
小さなマイクロコンピュータ「Raspberry Pi」(通称ラズパイ)で作る、自分だけのガジェット。ラズパイで動くソフト「motion」を使うと、カメラの前で何かが動いた瞬間に静止画や動画を撮影して記録できます。今回はラズパイで監視カメラを作ってみます。
Copyright © ITmedia, Inc. All Rights Reserved.