稼働中

マイクロビット(e_46)AHT10 温度・湿度センサー

AHT10 (I2C) 温度・湿度モジュール

AHT10は温度・湿度センサです。I2C通信で制御できます。AHT10モジュールをmicro:bitで使ってみました。

外観

AHT10モジュールの外観です。
写真の状態ではスレーブアドレスは0x38です。AHT10のADR(pin1)がGNDになっていると思われます。
チップ抵抗を空き側に付けるとスレーブアドレスが0x39に変更できるようです。AHT10のデーターシートには記載がありません。たぶんAHT10のADR(pin1)をVsにすると変更できるのだと思います。
AHT10モジュール外観

接続例

接続例
※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~

command
※ AHT10のデータシートから抜粋

State

状態を示す8bitのStateレジスタがあるようです。測定Modeがあるようですが、変更方法は分かりません。
State
※ AHT10のデータシートから抜粋

測定モード

測定するには下図のようにTrigger mesurementコマンド’0xac’に続けて0x33(0b00110011)と0x00を送信します。
Trigger
※ AHT10のデータシートから抜粋

データの読出し

データの読出しは特にレジスタを指定せずにそのままで読出します。Stateデータ(8bit)、湿度データ(20bit)、温度データ(20bit)の計6bytesを読み出します。
湿度、温度データは読み出したデータを整理して20bitにする必要があります。
Read

※ AHT10のデータシートから抜粋

Soft Reset

Soft ResetするにはSoft Resetコマンド’0xba’を送信します。
※下図のI2Cアドレス図はたぶん間違っていると思います。上の測定モードのアドレス値だと思います。
ちなみにデータシートにはinitializationの送信例がないのですが、たぶんSoft Resetと同じでコマンド送信だけだと思います。
Reset

※ AHT10のデータシートから抜粋

計算式

読み出した温度、湿度のデータは20bitに整理した後に以下の計算式で変換します。マイナスの温度は計算式に-50があるので符号計算しなくてよいようです。データシートでは-40~85℃、0~100%RHが動作範囲になっています。
RH%計算式
TC計算式

※ 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モジュールを使って温湿度の測定が出来ました。やや不確かな点が残りましたが、温湿度は測定できていると思います。