温湿度センサー 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)

実行結果:
f:id:ti-nspire:20180611163305p:plain