稼働中

Raspberry Pi Pico(d_08)AHT10 温度・湿度センサ

AHT10 温度・湿度センサ(I2C)

AHT10は温度・湿度センサです。I2C通信で制御します。Raspberry Pi PicoでAHT10を使ってみました。
※micro:bitの記事e_46からPiPicoで使えるように追記、修正しました。

外観

AHT10モジュールの外観です。写真の状態ではスレーブアドレスは0x38です。チップ抵抗を空き側に付けるとスレーブアドレスが0x39に変更できるようですが定かではありません。
AHT10モジュール外観

接続図

AHT10の動作電圧は1.8~3.6Vです。Raspberry Pi Picoの3.3V電源が使えます。
以下のように接続しました。
I2C通信はGP10(I2C1 SDA)、GP11(I2C1 SCL)を使いました。
AHT10接続図

AHT10の説明

AHT10のデータ送受信の概略を記載します。※もう少し詳しい説明は、micro:bitの記事e_46を参照ください。
以下のコマンドがあります。


Command              Code
initialization       0b11100001  hex(225) '0xe1'
trigger mesurement   0b10101100  hex(172) '0xac'  75msec~
soft reset           0b10111010  hex(186) '0xba'  20msec~

温湿度を測定するには、以下のように測定トリガを送信後に6bytesデータを読み出します
測定トリガを送ります。
trigger mesurementコマンド’0xac’に続けて0x33(0b00110011)と0x00を送信します。

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

Soft Resetするには、soft resetコマンド’0xba’を送信します。データシートに例の記載がないので不明確ですが、初期化するには、initializationコマンド’0xe1’を送信します。

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

スクリプト

スクリプトは以下のようにしました。
※開発環境はThonnyです。ThonnyでMicroPythonをRaspberry Pi Pico with RP2040にインストールして使っています。


pico_aht10_test_02b.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from machine import I2C,Pin
import time
# AHT10 slave address hex(56)='0x38'
i2c = I2C(1, scl=Pin(11), sda=Pin(10), freq=400_000)
addr=0x38
# initialize 0xe1  power on 20msec~
def aht_init():
    time.sleep_ms(100)
    buf=bytearray(1)
    buf[0]=0xe1             # init command‘0xe1 0b_1110_0001’
    i2c.writeto(addr,buf)
    time.sleep_ms(100)
# soft reset 0xba  20msec~
def aht_rest():
    buf=bytearray(1)
    buf[0]=0xba             # reset command‘0xba’
    i2c.writeto(addr,buf)
    time.sleep_ms(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.writeto(addr,buf)
    time.sleep_ms(100)              # 無いとSTATE busy 75msec~
    return
# read-data  6byte data read
def r_reg():
    dat=i2c.readfrom(addr,6)
    return dat
# データの変換
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       # ℃
    return humi,temp
 
# STATEビット表示
def aht_stat():
    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)
    return bus,mod,cal

# MAIN
aht_init()    # 初期化
aht_rest()    # リセット
aht_trig()    # トリガ

humi,temp=aht_calc()     # read-data >> T,RH%
print('RH%=',humi,'TC=',temp)

bus,mod,cal=aht_stat()  # read-data >> state
print('bus,mod,cal=',bus,mod,cal)

ちなみに
machine.SoftI2Cを使う場合には
SoftI2Cをインポートし、
i2c = SoftI2C(scl=Pin(11), sda=Pin(10), freq=400_000)
で初期化します。

実行結果

結果は以下のようになりました。※ThonnyのShellに表示されます。


>>> %Run -c $EDITOR_CONTENT
RH%= 57.26233 TC= 19.57626
bus,mod,cal= 0 0 1          #State Free,NOR-mode,calibrated
>>> 

電話機に付いている温湿度は60%、20℃でした。どちらが正確なのかは分かりませんが、測定は出来ているようです。

まとめ

Raspberry Pi PicoでAHT10を使って温湿度の測定ができました。