2023/03/09
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)