稼働中

マイクロビット(e_52)HTU21D 温湿度センサー

HTU21D モジュール

HTU21Dセンサーモジュール HW-220は、湿度と温度の測定ができます。 I2C通信で出力します。

外観

HTU21Dモジュールの外観です。
HTU21DHTU21D

実体図

HTU21DモジュールのVCC(3.3V)、GND、SDA、SCLをmicro:bitに接続するだけです。そのため接続図は省略します。I2Cは初期値のまま使うので、micro:bitのピンはsda=pin20, scl=pin19です。
VCCはDC 3.3Vで良いのでmicro:bitから供給します。
以下は実体図です。
実体図

データシート抜粋

作成したスクリプトに係わるデータシートの主要な部分を抜粋しました。※詳細はデータシートを参照ください
HTU21DのI2Cで使うコマンドは下表です。測定モードのNo Hold master2つはスクリプトでは使ってません。
command
Command表
※データシートから抜粋、赤枠は追記

下図は、HTU21DのI2Cでのデータのやり取りを示しています。読取った測定データ(LSB)のStatusは測定タイプを返しています。‘0’: temperature, ‘1’: humidityです。
後にデータを温度、湿度に変換する際には不要になります。そのため、’00’にした値で温度、湿度を算出します。
I2Cフォーマット
※データシートから抜粋、赤枠は追記

User registerは以下のようになっています。bit7,0で測定分解能(resolution)を変更できます。
User registe
※データシートから抜粋、赤枠は追記

MSB、LSBのデータを下の計算式で変換して各温度、湿度を求めます。分解能に関係無く下の計算式です。
変換計算式
※データシートから抜粋、加工

スクリプト

スクリプトは以下のようにしました。※thonny-microbitのMicroPythonを使っています。


htu21d_test_02b.py
from microbit import *
# HTU21D Device digital humidity sensor with temperature output by MEAS
# HTU21D slave address hex(64)='0x40'
addr=0x40
#i2c.init(freq=100000, sda=pin20, scl=pin19) #100kHz
i2c.init()   
## soft reset    
def HTU_reset():
    buf=bytearray(1)
    buf[0]=0xfe      # cmd 0xfe soft reset
    i2c.write(addr,buf)
# write user register
def write_user_regi(dat):
    buf=bytearray(2)
    buf[0]=0xe6      # cmd 0xe6 write user register
    buf[1]=dat
    i2c.write(addr,buf)
# read user register
def read__user_regi():
    buf=bytearray(1)
    buf[0]=0xe7      # cmd 0xe7 read user register
    i2c.write(addr,buf)
    r_dat=i2c.read(addr,1) #user reg data
    #print('user_reg=', bin(r_dat[0]))
    return r_dat

# read register State(8)hum(20)temp(20) 6bytes
def HTU_temp():
    buf=bytearray(1)
    buf[0]=0xe3      # cmd 0xe3 trigger temperature mesurement-hold master
    i2c.write(addr,buf)    
    r_dat=i2c.read(addr,3) #msb,lsb,crc
    raw=(r_dat[0]<<8 | r_dat[1]) & 0xfffc
    sta=r_dat[1] & 0x02          # status temp='00'
    #print('t_dat=',r_dat, raw, sta )
    temp= -46.85 + 175.72 * raw / 2**16
    #print('temp=', temp)
    return temp,sta

def HTU_humi():
    buf=bytearray(1)
    buf[0]=0xe5      # cmd 0xe5 trigger humidity mesurement-hold master
    i2c.write(addr,buf)    
    r_dat=i2c.read(addr,3) #msb,lsb,crc
    raw=(r_dat[0]<<8 | r_dat[1]) & 0xfffc
    sta=r_dat[1] & 0x02          # status humi='10'
    #print('t_dat=',r_dat, raw, sta )
    humi= -6.0 + 125.0 * raw / 2**16
    #print('humi=', humi)
    return humi,sta
# Measurement resolution RH Temp(bit) 
#'00' 12bit 14bit default 14 16ms(typ max)
#'01'  8bit 12bit 2 3ms
#'10' 10bit 13bit 4 5ms
#'11' 11bit 11bit 7 8ms
# resolution user_register  
def HTU_res(s_dat='00'): 
    a=s_dat
    #0b01111110 hex(126)'0x7e'
    dat= (read__user_regi()[0] & 0x7e) | int('0b'+a[0]+'0'*6+a[1])
    #print(bin(dat))    
    write_user_regi(dat)

## MAIN -----------------------
temp,t_status = HTU_temp()          # 温度測定
print('temp',temp,t_status)
#print('temp',HTU_temp()[0])        # これでも同じ

humi,h_status = HTU_humi()          # 湿度測定
print('RH%',humi,h_status)

print(bin(read__user_regi()[0]))    # bytearray(1)のデータなので[0]になる

HTU_res('01')                       # resolution RH(8bit)Temp(12bit)
print(bin(read__user_regi()[0]))

HTU_reset()                         # soft reset
print(bin(read__user_regi()[0]))

実行結果

Thonnyのshellに表示されたデータです。


>>> %Run htu21d_test_02b.py
temp 30.006 0           # 温度、status='0'
RH% 52.2581 2           # 湿度、status='1'
0b10        # user_register default
0b11        # user_register RH(8bit)Temp(12bit)
0b10        # user_register soft reset 
>>> 

まとめ

micro:bitでノックセンサーKY-031の動作を確認できました。