DHT20(温湿度測定器)を使う(for Arduino)

温度湿度測定器として、AM2320を使っていたのですがこちらの方が値段が安い(これは380円、AM2320は600円)ので買って見ました。

ちょっと不親切な仕様書

仕様書は秋月さんのHPにあるこれですが、”DHT20 PDFデータシート” が何とも不親切です。

  • インターフェイスはI2C。アドレスは0x38。
  • 電源を入れてからデータを読み出すまで100mseのウエイトが必要。
  • コマンド0x71を送ってデバイスの状態を判断する様なのですが、この部分が良く分かりません。
    • 原文は:
      • If the status word and 0x18 are not equal to 0x18, initialize the 0x1B, 0x1C, 0x1E registers,
      • 訳ー>ステイタスワードと0x18が0x18でなければ、0x1B, 0x1C, 0x1E registersを初期化する?。
    • 初期化の内容は仕様書に書かれていません。詳細はオフィスサイトを参照との事
  • 上記のコマンド送信後、約80msec待ってデータを読み込む。
  • 温湿度データは全部で7バイト。
    • 1バイト目:ステータス・レジスタ   :7ビット(最上位)が0なら測定完了。
    • 2、3と4バイト目の上位4ビット   :湿度データ
    • 4バイトの下位4ビットと5,6バイト目:温度データ
    • 7バイト目              :CRC check用データ。
  • データの換算
    • 湿度 % = 湿度データ/2^20 * 100
    • 温度 ’C  = 温度データ/2^20 * 200 ー 50

読み出し用のプログラムを書いて見る

下記の前提でプログラムを書いて見ました。

  • コマンド0x71を送ってデバイスの状態を判断
    • オフィシャルサイトに行ったのですが詳細を見つける事は出来ませんでした。
    • 今回はこのコマンド出はなく温湿度データ1バイト目の7ビットでデータの有効性を判断します。
  • 温湿度のデータは20ビットですが、どちらが上位か説明が有りません。
    • とりあえず上位から始まると判断しました。

検証のハードはESP32を使い、デバイスとは以下の様につないでいます。

dht20.ino

#include <Wire.h>
#define ADR 0x38

void setup()
{
    Wire.begin();
    Serial.begin(115200);
}

void loop() 
{
    float hu, tp;
    uint8_t buf[8];
    long a;
    int flg;

    delay(500);
    flg = 1;
    while (flg)
    {
        Wire.beginTransmission(ADR);
        Wire.write(0xac);
        Wire.write(0x33);
        Wire.write(0x00);
        Wire.endTransmission();
        delay(100);

        Wire.requestFrom(ADR, 6);
        for (uint8_t i = 0; i < 6; i++)  buf[i] = Wire.read();

        if (buf[0] & 0x80) Serial.println("Measurement not Comp");
        else flg = 0;
    }
    a = buf[1];
    a <<= 8;
    a |= buf[2];
    a <<= 4;
    a |= ((buf[3] >> 4) & 0x0f);
    hu = a / 10485.76;

    a = (buf[3] & 0xf);
    a <<= 8;
    a |= buf[4];
    a <<= 8;
    a |= buf[5];
    tp = a / 5242.88 - 50;
    
    Serial.print("T=" + String(tp) + "'C ");
    Serial.println("H=" + String(hu) + "%");
}
  • 2行: #define ADR 0x38 ー> DTH20のI2Cアドレス
  • 19から33行: ここでデータの読み込みと有効性の判断をしています。
    • 21から26行:測定開始コマンド(0xac,0x33,0x00)を送信
    • 仕様書では80msecのウエイトと有りましたが、100msec待機
  • 28、29行:DTH20から温湿度関係データ6バイトの読み込み
  • 31,32行:温湿度関係データ1バイト目の7ビットでデータの有効性を判断
  • 34から39行:測定データをもとに湿度計算。
  • 41から46行:測定データをもとに温度計算。
  • 48行:測定温度をシリアルモニタに表示。
  • 49行:測定湿度をシリアルモニタに表示。

実行するとシリアル画面に下記の様に表示します。確かに温度と湿度を測定しています。

最後に

仕様書に不明な箇所が有りましたが、温湿度の測定が出来ました。

また、PIC版はここに有りますー>DHT20 温湿度モジュール (for PIC)