さて、GLCDもある程度やり尽くしたので、新しいデバイスを使用することにしました。
温湿度計AM2320です。
設置。
配線はこんな感じ。
このデバイスはI2Cバスを使用して温湿度を取得することができます。
I2Cバスってなんぞや?ということなんですが、SDL/SDAの2ピンを使ってデータを送受信できるみたいです。
具体的には、SDLにクロック信号と組み合わせてSDAにデータを送信して・・・
って難しいことを考えなくても、ラズパイにはI2Cに対応したモジュール・ライブラリがあるんです。
ちょっと設定を弄るんですけどね。
こちらのサイトを参考にさせて頂きました。
https://qiita.com/twinoze/items/c960eea23c57e342ea4b
先人の知恵を借りるのは大事。
sudo raspi-config
でコンフィグメニューが出るので、
これでI2Cが有効になります。
i2cdetect -y 1
5cと表示できれば認識しているとのことです。
が、100%認識できるかというと、大体50%ぐらいの確立で認識できないケースがありました。
バスリピータを使えば回避できるとのことですが、こう何度も発注を繰り返すと送料が高く付いてしまうので、プログラム側で回避することにしました。
このようにサンプルコードを作成しました。
import time
import smbus
i2c = smbus.SMBus(1)
address = 0x5c
loop = True
block = []
while loop:
try:
i2c.write_i2c_block_data(address, 0x00,[])
i2c.write_i2c_block_data(address, 0x03,[0x00, 0x04])
time.sleep(0.05)
block = i2c.read_i2c_block_data(address, 0, 6)
loop = False
except IOError:
pass
hum = block[2] << 8 | block[3]
temp = block[4] << 8 | block[5]
print('hum : ' + format( hum/10) + ' %Rh')
print('temp: ' + format(temp/10) + ' digC')
smbusというライブラリを使えば、I2Cバスへのアクセスが簡単になります。
タイミングチャートとか意識する必要なく、全部ライブラリでやってくれます。
やるべきことは、
- 初期化
- ファンクションコード0x03にスタートアドレスとレジスタ数を書き込み
- データを読み取り
これだけ。
これはデータシートにある、
この部分に合致しています。
そして、I2Cにアクセスできない場合がある問題はtry/catch処理で回避させました。
エラーが発生したら、アクセスが成功するまで再試行を繰り返します。
これで100%アクセスに成功できます。
さて、次回はこれをライブラリ化させてGLCDに表示させましょうか。