マイクロビット(e_52)HTU21D 温湿度センサー
HTU21D モジュール
HTU21Dセンサーモジュール HW-220は、湿度と温度の測定ができます。 I2C通信で出力します。
外観
実体図
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
※データシートから抜粋、赤枠は追記
下図は、HTU21DのI2Cでのデータのやり取りを示しています。読取った測定データ(LSB)のStatusは測定タイプを返しています。‘0’: temperature, ‘1’: humidityです。
後にデータを温度、湿度に変換する際には不要になります。そのため、’00’にした値で温度、湿度を算出します。
※データシートから抜粋、赤枠は追記
User registerは以下のようになっています。bit7,0で測定分解能(resolution)を変更できます。
※データシートから抜粋、赤枠は追記
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の動作を確認できました。