Raspberry piで温度,湿度,気圧を記録する

前回,Raspberry piでセンサーデータを取得し,ローカルとGoogle スプレッドシートに記録してData Studioで表示するプログラムを用意しました.1週間程度動かしていますが,順調にデータを蓄積しています.そうなると他のセンサーをつないでみたくなるものでして,部品箱を漁ってみると,もう10年くらい前に秋月電子通商で購入した温湿度を測定できるAM2320と温度と気圧を測定できるSCP1000-D01がありました.今回はこれらのセンサーデータを取得して,先のプログラムで記録できるようにしたいとおもいます.

AM2320はI2C,SCP1000-DO1はSPIという異なる通信方式を利用していて,そこから理解する必要がありました.まずはブレッドボードを使ってRaspberry piとつないでみます.

幸い,AM2320は以前C言語で書かれたライブラリを使用してデータ取得を試したことがありました.今回はPythonでコーディングしてデータを取得しています.インターネット上に参考となるソースコードがたくさんありましたので,それらを使わせていただきました.

難しかったのはSCP1000-D01で,こちらはRaspberry piで利用した情報が少なく,自分でコードを書き起こす必要がありました.SCP1000-D01のデータシートと,PythonでSPI通信を利用するときに使えるspidevライブラリの仕様書とにらめっこして次のようなサンプルプログラムを作りました.

import spidev

# register address
tempout_addr = 0x21 << 2
datard8_addr = 0x1f << 2
datard16_addr = 0x20 << 2

# inisital setteings
spi = spidev.SpiDev()
# BUS 0, CS 0
spi.open(0,0)
# speed 500kHz
spi.max_speed_hz = 500000
# mode
spi.mode = 3

# set high resolution measurement mode
spi.xfer2([0x0e,0x0a])

# get temperature data
read_temp = spi.xfer2([tempout_addr,0,0])
raw_temp = (read_temp[1] << 8) | read_temp[2]

# check B13 = 0 or 1
if raw_temp >= 8192:
    temp = (raw_temp - 16384) / 20
else:
    temp = raw_temp / 20

# get atmospheric pressure data
pres_msb = spi.xfer2([datard8_addr,0])
pres_lsb = spi.xfer2([datard16_addr,0,0])
raw_pres = (pres_msb[1] << 16) | (pres_lsb[1] << 8) | pres_lsb[2]
pres = raw_pres / 4 / 100

spi.close()
print (temp, "'C,", pres, "hPa")

これを実行すると,「24.95 ‘C, 993.9525 hPa」のように測定結果が得られました.もっと上手で”正しい”方法があるかもしれません.ご存知の方は教えて下さい.

初期設定のあとに高精密測定モードにセットしています.このモードでは,気温のデータが14 bit,気圧のデータが19 bitで出力されます.
気温のデータは,TEMPOUTのアドレスに3 byteのデータを送信すると3 byteのデータが返ってきます.そのうち,後ろの2 byteの下位14 bitが気温のデータになります.データビットの最上位は符号の情報なので,場合分けして負の温度も出力できるようにしています.
気圧のデータは,上位ビットがDATARD8,下位ビットがDATARD16に格納されています.それぞれの下位8bitと16bitを読み出して19 bitのraw dataを成形し,hPaの形式で出力させています.

最終的に,読みだしたデータを前回のGoogle スプレッドシートへ送信するプログラムの様式に再構成しています.

しっかり記録されています.スマートフォンや他の気圧センサーの値と比較してみましたが,概ね同じような値となっていました.

順調に機能を拡張できていて,他のセンサーを試してみたくなってしまいますね!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA