【Raspberry Pi】温湿度センサDHT20を使った気温・湿度計の作り方

家庭菜園などで毎日の気温・湿度データを管理出来たら便利ですよね?

今回はRaspberry Piと温湿度センサDHT20を使った気温・湿度計の作り方について解説します。

こんな人におすすめ!

  • Raspberry Piを活用したい人
  • 温湿度センサの使い方を知りたい人
  • 電子工作初心者の人
目次

準備したもの

  • Raspberry Pi 3 model B
  • 温湿度センサ DHT20
  • ジャンパワイヤ メス-メス
DHT20

回路図

Raspberry Piと温湿度センサDHT20の接続方法は図表の通りです。

DHT20はI2C通信でデータをやり取りできるため、A/Dコンバータは不要となりシンプルですね。

Raspberry PiDHT20
1: 3.3V1: VDD
3: SDA2: SDA
6: GND3: GND
5: SCL4: SCL

温湿度センサ DHT20の仕様

DHT20の仕様は下表の通りです。

測定間隔2秒毎
湿度分解能0.024%RH
湿度精度±3%RH
温度測定範囲-40~80℃
温度分解能0.01℃
温度精度±0.5℃
I2Cアドレス0x38

詳細仕様はデータシートを参照下さい。データシートにはI2C通信方法も記載されています。

サンプルプログラム

まずプログラム全体を記載します。

プログラムは、初期チェック→測定開始→データ読み取り→データ格納→温度・湿度に変換といった流れです。

import smbus
import time

i2c = smbus.SMBus(1)
address = 0x38

trigger = [0xAC, 0x33, 0x00]

dat = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]

#初期チェック
time.sleep(0.1)
ret = i2c.read_byte_data(address, 0x71)

if ret != 0x18:
    exit

try:
    while True:
        #測定開始
        time.sleep(0.01)
        i2c.write_i2c_block_data(address, 0x00, trigger)
        
        #データ読み取り
        time.sleep(0.08)
        dat = i2c.read_i2c_block_data(address, 0x00, 7)
        
        #データ格納
        hum = dat[1] << 12 | dat[2] << 4 | ((dat[3] & 0xF0) >> 4)
        tmp = ((dat[3] & 0x0F) << 16) | dat[4] << 8 | dat[5]
      
        #湿度変換  
        hum = hum / 2**20 * 100
        #温度変換
        tmp = tmp / 2**20 * 200 - 50
        
        print("Humidity: " + str(hum) + "%")
        print("Temperature: " + str(tmp) + "V")
        
        time.sleep(2) 

except KeyboardInterrupt:
    pass

それぞれの処理について解説していきましょう!

初期チェック

time.sleep(0.1)
ret = i2c.read_byte_data(address, 0x71)

if ret != 0x18:
    exit

DHT20に電力供給してから0.1秒後、DH20に「0x71」を送信します。

DHT20から「0x18」が返信されたら初期チェック完了です。

もしDHT20から「0x18」が返ってこなかったらプログラムを終了するようにしました。

測定開始

trigger = [0xAC, 0x33, 0x00]

time.sleep(0.01)
i2c.write_i2c_block_data(address, 0x00, trigger)

10ms待ってから「0xAC」を送信し、温度・湿度の測定を開始します。このパラメータは2バイトで、1バイト目は「0x33」、2バイト目は「0x00」を設定します。

温度、湿度データの読み取り

time.sleep(0.08)
dat = i2c.read_i2c_block_data(address, 0x00, 7)

80ms待ち、温度・湿度測定が完了したら、データを読み取ります。読み取りデータは7バイトです。

湿度データの格納

hum = dat[1] << 12 | dat[2] << 4 | ((dat[3] & 0xF0) >> 4)

湿度データは2バイト目、3バイト目、4バイト目の上位4ビットです。

よって2バイト目のデータを12ビット分左へシフト、3バイト目のデータを4ビット分左へシフト、4バイト目の上位4ビットを4ビット分右へシフトし論理和(OR)演算することで湿度データを繋げることができます。

温度データの格納

tmp = ((dat[3] & 0x0F) << 16) | dat[4] << 8 | dat[5]

温度データは4バイト目の下位4ビット、5バイト目、6バイト目です。

湿度データ同様、4バイト目の下位4ビットを16ビット分左へシフト、5バイト目のデータを8ビット分左へシフト、6バイト目を論理和(OR)演算することで温度データを繋げることができます。

湿度・温度変換

hum = hum / 2**20 * 100
tmp = tmp / 2**20 * 200 - 50

データシートに記載されている通り湿度・温度を変換します。

実際に気温・湿度を計測してみよう

プログラムを実行すると2秒置きに湿度と温度がターミナルに表示されます。

まとめ

Raspberry Piと温湿度センサDHT20を使った気温・湿度計の作り方について解説しました。

気温・湿度を計れるようになったことで、家庭菜園などで毎日の気温・湿度データを管理出来、便利でになりました。

最後までお読み頂きありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

大学で機械工学を学んだ後、製造業で働く40代の会社員です。
IT系、電気系を学んでこなかった機械系人間が、ゲーム制作、電子工作に奮闘してます。
極力低コストでものづくりを楽しむのがモットー。

目次