稼働中

Raspberry Pi Pico(s_03)DHT11 用モジュール

DHT11 DHT11c.py

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

使い方

■ファイル転送
Raspberry Pi Picoへ’DHT11c.py’を送った後でimportして使います。
※DHT11c.pyの末尾に、使用例(DHT11_ex.py)の## example以降をコピペ追加しても動作確認できます。
■メソッド
‘DHT11c’をimportすると「meas」のメソッドが使えるようになります。
DHT11(pin_num)で初期化します。
DHT11の出力と接続するGPIOの番号を指定します。defaultは22(GP22)です。
(01)meas()
DHT11で測定した5バイト(40bit)のデータと測定した回数をリストで返します。
※繰返し間隔を2秒にしているので遅いです。測定した回数は概ね2の値になります。

使用例

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


DHT11c_ex.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from DHT11c import DHT11
## exapmle
# DHT11で温湿度を測定
a=DHT11(22)               # instance GPIO22 DATA-PIN
r_data, num_meas=a.meas() # meas() 40bit-data,num_count
print('40bit-DATA=',r_data)
print('num measure=',num_meas)
print('HumidityRH%=',r_data[0]) #r_data[0] 湿度
print('Temperature=',r_data[2]) #r_data[2] 温度

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


>>> %Run -c $EDITOR_CONTENT
40bit-DATA= [50, 0, 27, 1, 78]      # RH0,RH1,T0,T1,CK
num measure= 2      #2回目(1回目はエラー)
HumidityRH%= 50     #湿度50%
Temperature= 27     #摂氏27℃
>>> 

DHT11モジュール用


DHT11c.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
from machine import Pin, time_pulse_us
import time
## クラス化>>モジュール dht11c.pyに
##Temperature and humidity module DHT11
class DHT11:
    def __init__(self,pin=22):
        # init Pin(22) out 'H'
        self.pio=pin
        Pin(self.pio, mode=Pin.OPEN_DRAIN, pull=Pin.PULL_UP)
        sig=Pin(self.pio,Pin.OUT)
        sig.value(1)
    # 8ケの'0','1'リストデータをbin 0b_xxxx_xxxxにする
    def b_data(self,l_data):
        b='0b'
        for s in l_data:
            b = b+str(s)
        return b

    # 開始信号 HOST OUT'0' 18msec<
    def start_sig(self):
        sig=Pin(self.pio,Pin.OUT)
        sig.value(1)
        time.sleep(2) # 繰返し周期は2sec<=
        sig.value(0)
        time.sleep_ms(18) # 18ms<  NG(10ms)
        sig.value(1)
        #Pulled up to waite 20-40us
        time.sleep_us(20)

    # 受信データ パルス幅測定 recive 1 + 40bit data 
    def dat_recive(self):
        cnt=0
        dat=[]
        sig=Pin(self.pio,Pin.IN)
        while True:
            # measurepulse width 200us< timeout error -1
            d = time_pulse_us(Pin(22),1,200)
            if d==-1:
                #print(d,Pin(22))
                break
            dat.append(d)
            cnt=cnt+1
        return cnt,dat

    # 開始信号 HOST OUT'1' 18msec<
    def start_sig(self):
        sig=Pin(self.pio,Pin.OUT)
        sig.value(1)
        time.sleep(2) # 繰返し周期は2sec<=
        sig.value(0)
        time.sleep_ms(18) # 18ms<  NG(10ms)
        sig.value(1)
        #Pulled up to waite 20-40us
        time.sleep_us(20)

    # 測定 DTH11 mesuare (mesuare-main) 
    def meas(self):
        e_cnt=0
        while True:
            e_cnt=e_cnt + 1          # 測定回数
            #print('e_cnt=',e_cnt)
            self.start_sig()
            cnt,data = self.dat_recive()
            #print(cnt,data) 
            
            # 41 data recived  41 != retry
            if cnt==41:
                r_bit=[]
                # pulsewidth data >> '0'or'1' list data
                for i in data:
                    if 20 < i <=28:
                        r_bit.append(0)
                    if 68 <= i <=72:
                        r_bit.append(1)
                    else:
                        pass
                # 40 list-data   40 != retry
                if len(r_bit)==40:        
                    # 8bitにスライスする
                    h0=r_bit[0:8]
                    h1=r_bit[8:16]
                    t0=r_bit[16:24]
                    t1=r_bit[24:32]
                    cs=r_bit[32:40]

                    # リストデータをbin 0b_xxxx_xxxxに変換する
                    b_h0=int(self.b_data(h0))
                    b_h1=int(self.b_data(h1))
                    b_t0=int(self.b_data(t0))
                    b_t1=int(self.b_data(t1))
                    
                    b_cs=int(self.b_data(cs))
                    
                    r_list=[b_h0, b_h1, b_t0, b_t1, b_cs]
                    # calculate check sum 
                    c_sum=b_h0+b_h1+b_t0+b_t1

                    if c_sum ==b_cs:
                        return r_list,e_cnt #RH,T,Csum, count
            # 5回エラーで測定中止               
            if e_cnt >=5:
                return print('Error',e_cnt)