マイクロビット(e_46)AHT10 温度・湿度センサー
AHT10 (I2C) 温度・湿度モジュール
AHT10は温度・湿度センサです。I2C通信で制御できます。AHT10モジュールをmicro:bitで使ってみました。
外観
AHT10モジュールの外観です。
写真の状態ではスレーブアドレスは0x38です。AHT10のADR(pin1)がGNDになっていると思われます。
チップ抵抗を空き側に付けるとスレーブアドレスが0x39に変更できるようです。AHT10のデーターシートには記載がありません。たぶんAHT10のADR(pin1)をVsにすると変更できるのだと思います。
接続例
※micro:bitのピン配置図は「https://tech.microbit.org/hardware/edgeconnector/」からの引用です。
AHT10の動作電圧は1.8~3.6Vです。micro:bitの電源が使えます。以下のように接続しました。
AHT10モージュールではVoltage Regulatorsで3.3Vにしているようです。別電源で動作させる場合はRegulatorsの規格の6.5Vまで印可できると思います。
micro:bitとAHT10モジュールを接続した実体写真です。
AHT10の説明
AHT10のデーターシートから抜粋して説明します。※下の図表は全てAHT10のデーターシートからの引用です。
Command
以下のコマンドがあります。
Command Code
initialization 0b11100001 hex(225) '0xe1'
trigger mesurement 0b10101100 hex(172) '0xac' 75msec~
soft reset 0b10111010 hex(186) '0xba' 20msec~
State
状態を示す8bitのStateレジスタがあるようです。測定Modeがあるようですが、変更方法は分かりません。
※ AHT10のデータシートから抜粋
測定モード
測定するには下図のようにTrigger mesurementコマンド’0xac’に続けて0x33(0b00110011)と0x00を送信します。
※ AHT10のデータシートから抜粋
データの読出し
データの読出しは特にレジスタを指定せずにそのままで読出します。Stateデータ(8bit)、湿度データ(20bit)、温度データ(20bit)の計6bytesを読み出します。
湿度、温度データは読み出したデータを整理して20bitにする必要があります。
※ AHT10のデータシートから抜粋
Soft Reset
Soft ResetするにはSoft Resetコマンド’0xba’を送信します。
※下図のI2Cアドレス図はたぶん間違っていると思います。上の測定モードのアドレス値だと思います。
ちなみにデータシートにはinitializationの送信例がないのですが、たぶんSoft Resetと同じでコマンド送信だけだと思います。
※ AHT10のデータシートから抜粋
計算式
読み出した温度、湿度のデータは20bitに整理した後に以下の計算式で変換します。マイナスの温度は計算式に-50があるので符号計算しなくてよいようです。データシートでは-40~85℃、0~100%RHが動作範囲になっています。
※ AHT10のデータシートから抜粋
その他、詳細はAHT10データシート等を参照ください。
スクリプト
他のサイトで調べているとinitialization時に 0xE1,0x08,0x00を送信してましたが・・コマンド’0xE1’だけでも動作しているようなので、コマンドだけの送信で記載します。※もし動かない場合はコメントアウト部の方を使ってみて下さい。
測定時のtrigger mesurementは先に示したように、0xac,0x33,0x00を送信します。
※thonny-microbitのMicroPythonを使っています。
from microbit import *
# AHT10 Device
# AHT10 slave address hex(56)='0x38'
addr=0x38
#i2c.init(freq=100000, sda=pin20, scl=pin19) #100kHz
i2c.init()
# initialize 0xe1 power on 20msec~
def aht_init():
sleep(100)
buf=bytearray(1)
buf[0]=0xe1 # init command‘0xe1’
i2c.write(addr,buf)
sleep(100)
# init で (0xe1,0x08,0x00)を送信する場合
#sleep(100)
#buf=bytearray(3)
#buf[0]=0xe1
#buf[1]=0x08
#buf[2]=0x00
#i2c.write(addr,buf)
#sleep(100)
# soft reset 0xba 20msec~
def aht_rest():
buf=bytearray(1)
buf[0]=0xba # reset command‘0xba’
i2c.write(addr,buf)
sleep(100)
# triger get and store data to register
def aht_trig():
# trigger mesure 0xac 0x33 0x00 75msec~
buf=bytearray(3)
buf[0]=0xac # trig command‘0xac’
buf[1]=0x33 # trig data0 ‘0x33’
buf[2]=0x00 # trig data1 ‘0x00’
i2c.write(addr,buf)
sleep(100) # 無いとSTATE busy 75msec~
return
# read-data 6byte data read
def r_reg():
# read data
dat=i2c.read(addr,6)
#print('r_reg=',dat)
return dat
# read register State(8bit)hum(20bit)temp(20bit) 6bytes
# dat[0](state)
# dat[1]dat[2]dat[3][4:7](humidity)
# dat[3][0:3]dat[4]dat[5](temperature)
# データの変換
def aht_calc():
dat=r_reg()
h_dat= ((dat[1]<<16)|(dat[2]<<8)|(dat[3])) >>4
t_dat= ((dat[3] &0x0f)<<16)|(dat[4]<<8)| dat[5] humi=(h_dat/2**20)*100 # % temp=(t_dat/2**20)*200-50 # ℃ print('RH%=',humi,'TC=',temp) # STATEビット表示 def aht_stat(): # state bit #dat=aht_trig() dat=r_reg() bus= (0x80 & dat[0])>>7 # busy(1)free(0)
mod= (0x60 & dat[0])>>5 # NOR(00)CYC(01)CMD(1X)
cal= (0x08 & dat[0])>>3 # calibrated(1)uncalibrated(0)
print('bus,mod,cal=',bus,mod,cal)
# MAIN
aht_init() # 初期化
aht_rest() # リセット
aht_trig() # トリガ測定
#r_reg() # only read-data
aht_calc() # read-data >> T,RH%
aht_stat() # read-data >> state
実行結果
>>> %Run aht10_test_03b.py
RH%= 59.6147 TC= 27.1191
bus,mod,cal= 0 0 1
電話機に付いている温湿度です。どちらが正確なのかは分かりませんがだいたい合っているようです。
aht10_test_03b.pyを実行した後にThonnyのshellで実行しリセット動作を確認しました。
>>> r_reg()
b'\x1c\x98\x9d&+f' # 読み出したデータ
>>> aht_rest() # リセット
>>> r_reg()
b'\x18\x00\x00\x00\x00\x00' # 温湿度のデータはリセットされている
まとめ
micro:bitでAHT10モジュールを使って温湿度の測定が出来ました。やや不確かな点が残りましたが、温湿度は測定できていると思います。