稼働中

Raspberry Pi Pico(s_06)AHT10 用モジュール

AHT10 AHT10c.py

AHT10はデジタル温湿度センサーです。※詳細はAHT10のデータシートを参照ください。
(詳細は記事d_08を参考にしてください。)
AHT10センサーモジュールで使う自作の’AHT10c.py’を作成しました。記事d_08を元に作成しています。
使い方だけを記載します。’AHT10c.py’は末尾にあります。

使い方

■ファイル転送
Raspberry Pi Picoへ’AHT10c.py’を送った後でimportして使います。
※AHT10c.pyの末尾に、使用例(AHT10_ex.py)の## example以降をコピペ追加しても動作確認できます。
■メソッド
‘AHT10c’をimportすると「aht_init、aht_rest、aht_trig、aht_calc、aht_stat、r_reg」のメソッドが使えるようになります。
AHT10(AHT10(I2C_num,sda_pin)で初期化します。
I2C_num:Raspberry Pi PicoのI2C番号の0,1
sda_pin:使用するI2C_numのSDAで使うGPIO番号(SCLはSDA_GP番号+1で算出)
(01)aht_init()
AHT10を初期化します。初期化コマンド’0xe1’を送ります。
(02)aht_rest()
AHT10をソフトリセットします。初期化コマンド’0xba’を送ります。
(03)aht_trig()
温湿度を測定します。トリガコマンド’0xac’を送ります。
(04)aht_calc()
温湿度の計算して、温度、湿度の値を返します。
(05)aht_stat()
State bitを返します。Busy, Mode, CALの状態を返します。
(06)r_reg()
読み出した6bytesアレイデータを返します。

使用例

AHT10で温湿度を測定します。


AHT10c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#from machine import I2C,Pin
#import time
from AHT10c import AHT10
# AHT10 Temperature and Humidity Sensor
## exapmle -----------------------------------------
a=AHT10(1,10)       # instance (I2C_num,sda)
a.aht_init()        # AHT10 initialization
a.aht_rest()        # soft-reset
a.aht_trig()        # trigger measurement

humi,temp = a.aht_calc()       # 温湿度 >> T,RH%
print('RH%=',humi,'TC=',temp)

bus,mod,cal=a.aht_stat()    # state-data  Bit[3]calibrated='1'
print('bus,mod,cal=',bus,mod,cal)

print(a.r_reg())            # 6bytearray

a.aht_rest()                # softreset
print(a.r_reg())            # 6bytearray

実行結果
実行すると以下のようになりました。※Thonnyのshellに表示されます。


>>> %Run -c $EDITOR_CONTENT
RH%= 65.13443 TC= 23.27271      # 湿度、温度
bus,mod,cal= 0 0 1              # Free, NOR mode, calibrated
b'\x1c\xa6\xbe\x85\xdc\xa0'     # 6byteデータ
b'\x18\x00\x00\x00\x00\x00'     # 6byteデータ(softreset後)
>>> 

AHT10モジュール用


AHT10c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from machine import I2C,Pin
import time
class AHT10:
    def __init__(self,num,sda):
        # AHT10 Temperature and Humidity Sensor
        # slave address hex(56)='0x38'
        self.addr=0x38
        self.i2c=I2C(num, scl=Pin(sda+1), sda=Pin(sda), freq=400_000)

    def aht_init(self):
        # initialize 0xe1  power on 20msec~
        time.sleep_ms(100)
        buf=bytearray(1)
        buf[0]=0xe1
        self.i2c.writeto(self.addr,buf)
        time.sleep_ms(100)

    def aht_rest(self):
        # soft reset 0xba  20msec~
        buf=bytearray(1)
        buf[0]=0xba
        self.i2c.writeto(self.addr,buf)
        time.sleep_ms(100)

    def aht_trig(self):
        # trigger mesure 0xac 0x33 0x00 75msec~
        buf=bytearray(3)
        buf[0]=0xac
        buf[1]=0x33
        buf[2]=0x00
        self.i2c.writeto(self.addr,buf)
        time.sleep_ms(100) 
        return

    # read-data  6byte data read    
    def r_reg(self):
        # read register State(8)hum(20)temp(20)  6bytes
        dat=self.i2c.readfrom(self.addr,6)
        return dat

    def aht_calc(self):
        dat=self.r_reg()
        h_dat= ((dat[1]<<16)|(dat[2]<<8)|(dat[3])) >>4
        t_dat= ((dat[3] &0x0f)<<16)|(dat[4]<<8)| dat[5]

        self.humi=(h_dat/2**20)*100     # %
        self.temp=(t_dat/2**20)*200-50  # ℃
        return self.humi,self.temp
        
    def aht_stat(self):
        # state bit
        dat=self.r_reg()
        self.bus= (0x80 & dat[0])>>7
        self.mod= (0x60 & dat[0])>>5
        self.cal= (0x08 & dat[0])>>3
        return self.bus, self.mod, self.cal