温度湿度センサーDHT20をラズベリーパイPicoで使う

DHT20をラズベリーパイPicoで使う

DHT-20 は 秋月電子 などで安価で簡単に入手でき、また I 2 C 接続で配線も簡単、 電子工作入門にはとってもいいセンサーだと思います。
これからラズベリーパイ ピコを使って、温度 湿度センサー DHT-20 の使い方を、説明したいと思います。使用するプログラム言語はマイクロパイソンになります。

環境

  • DHT-20
  • ラズベリーパイPico
  • ブレッドボード (配線するのに便利です)
  • Windowsパソコン

接続図

今回の接続はSDAをGPO0ピン SCLをGPO1ピンに接続しました。

DHT-20仕様

  • 測定湿度 0 ~ 100 %
      温度 -40 ~ 80 度
  • 電源 2.2 ~ 5.5
  • インターフェース  i2c スレーブアドレス (0x38)
  • 精度 湿度: ±3% 温度: ±0.5℃
  • 推奨測定間隔 2秒

DHT-20使い方

電源投入
0.1秒待つ
ステータスチェック
測定トリガーコマンド 3バイト送信 [0xAC, 0x33, 0x00]
0.1秒待つ
7バイト受信 [0] [1] [2] [3] [4] [5] [6]   [6]はcrcバイト
湿度 [1] + [2] + [3]の上位4ビット 合計20ビットに変換
温度 [3] の下位4ビット + [4] + [5] 合計20ビットに変換
湿度 物理変換
温度 物理変換

プログラム

from machine import Pin, I2C
import time
def crc8(bytlist):
    crc=0xFF  #crc初期値DHT20
    poly = 0x31
    for i in bytlist:
        crc ^= i
        for indx in range(8):
            if crc & 0x80:
                crc = ((crc << 1) & 0xFF) ^ poly
            else:
                crc = ((crc << 1) & 0xFF)
    return crc
def dht20():
    time.sleep(0.05)
    i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)
    addr = i2c.scan()
#     print( "address is :" + str(addr) )
    address=0x38
    ret=i2c.readfrom_mem(address,0x71,1)
#     print(ret)
    set = [0xAC, 0x33, 0x00]
    buff = bytearray(set)
    i2c.writeto(address, buff)
    time.sleep(0.1)
    data=[]
    data = i2c.readfrom(address,7)
    hum = data[1] << 12 | data[2] << 4 | ((data[3] & 0xF0) >> 4)
    tmp = ((data[3] & 0x0F) << 16) | data[4] << 8 | data[5]
    hum = hum / 2**20 * 100
    tmp = tmp / 2**20 * 200 - 50
    dat1=data[0:6]
    a1 = crc8(dat1)
    a2=(data[6])
    return hum,tmp,a1,a2
print(dht20())

プログラムを簡単に説明します。

def crc8(bytlist):
crc=0xFF #crc初期値DHT20
poly = 0x31
for i in bytlist:
crc ^= i
for indx in range(8):
if crc & 0x80:
crc = ((crc << 1) & 0xFF) ^ poly
else:
crc = ((crc << 1) & 0xFF)
return crc
crc計算関数です

生成多項式は 1 + x^4 + x^5 + x^8 => B100110001 => 0x31


i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=200000)
scl sda ピン設定 周波数200KH (100KH ~400KH)

ret=i2c.readfrom_mem(address,0x71,1)
初期化のチェック、必要かどうかよくわかりません,通常正しく値が返ってきます。

set = [0xAC, 0x33, 0x00]
buff = bytearray(set)
i2c.writeto(address, buff)
測定開始データーをバイトアレイで格納し3バイト0番地から書き込みます、バイト型でないとマイクロパイソンは書き込みできません。

data = i2c.readfrom(address,7)
0番地から7バイト受信します。

hum = data[1] << 12 | data[2] << 4 | ((data[3] & 0xF0) >> 4)
tmp = ((data[3] & 0x0F) << 16) | data[4] << 8 | data[5]
湿度 [1] + [2] + [3]の上位4ビット 合計20ビットに変換
温度 [3] の下位4ビット + [4] + [5]合計20ビットに変換


hum = hum / 2**20 * 100
tmp = tmp / 2**20 * 200 – 50
湿度 物理変換
温度 物理変換


dat1=data[0:6] 6バイトのデータ配列
a1 = crc8(dat1)  crcチェック

return hum,tmp,a1,a2
湿度 温度 crc計算結果 DHT-20のcrcの値 を返します

実行結果

for文で今回2秒おきに5回実行してみました、全て正しくデータが取得されています。

タイトルとURLをコピーしました