今回は DHT11 温湿度センサー を使って、気温(℃)と湿度(%)を同時に測定 します。DHT11 は たった 1 本のデータ線 で温度と湿度の 2 つのデータを返してくれる便利なセンサーで、青い小さなプラスチック筒の中にサーミスタ(温度センサー)と湿度センサーが内蔵されています。数百円で買え、配線もシンプルなので、Arduino / Raspberry Pi 界隈で気象モニタ・室内環境計測の定番 となっています。
- DHT11 の動作原理(1-wire 通信・MSB ファースト 40bit データ)
- 温度 / 湿度センサーの中身(サーミスタ + 高分子湿度センサー)
- DHT11 と DHT22(AM2302) の精度・分解能の違い
- 連続測定の 1 秒ルール(より頻繁に呼ぶとエラーになる)
- LCD と組み合わせた気象モニタ/しきい値判定でブザー警告などの応用
PycoBlocks(MicroPythonモード) を開き、左カテゴリ「センサー」の 「DHT温湿度」 ブロックが今回の主役です。1 つのブロックで 温度(temp)と湿度(humi)の 2 変数 に同時に値を入れてくれます。#08 で学んだ I2C LCD と組み合わせれば、本格的な 室内環境モニタ が作れますよ。

DHT11 の仕組み:1 本のデータ線で温度と湿度を同時に読む
DHT11 は 青いプラスチックの筒(または基板搭載モジュール) の中にサーミスタ(温度センサー) と 高分子湿度センサー を内蔵し、専用 IC が両方の値をデジタル化してマイコンに送ります。Pico とは たった 1 本のデータ線(と GND・VCC の合計 3 本) で通信できるのが特徴です。
- Pico が DATA ピンを 20ms 以上 LOW に引いてセンサーを起こす(スタート信号)
- DHT11 が応答し、40bit のデータ(温度 16bit + 湿度 16bit + チェックサム 8bit) を 1 本の DATA 線で順番に返す
- Pico が HIGH の長さ(27μs or 70μs) で 0 / 1 を判別しながら受信
- 受信した 40bit を温度(℃)と湿度(%)に変換 → 変数 temp / humi に格納

1-wire 通信の魅力:I2C(#08 の LCD で使った)が SDA + SCL の 2 本 必要なのに対し、1-wire は データ線 1 本だけ。配線がシンプルで、Pico の GPIO を 1 つしか消費しません。ただし通信タイミングがマイクロ秒単位でシビアなので、MicroPython の dht モジュール(標準同梱)が裏側で全部やってくれます。皆さんは 「DHT温湿度」ブロックを置けば temp と humi に値が入る と覚えれば OK です。
DHT11 と DHT22(AM2302)の違い:どっちを使う?
DHT 系センサーには DHT11(青) と DHT22(白、AM2302 とも呼ばれる) の 2 種類があり、配線とコードはほぼ同じですが 性能が大きく違います。
| 項目 | DHT11(青) | DHT22 / AM2302(白) |
|---|---|---|
| 温度範囲 | 0 〜 50℃ | −40 〜 80℃ |
| 温度精度 | ±2℃ | ±0.5℃ |
| 温度分解能 | 1℃(整数) | 0.1℃ |
| 湿度範囲 | 20 〜 90 %RH | 0 〜 100 %RH |
| 湿度精度 | ±5 %RH | ±2 %RH |
| 湿度分解能 | 1 %RH(整数) | 0.1 %RH |
| サンプリング間隔 | 1 秒以上 | 2 秒以上 |
| 価格目安 | 200〜400 円 | 500〜800 円 |
選び方の目安:学習用・室内のざっくりした測定なら DHT11 で十分。屋外や精度の必要な気象観測・研究用途には DHT22 を選びます。PycoBlocks の 「DHT温湿度」ブロック はどちらにも対応しており、コードを書き換える必要はありません(内部で型を判別)。本記事の解説と配線図は DHT11 を前提にしていますが、DHT22 でもそのまま動きます。
配線:DHT11 を Pico につなぐ(プルアップ抵抗の役割)
DHT11 は 3 本のピン(VCC / DATA / GND) または4 本ピンの裸モジュール(VCC / DATA / NC / GND) として売られています。高専で買うキットには 基板付きの 3 ピンモジュール が多く、プルアップ抵抗が基板に最初から実装済み なので、そのまま 3 本配線するだけで動きます。
| DHT11 のピン | Pico のピン | 役割 |
|---|---|---|
| VCC(+) | 3V3(36 番) | 電源(3.3V でも 5V でも動作) |
| DATA(信号) | GP16(21 番) | 1-wire の双方向通信線 |
| GND(−) | GND(38 番など) | 基準電位 |
📝 プルアップ抵抗(10kΩ)が必要な理由

ステップ1:温度と湿度を 1 回だけ測ってみよう
まずは 1 回だけ温湿度を測定 し、結果を print で表示します。「DHT温湿度」 ブロック 1 つで、変数 temp に温度(℃)が、変数 humi に湿度(%RH)が同時に入ります。「値を表示」 をフォーマット文字列と組み合わせて、Temp: 24 C や Humi: 60 % のように単位付きで分かりやすく出力しましょう。

from machine import Pin
from dht import DHT11
_dht = DHT11(Pin(16))
_dht.measure()
temp = _dht.temperature()
humi = _dht.humidity()
print(f'Temp: {temp} C')
print(f'Humi: {humi} %')
コードのポイント:DHT11(Pin(16)) でセンサーを準備し、.measure() で 実際に通信して測定 します。その後 .temperature() と .humidity() で値を取り出します。dht モジュールは MicroPython の 標準同梱ライブラリなので、別途インストール不要で動きます。f-string(フォーマット文字列) の {temp} は「変数 temp の値をここに埋め込む」という意味で、PycoBlocks の 「値を表示」(py_fstring) ブロックが自動生成します。
ステップ2:2 秒ごとに連続して温湿度を表示しよう
1 回測るだけでは 環境変化 を追えません。「ずっと繰り返す」 ブロックの中に DHT 測定を入れて、2 秒ごとに温度と湿度を表示 し続けるようにしましょう。Thonny のシェルに数字が並んで、息を吹きかけたり手で温めたりすると数値が変化するのが見えます。

from machine import Pin
from dht import DHT11
import utime
_dht = DHT11(Pin(16))
while True:
_dht.measure()
temp = _dht.temperature()
humi = _dht.humidity()
print(f'T={temp}C')
print(f'H={humi}%')
utime.sleep(2)
⚠️ 1 秒ルール:速く呼びすぎるとタイムアウトする
.measure() を呼ぶと OSError: [Errno 110] ETIMEDOUT(タイムアウト)が出て測定に失敗する。本記事では安全を見て 2 秒間隔 にしているが、最短でも 1 秒以上空けること。理由は、センサー内部のサーミスタが自己発熱して周囲温度に追従するのに時間が必要だから。📝 湿度値は整数でしか返らない
60.3% や 59.8% のような小数は出ないので、値が 飛び飛び に変化するように見える。小数精度が欲しい場合は DHT22 か、より高精度の SHT31(I2C 接続) を選ぶ。演習課題
課題3-10-1:気温と湿度から「露点温度」を計算しよう
露点温度とは「空気を冷やしていったときに、水蒸気が水滴になる温度」のことで、結露・霧・雲の発生 を予測するのに使います。簡易式として有名な Magnus 近似式 は次のとおり。
計算式: γ = ln(RH/100) + (b × T)/(c + T)
露点 Td: Td = (c × γ) / (b − γ)
(b = 17.625、c = 243.04、T = 気温℃、RH = 湿度%、ln は自然対数)
問1: 気温 25℃、湿度 60% のとき、露点は何℃?(小数第1位まで)
問2: 気温 25℃、湿度 90% のとき、露点は何℃?
問3: 露点が室温(25℃)に近づくと、何が起きる?
▶ 模範解答と解説を見る
import math
# Magnus 近似式で露点を計算する関数
def dew_point(T, RH):
b, c = 17.625, 243.04
gamma = math.log(RH / 100) + (b * T) / (c + T)
return (c * gamma) / (b - gamma)
# 問1: T=25, RH=60
print(round(dew_point(25, 60), 1)) # → 16.7℃
# 問2: T=25, RH=90
print(round(dew_point(25, 90), 1)) # → 23.2℃
# 問3: 露点 ≈ 室温 → 空気が水蒸気で飽和する
# → 鏡・窓・冷たい飲み物の表面に結露する
# → 体感もムシムシして不快指数が高くなる
解説: 解説:湿度 60% は 露点 16.7℃ なので、夜に部屋の窓ガラスが 17℃ 以下に冷えると結露します。湿度 90% では露点が 23.2℃ まで上がり、室温 25℃ との差がわずか 1.8℃。梅雨時に「ジメジメして不快」と感じるのはこの状態です。DHT11 と組み合わせた応用:気温・湿度が分かれば露点も計算できるので、「露点が室温の 2℃ 以内に近づいたら警告ブザー」 のような結露予報装置も作れます。math モジュールを使うので、現状の PycoBlocks ブロックでは表現できない部分は「コードを直接書く」ブロック(cs_b) で補ってください。
課題3-10-2:LCD に温度と湿度をリアルタイム表示しよう
DHT11 と #08 で学んだ I2C LCD を組み合わせて、本格的な卓上気象モニタ を作ります。LCD の 1 行目に温度、2 行目に湿度 を表示。2 秒ごとに更新し続ければ、Thonny を起動していなくても部屋の温湿度が一目で分かります。
配線追加:DHT11(VCC→3V3、DATA→GP16、GND→GND)に加えて、I2C LCD を Pico の GP0(SDA)・GP1(SCL)に接続します。LCD の VCC は 5V(VBUS)、GND は GND に。DHT11 の GP16 と LCD の GP0/GP1 はぶつからないので安心です。
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

from machine import Pin, I2C
from dht import DHT11
from pico_i2c_lcd import I2cLcd
import utime
_i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = I2cLcd(_i2c, 0x27, 2, 16)
_dht = DHT11(Pin(16))
while True:
_dht.measure()
temp = _dht.temperature()
humi = _dht.humidity()
lcd.move_to(0, 0); lcd.putstr(f'Temp: {temp} C')
lcd.move_to(0, 1); lcd.putstr(f'Humi: {humi} %')
utime.sleep(2)
解説: 動作確認のコツ:起動直後は LCD に古い文字が残っている場合があります。気になる人は 毎回 lcd.clear() を呼ぶ か、「Temp: 」のように 右側に半角スペースを埋めて固定幅 にすると、前回の桁数が違っても残らずきれいに上書きできます。発展:
- 露点も同時表示:課題3-10-1 で計算した露点を 1 行目末尾に表示し「Temp: 25 / Dew: 17」のように 1 画面で結露リスクが分かる気象モニタに進化
- 最高・最低気温を記録:変数
tmax、tminを作り、現在気温と比較して更新。1 日中放置すれば自家製ミニ気象台 - SD カードに CSV ロギング:時刻・温度・湿度を CSV で保存して、Excel でグラフ化(次のシリーズで扱う予定)

課題3-10-3:28℃ を超えたら熱中症アラートを鳴らそう
気温が しきい値(28℃) を超えたら ブザーで警告 する熱中症アラート を作ります。「もし/そうでなければ」 の if-else で判定し、暑いときだけ 880Hz の高音を 0.3 秒鳴らす、そうでなければ静かに 0.3 秒待つ、という流れです。夏場の体育館・サーバールーム・教室で実際に使える実用回路ですよ。
配線追加:DHT11 はそのまま GP16 で、パッシブブザーを GP15 と GND に追加します。DHT11 のデータ線 GP16 とブザーの GP15 はぶつからないので OK。
▶ 模範解答と解説を見る
ブロックの組み合わせ例:

from machine import Pin, PWM
from dht import DHT11
import utime
_dht = DHT11(Pin(16))
while True:
_dht.measure()
temp = _dht.temperature()
humi = _dht.humidity()
print(f'T={temp}C')
if temp >= 28:
_bz = PWM(Pin(15))
_bz.freq(880); _bz.duty_u16(32768)
utime.sleep(0.3); _bz.deinit()
else:
utime.sleep(0.3)
utime.sleep(2)
解説: 動作確認のコツ:DHT11 を握ったり、暖かいコーヒーの近くに置いたりして温度を上げてみましょう。28℃ を超えた瞬間からブザーが鳴り始めます。手を離して温度が下がると自然に止まります。発展:
- 熱中症指数(WBGT 簡易版):気温と湿度から
WBGT ≈ 0.7×Twb + 0.3×T(Twb = 湿球温度、近似的に T と RH から計算)を出して、25 以上で警告など段階的に - 3 段階アラート:if-elif-else を使って 「30℃ 以上:高速ピッピッ」「28℃ 以上:ゆっくりピー」「それ以下:無音」のように 危険度を音で伝える
- 湿度も組み合わせた条件:
if temp >= 28 and humi >= 70:のように 高温多湿の同時条件 でアラート → 熱中症リスクの判定に近づく

まとめ
- DHT11 は 1 本のデータ線で温度(℃)と湿度(%RH)を同時に返す、安価で扱いやすい温湿度センサー。
- 「DHT温湿度」ブロック 1 つで temp と humi の 2 変数 に値が入る。内部の通信タイミングは MicroPython の dht モジュールが面倒を見てくれる。
- 1 秒ルール:DHT11 は最小 1 秒、DHT22 は最小 2 秒の間隔を空けて測定する。速く呼ぶと OSError でタイムアウトする。
- 分解能は DHT11 が 1℃ / 1%RH と粗い。精密測定には DHT22 や SHT31 を選ぶ。
- #08 の LCD・#06 の ブザー と組み合わせれば、気象モニタ・熱中症アラートなど実用装置が作れる。
次の記事は #11「明るさを測ろう(CdS / フォトレジスタ)」。光を当てると抵抗値が変わる素子を ADC で読み取り、夜になったら自動で LED が点く常夜灯を作る予定です。