Raspberry Pi Pico(d_08)AHT10 温度・湿度センサ
AHT10 温度・湿度センサ(I2C)
AHT10は温度・湿度センサです。I2C通信で制御します。Raspberry Pi PicoでAHT10を使ってみました。
※micro:bitの記事e_46からPiPicoで使えるように追記、修正しました。
外観
AHT10モジュールの外観です。写真の状態ではスレーブアドレスは0x38です。チップ抵抗を空き側に付けるとスレーブアドレスが0x39に変更できるようですが定かではありません。
接続図
AHT10の動作電圧は1.8~3.6Vです。Raspberry Pi Picoの3.3V電源が使えます。
以下のように接続しました。
I2C通信はGP10(I2C1 SDA)、GP11(I2C1 SCL)を使いました。
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が動作範囲になっています。
※計算式はデータシートから抜粋
スクリプト
スクリプトは以下のようにしました。
※開発環境は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を使って温湿度の測定ができました。