CircuitPython 10行プログラミング Step5 (8) Raspberry Pi PicoのI2C ② 温湿度センサ
I2Cバスには、複数のデバイスをつなげて利用できます。Picoをマスタ、デバイスをスレーブと呼びますが、昨今の用語の使いかたの変更により、将来は呼び方が変わるかもしれません。Picoはマスタが複数いてもかまいませんが、通常一つです。スレーブ・デバイスは複数がつなげられ、スレーブ・アドレスで区別されます。
PicoのGPIO信号レベルは3.3Vなので、スレーブ・デバイスもSCL/SDA信号は3.3Vにします。データ転送速度は通常デフォルトが100kHz、少し速いのが400kHz、Picoは1MHzまで対応しています。
SDA/SCL信号はデフォルトHIGHレベルなので、プルアップしておきます。PicoをC言語のハイレベルAPIでは初期設定時にプルアップ指定をします。CircuitPythonでも、インスタンスを宣言した時点で、プルアップされているようです。推定ですが50kΩぐらいなので、スレーブ・デバイス側に10kΩが入っていても、合成抵抗は十分大きいので、動作に支障は出ないと思われます。
●OLEDディスプレイとセンサをつなげる
AdafruitのSTEMMA QTシリーズは、I2C専用のコネクタが二つついているので、I2Cバスをどんどんつなげて利用するのがとても簡単です。もちろん、ケーブルが長くなって負荷容量が増えるので、何十もつなげれられません。
OLEDボードの端子 | SHTC3ボードの端子 | Picoの端子(GPIO) | 名称 |
---|---|---|---|
GND | GND | GND | GND |
Vcc | Vcc | 3.3V | 3V3(OUT) |
SCL | SCL | GP21 | I2C0 SCL |
SDA | SDA | GP20 | I2C0 SDA |
from board import *
from busio import I2C
i2c = I2C(GP21, GP20)
while not i2c.try_lock():
pass
print('addr 0x{0:x}'.format(i2c.scan()[0]))
print('addr 0x{0:x}'.format(i2c.scan()[1]))
i2c.deinit()
0x3c(OLED)と0x70(SHTC3)を見つけてきました。
●温湿度センサSHTC3のおもなスペック
- 電源電圧 1.62~3.6V
- 湿度 確度±2%RH、分解能0.01%RH
- 温度 確度±0.2℃(0~90)、分解能0.01℃
- インターフェース I2C(0~1MHz)
- スレーブ・アドレス 0x70(固定)
●ライブラリをコピー
ダウンロードしたlibのフォルダからadafruit_shtc3.mpyをCIRCUITPYドライブのlibフォルダにコピーします。
●プログラム
examplesフォルダに入っているshtc3_simpletest.pyを開き、必要な部分を前回のプログラムにコピーします。
I2Cの転送速度を400kHzにしました。
from board import *
import busio
import adafruit_ssd1306
import time
import adafruit_shtc3
i2c = busio.I2C(GP21, GP20, frequency=400_000)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3c)
sht = adafruit_shtc3.SHTC3(i2c)
print('start')
t0 = time.monotonic()
while 1:
display.fill(0)
display.text(str(int(time.monotonic() - t0)), 3, 3, 1)
display.text("Temperature: {:0.1f} C".format(sht.temperature),3,15,1)
display.text("Humidity: {:0.1f} %".format(sht.relative_humidity),3,27,1)
display.show()
time.sleep(3.14)
実行中の様子です。