e-DIY
センサー

Raspberry Pi PicoでI2Cを使う方法【SHT31から温湿度を読み取る】

raspberry pi picoでSHT31から温湿度を読み取る

以前、ArduinoでI2C制御する方法について解説しました。

今回はラズピコ(Raspberry Pi Pico)を使ってI2Cデバイスを制御するMicroPythonのプログラミング方法を説明していきます。
今回も温湿度センサー:SHT31の値を読み取ってみようと思います。

Raspberry Pi Pico、MicroPythonの環境構築についてはこちらをご覧ください。

接続図

ラズピコをマスター、SHT31をスレーブとして使います。
接続は4本だけ。
電源、GND、そしてGPIO4をSDA、GPIO5をSCLに接続します。

I2Cの接続

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としています。

SHT31の測定データ

実行結果

ラズピコとスマホを接続して動作させました。
Serial USB Terminalというアプリを使って、ラズピコからシリアル出力した温湿度を表示させています。

次は、モニタした湿度をフィードバックして、部屋の湿度が一定になるように加湿器をコントロールしてみます。

関連キーワード

フリーワード検索