温湿度センサー HTU21D / 温度と湿度とを測る / micro:bit / MicroPython
I2C の write 操作 (マスターからスレーブへのデータ転送) は
microbit.i2c.write(スレーブアドレス, バイト列)
という構文で行う。スレーブアドレスは 7 ビットのまま指定する。microbit.i2c.write() メソッドが自動的に左に 1 ビットシフトしてくれる。さらにビット 0 に自動的に 0 を入れてくれる。バイト列は以下の例では bytes() で作ったが bytearray() でもよい。bytes() で作った場合は tuple と同じで変更はできない。そのまま b'......'、bytearray(b'......') という形で指定できるものならしてみるがよい。
I2C の read 操作 (スレーブからマスターへのデータ転送) は
microbit.i2c.read(スレーブアドレス, バイト数)
という構文で行う。スレーブアドレスは 7 ビットのまま指定する。microbit.i2c.read() メソッドが自動的に左に 1 ビットシフトしてくれる。さらにビット 0 に自動的に 1 を入れてくれる。
from microbit import * class HTU21D: def __init__(self): self.HTDU21D_ADDRESS = 0x40 self.TRIGGER_TEMP_MEASURE_HOLD = 0xE3 self.TRIGGER_HUMD_MEASURE_HOLD = 0xE5 def readTemp(self): buf = bytes([self.TRIGGER_TEMP_MEASURE_HOLD]) i2c.write(self.HTDU21D_ADDRESS, buf) msb, lsb = i2c.read(self.HTDU21D_ADDRESS, 2) raw = (msb<<8 | lsb) & 0xfffc return -46.85 + 175.72 * raw / 65536.0 def readHumid(self): buf = bytes([self.TRIGGER_HUMD_MEASURE_HOLD]) i2c.write(self.HTDU21D_ADDRESS, buf) msb, lsb = i2c.read(self.HTDU21D_ADDRESS, 2) raw = (msb<<8 | lsb) & 0xfffc return -6.0 + 125.0 * raw / 65536.0 if __name__ == "__main__": HTU = HTU21D() while True: temp = HTU.readTemp() humid = HTU.readHumid() print("%.1f C, %.1f %%" % (temp, humid)) sleep(1000)
実行結果: