家庭菜園などで毎日の気温・湿度データを管理出来たら便利ですよね?
今回はRaspberry Piと温湿度センサDHT20を使った気温・湿度計の作り方について解説します。
こんな人におすすめ!
- Raspberry Piを活用したい人
- 温湿度センサの使い方を知りたい人
- 電子工作初心者の人
準備したもの
- Raspberry Pi 3 model B
- 温湿度センサ DHT20
- ジャンパワイヤ メス-メス
回路図
Raspberry Piと温湿度センサDHT20の接続方法は図表の通りです。
DHT20はI2C通信でデータをやり取りできるため、A/Dコンバータは不要となりシンプルですね。
Raspberry Pi | DHT20 |
---|---|
1: 3.3V | 1: VDD |
3: SDA | 2: SDA |
6: GND | 3: GND |
5: SCL | 4: 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を使った気温・湿度計の作り方について解説しました。
気温・湿度を計れるようになったことで、家庭菜園などで毎日の気温・湿度データを管理出来、便利でになりました。
最後までお読み頂きありがとうございました。