やりたいことから始める 赤外線エアコンIoT (4/5)
第4章:温湿度測定と手動入力 — DHT20 のデータシート確認と I²C 配線
1. 温度センサーに求める条件
「今の部屋の温度・湿度が知りたい」という目的で、室温・湿度の測定機能を追加します。求める条件:
- 温度だけでなく湿度も測れると嬉しい(エアコンのモード選びの参考にしたい)
- 3.3V で動作する
- デジタル出力(アナログ読み取りの精度を気にしたくない)
- 配線が少ない(ブレッドボード上の配線を最小化したい)
2. なぜ DHT20 なのか — データシートを確認する
- 電源電圧:2.2V 〜 5.5V(3.3V で十分動作する)
- 通信方式:I²C(SDA/SCL の 2 本+電源で済む)
- I²C アドレス:0x38
- 測定項目:温度・湿度の両方
- Pin 配置:1=VDD、2=SDA、3=GND、4=SCL
- 外付けプルアップ抵抗:データシート例として 4.7kΩ が示されている(SDA と SCL 両方に必要)
- デカップリングコンデンサ:VDD-GND 間に 100nF(0.1µF)をセンサーの近くに配置することが推奨されている
データシートを確認すると、DHT20 は 3.3V で動作し、I²C 通信で温度・湿度の両方を測定できることが分かります。また、外付け部品として「プルアップ抵抗」と「デカップリングコンデンサ」が必要であることが明確に示されています。これらを省くと動作不良の原因になります。
理由:3.3V 動作、I²C 通信、温湿度両方。メーカー資料で外付け部品(プルアップ抵抗 4.7kΩ、デカップリング 0.1µF)が明記されている。秋月 116732 は DHT20 単体であり、モジュール基板ではないため、外付け部品を自分で入れる必要がある。
3. I²C バスを作る — プルアップ抵抗
I²C は「オープンドレイン」と呼ばれる方式で、デバイスが信号線を LOW にするだけで、HIGH に戻すのは外部のプルアップ抵抗が担当します。DHT20 の資料では 4.7kΩ が代表例ですが、手元に 5kΩ がある場合、約 6% の差なので短い配線なら十分代用できます。
I²C のプルアップ抵抗は「4.7kΩ でなければ動かない」というものではない。小さすぎると LOW へ下げるときの電流が増え、大きすぎると HIGH へ戻る速度が遅くなる。今回は配線が短く、手元の 5kΩ がデータシート例の 4.7kΩ に近いため 5kΩ を使う。
| 抵抗値 | 今回の判断 | 理由 |
|---|---|---|
| 4.7kΩ | 基準値 | DHT20資料の代表例。 |
| 5kΩ | 今回使用 | 4.7kΩとの差が小さく、短いブレッドボード配線では同じ目的で使える。 |
| 2kΩ | DHT20には今回は使わない | 5kΩよりLOW時の電流が増える。5kΩがあるためそちらを優先する。 |
4. デカップリングコンデンサ
抵抗が電流の流れ方を決める部品なのに対し、コンデンサは一時的に電気をためたり放したりできます。DHT20 が測定や通信をするときに生じる短い電源の揺れやノイズを吸収するため、0.1µF コンデンサを VDD と GND のすぐ近くへつなぎます。
データシートに「VDD と GND の間に 100nF(=0.1µF)のデカップリングコンデンサをセンサーの近くに置く」と明記されている。セラミックコンデンサなので極性はなく、向きを気にせず接続できる。
5. DHT20 の配線図
図3:DHT20 の I²C 接続。プルアップ抵抗 2 本とデカップリングコンデンサが必須。
6. DHT20 の動作確認実験
まず I²C スキャンで DHT20 が認識されているか確認します。
from machine import Pin, I2C
i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=100000)
print([hex(x) for x in i2c.scan()])
# 0x38 が見えればDHT20を認識している
DHT20 は起動後の待ち時間、測定開始コマンド、測定完了待ち、6 バイトのデータ読出しという手順で測定します。まずは I²C スキャン成功までを独立した実験として確認し、その後に DHT20 用ドライバを組み込みます。
7. 手動入力 — タクトスイッチ
「とりあえずボタンを押したらエアコンが動く」という動作確認がしたい。必要なものはただのスイッチです。
Pico の GPIO には内部プルアップ抵抗が内蔵されているため、スイッチを GPIO と GND の間に接続するだけで済みます。押していない時は HIGH、押すと GND に落ちて LOW になります。外付け抵抗は不要です。
理由:Pico の内部プルアップを使えば配線は 2 本(GPIO + GND)だけ。外付け抵抗不要。
from machine import Pin
from time import sleep_ms
sw = Pin(15, Pin.IN, Pin.PULL_UP)
while True:
if sw.value() == 0:
print("button pressed")
sleep_ms(300)
sleep_ms(10)
最終的には、このボタンが押されたら学習済み IR 信号を 1 回送る、という動作に統合します。