Raspberry Pi PicoでI2Cを使う方法【SHT31から温湿度を読み取る】
以前、ArduinoでI2C制御する方法について解説しました。
今回はラズピコ(Raspberry Pi Pico)を使ってI2Cデバイスを制御するMicroPythonのプログラミング方法を説明していきます。
今回も温湿度センサー:SHT31の値を読み取ってみようと思います。
Raspberry Pi Pico、MicroPythonの環境構築についてはこちらをご覧ください。
接続図
ラズピコをマスター、SHT31をスレーブとして使います。
接続は4本だけ。
電源、GND、そしてGPIO4をSDA、GPIO5をSCLに接続します。
MicroPythonのコード
プログラム全体は次のようになります。
from machine import Pin, I2C
import utime
#スレーブアドレス
addr = 0x45
#SCLピン=IO5,SDAピン=IO4,周波数=100kHz
i2c = I2C(0,scl=Pin(5), sda=Pin(4), freq=100000)
#ソフトリセット
i2c.writeto_mem(addr, 0x30, b'\xA2')
utime.sleep(0.5)
#ステータスレジスタクリア
i2c.writeto_mem(addr, 0x30, b'\x41')
utime.sleep(0.5)
#内部ヒーターOFF
i2c.writeto_mem(addr, 0x30, b'\x66')
utime.sleep(0.5)
while True:
#クロック・ストレッチ無効,繰り返し精度レベル高
i2c.writeto_mem(addr, 0x24, b'\x00')
utime.sleep(0.5)
#0x00から6バイト分読み出し
data = i2c.readfrom_mem(addr, 0x00, 6)
#温湿度の計算
temperature = -45.0 + (175.0 * ((data[0] * 256.0) + data[1]) / 65535.0)
humidity = (100.0 * ((data[3] * 256.0) + data[4])) / 65535.0
print('温度: %-3.1f℃' % temperature, end=' ')
print('湿度: %-3.1f%' % humidity)
utime.sleep(1)
ポイントとなる部分について解説していきます。
I2Cの設定
1行目でI2C用のモジュールを読み込んでいます。
8行目でピンの設定と周波数の設定を行っています。
idは0か1で指定し、使用するGPIOによって決まります。
id | sda | scl |
---|---|---|
0 | GPIO0 | GPIO1 |
1 | GPIO2 | GPIO3 |
0 | GPIO4 | GPIO5 |
1 | GPIO6 | GPIO7 |
0 | GPIO8 | GPIO9 |
1 | GPIO10 | GPIO11 |
0 | GPIO12 | GPIO13 |
1 | GPIO14 | GPIO15 |
0 | GPIO16 | GPIO17 |
1 | GPIO18 | GPIO19 |
0 | GPIO20 | GPIO21 |
1 | GPIO22 | GPIO23 |
書き込み
11行目から、SHT31の初期設定を書き込んでいます。
スレーブの指定したメモリへの書き込みの型は次のようになります。
i2c.writeto_mem(addr, memaddr, buf)
addr | スレーブ機器のアドレス |
---|---|
memaddr | スレーブのメモリアドレス |
buf | 書き込む情報。バイト型のみ。 |
11行目のソフトリセットを例に挙げます。
データシートの記載は次のようになっています。
したがって、memaddr=0x30、buf=b’\xA2’と記載します。
読み取り
28行目でデータの読み取りを行っています。
スレーブの指定したメモリからの値の読み取りの型は次のようになります。
i2c.readfrom_mem(addr, memaddr, nbytes)
addr | スレーブ機器のアドレス |
---|---|
memaddr | スレーブのメモリアドレス |
nbytes | 何byte読み込むかを指定 |
測定データは下図のように6バイトで読み出されるので、nbytes=6としています。
実行結果
ラズピコとスマホを接続して動作させました。
Serial USB Terminalというアプリを使って、ラズピコからシリアル出力した温湿度を表示させています。
スマホからラズピコへ電源供給&シリアルモニター
かなり便利✨#RaspberryPi pic.twitter.com/ViYzZJxI7C— りょうのすけ (@ryo_analog) December 4, 2022
次は、モニタした湿度をフィードバックして、部屋の湿度が一定になるように加湿器をコントロールしてみます。