名刺サイズの超小型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へ気温と湿度の測定値を送るとともに、暑さ指数を警告してくれる仕組みについてご紹介します。
Copyright © ITmedia, Inc. All Rights Reserved.
名刺サイズの超小型PC「ラズパイ」で遊ぶ
今やスマートフォンアプリで何でも完結できてしまう時代。しかし、一から自分の手でデバイスを作り上げ、試行錯誤しながらアイデアを具現化する楽しさは格別です。この連載では、テーマや用途にあわせてマイクロコンピュータ(マイコン)と呼ばれる名刺サイズの超小型PC「Raspberry Pi」(通称ラズパイ)の活用方法から具体的な工作手順までを紹介します。
この記事の著者
関連記事
こんなメディアも見られています
ITmedia NEWSに関連する情報をお探しであれば、こちらのメディアもお役に立てるかもしれません。
SpecialPR
本日の新着記事
アクセスランキング
-
1
「楽天トラベル」に不正アクセス 顧客情報最大約260万件など流出か 予約者約3.6万件のクレカ情報も
-
2
Apple、「iPad mini」を大幅刷新 8.5インチOLEDとA20 Pro搭載、防水にも対応 11万9800円から
-
3
「年齢は合ってますが、人間ではありません」 6歳の飼い猫に届いた“進研ゼミの案内” なぜ届いたのかベネッセに聞いた
-
4
GMO熊谷代表「社内ホワイトハッカーが事前に指摘」も対策遅れ、国に「能動的サイバー防御」要請 「責任転嫁では」SNSで批判も
-
5
GMO不正アクセス、犯人側は「27日に顧客のPC攻撃」予告 GMOが端末回収、ホワイトハッカーが解析中
-
6
Google、プライバシーポリシーに「Gmail」「Googleフォト」のデータを広告に使う例外を追加 回避方法は
-
7
「5年でバッテリーが使い物にならなくなる」は本当か テスラ「モデル3」5年目点検で分かったこと
-
8
ジョーシンへの不正アクセス、最大623万件漏えいか 運転免許証2件・マイナカード1件なども
-
9
グッスマに不正アクセス、公式EC閉鎖 会員の住所や注文履歴など漏えいか 再開目処立たず
-
10
野村総研、サイバー攻撃時の「能動的なシステム停止」を支援する新サービス
ITmedia NEWS SNS
インフォメーション
注目情報をチェック
ITmediaNEWSをフォロー
あなたにおすすめの記事PR