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回実行してみました、全て正しくデータが取得されています。
上記のプログラムをライブラリー化する(2025 2月)
ライブラリーとして呼び出して使えるように少し変更してみました。
from machine import Pin, I2C
import time
import utime
class Data_dht20:
address=0x38
def __init__(self, id1=0,scl_pin = 1,sda_pin = 0):
self.i2c = I2C(id1,scl=Pin(scl_pin),sda=Pin(sda_pin),freq=200000)
def crc8(self,bytlist):
crc=0xFF
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(self):
time.sleep(0.05)
addr = self.i2c.scan()
#print( "address is :" + str(addr) )
ret=self.i2c.readfrom_mem(self.address,0x71,1)
#print(ret)
set1 = [0xAC, 0x33, 0x00]
buff = bytearray(set1)
self.i2c.writeto(self.address, buff)
time.sleep(0.1)
data=[]
data = self.i2c.readfrom(self.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 = self.crc8(dat1)
a2=(data[6])
return hum,tmp,a1,a2
使いかた
例、ラズベリーパイのフォルダーにLib_dht20.pyの名前で保存し、下記のように呼び出して使います。
from Lib_dht20 import Data_dht20
abc=Data_dht20() # id1=0,scl_pin = 1,sda_pin = 0 指定しないときデフォルト値 変更できます
ddd=abc.dht20()
print(ddd)
少し使いやすくなったような気がします。