第9章 温湿度の測定と状態判定
この章の目的
Section titled “この章の目的”この章では、DHT11温湿度センサーを使い、 周囲の温度と湿度を数値として取得します。
取得した値を表示するだけでなく、 あらかじめ決めた条件と比較して「通常」または「注意」と判定します。 注意と判定したときは、第5章で配線した外付けLEDを点灯します。
周囲の温度・湿度 ↓DHT11で測定 ↓Pico Wで数値を取得 ↓しきい値と比較 ↓状態を表示し、LEDへ出力センサーから得たデータを判断と行動へ結び付ける、 小さなデータ活用の仕組みを作ります。
この章でできるようになること
Section titled “この章でできるようになること”- 温度・湿度センサーの役割を説明できる
- 4端子DHT11の端子を確認できる
- データ端子にプルアップ抵抗が必要な理由を説明できる
- MicroPythonの
dhtモジュールで温度と湿度を取得できる - 一定時間ごとに測定する処理をポーリングとして説明できる
- 読み取りエラーが起こる可能性を踏まえて処理できる
- しきい値を使って状態を判定できる
- 判定結果をShell表示とLED出力へ反映できる
使用するもの
Section titled “使用するもの”| 分類 | 使用するもの | 数量 |
|---|---|---|
| 制御用ボード | ピンヘッダー実装済みのRaspberry Pi Pico WまたはPico WH | 1 |
| 配線 | ブレッドボード | 1 |
| センサー | DHT11温湿度センサー(青色、4端子単体品) | 1 |
| 抵抗 | 4.7kΩ抵抗(黄・紫・赤・金) | 1 |
| 出力回路 | 第5章で配線した赤色LEDと330Ω抵抗 | 1組 |
| 配線 | ジャンパーワイヤー | 4本程度を追加 |
| PC接続 | データ通信対応Micro USBケーブル | 1 |
第8章の可変抵抗と、第6章・第7章のタクトスイッチは、 配線したままでも構いません。 この章のプログラムではGP14とGP26を使用しません。
安全上の注意
Section titled “安全上の注意”- 配線を追加・変更するときは、Pico WからUSBケーブルを外します
- DHT11の電源には
3V3(OUT)を使用します - DHT11の向きと端子番号を確認してから接続します
- データ端子を
3V3(OUT)やGNDへ直接接続しません - 3番端子の
NCには何も接続しません - 第5章のLEDには、引き続き330Ω抵抗を直列に使用します
- 配線後は講師または接続表による確認を行ってからUSB接続します
9-1 DHT11で測定できるもの
Section titled “9-1 DHT11で測定できるもの”DHT11は、温度と相対湿度を測定し、 デジタル信号として出力するセンサーです。
| 測定値 | この章での単位 | 例 |
|---|---|---|
| 温度 | ℃ | 24 |
| 相対湿度 | % | 55 |
MicroPythonのDHT11用ドライバーは、 温度と湿度を整数として返します。 小数を含む細かな変化を測定する用途には向きませんが、 データ取得、表示、判定、送信の流れを学ぶ本研修では十分に利用できます。
DHT11の値を精密な計測値として扱いません。 業務上の判断へ使用する場合は、 目的に合ったセンサー、校正、設置条件、測定基準が必要です。
9-2 4つの端子とプルアップ抵抗
Section titled “9-2 4つの端子とプルアップ抵抗”この章では、基板が付いていない4端子のDHT11を使用します。 センサーの格子が見える面を正面にして、 端子を下へ向けたときの端子順は次のとおりです。
| 左から | 端子名 | 役割 | この章での接続 |
|---|---|---|---|
| 1 | VCC | センサーの電源 | 3V3(OUT) |
| 2 | DATA | 測定データの信号 | GP16 |
| 3 | NC | 内部で未接続 | 接続しない |
| 4 | GND | 電源の基準 | GND |
互換品では外観や表示が異なる場合があります。 実物の型番表示と資料を確認し、 向きを推測だけで決めないようにします。
プルアップ抵抗
Section titled “プルアップ抵抗”DHT11のデータ線には、 信号を使用していない間の電圧を3.3V側へ保つ プルアップ抵抗が必要です。
この章では、VCCとDATAの間に
4.7kΩ抵抗を接続します。
4.7kΩ抵抗には向きがありません。
3端子のDHT11モジュールには、 基板上にプルアップ抵抗が実装されている製品があります。 今回は4端子のセンサー単体品であるため、 外付け抵抗を省略しません。
9-3 DHT11とLEDを配線する
Section titled “9-3 DHT11とLEDを配線する”第5章のGP15 LED回路を残し、 DHT11を次のように追加します。
DHT11の接続
Section titled “DHT11の接続”| 接続元 | 接続先 | 物理ピン |
|---|---|---|
DHT11の1番端子VCC | Pico Wの3V3(OUT) | 36 |
DHT11の2番端子DATA | Pico WのGP16 | 21 |
DHT11の3番端子NC | 接続しない | |
DHT11の4番端子GND | Pico WのGND | 23 |
| 4.7kΩ抵抗の片側 | DHT11の1番端子VCC | |
| 4.7kΩ抵抗の反対側 | DHT11の2番端子DATA |
LED回路の接続
Section titled “LED回路の接続”| 接続元 | 接続先 | 物理ピン |
|---|---|---|
Pico WのGP15 | 330Ω抵抗 | 20 |
| 330Ω抵抗 | LEDのアノード | |
| LEDのカソード | Pico WのGND | 18 |
図9-1 DHT11の入力回路とGP15のLED出力
次の順番で配線します。
- Pico WからUSBケーブルを外します
- DHT11の格子が見える面を正面にし、4つの端子を確認します
- 1番端子
VCCを物理ピン36の3V3(OUT)へ接続します - 2番端子
DATAを物理ピン21のGP16へ接続します - 4番端子
GNDを物理ピン23のGNDへ接続します - 1番端子と2番端子の間に4.7kΩ抵抗を接続します
- 3番端子
NCに何も接続していないことを確認します - 第5章のGP15 LED回路を接続表と照合します
- 講師の確認後、USBケーブルを接続します
9-4 温度と湿度を読み取る
Section titled “9-4 温度と湿度を読み取る”MicroPythonには、DHT11を扱うためのdhtモジュールがあります。
別のライブラリを追加せず、次のプログラムで測定します。
次のプログラムをch09_01_dht11_read.pyとして
PC側へ保存し、実行します。
from machine import Pinimport dhtimport time
DHT_PIN = 16MEASURE_INTERVAL = 2
sensor = dht.DHT11(Pin(DHT_PIN))time.sleep(2)
while True: try: sensor.measure() temperature = sensor.temperature() humidity = sensor.humidity() print("温度:", temperature, "℃", "湿度:", humidity, "%") except OSError as error: print("センサー読み取りエラー:", error)
time.sleep(MEASURE_INTERVAL)Shellへ温度と湿度が2秒ごとに表示されれば成功です。
温度: 24 ℃ 湿度: 55 %温度: 24 ℃ 湿度: 55 %温度: 25 ℃ 湿度: 54 %表示される値は、室内環境、センサーの個体差、 設置場所などによって異なります。
センサーを準備する
Section titled “センサーを準備する”sensor = dht.DHT11(Pin(DHT_PIN))Pin(16)でGP16を指定し、
そのピンへ接続したDHT11をDHT11()で準備します。
1回の測定を行う
Section titled “1回の測定を行う”sensor.measure()temperature = sensor.temperature()humidity = sensor.humidity()measure()で新しい測定を行います。
その後、temperature()で温度、
humidity()で相対湿度を取り出します。
前回の値を取り出すだけにならないよう、
温度と湿度を読む前にmeasure()を実行します。
2秒ごとに測定する
Section titled “2秒ごとに測定する”MEASURE_INTERVAL = 2このプログラムは、測定、表示、待機を繰り返します。 一定時間ごとにセンサーの状態を調べるため、 第6章で学んだポーリングの例です。
短い間隔で連続して測定せず、 この章では測定間隔を2秒に統一します。 後のクラウド送信では、通信量や保存件数も考えて さらに長い送信間隔を使用します。
9-5 読み取りエラーを扱う
Section titled “9-5 読み取りエラーを扱う”DHT11との通信では、配線、接触、測定間隔などの影響により、 測定に失敗する場合があります。
try: sensor.measure() temperature = sensor.temperature() humidity = sensor.humidity()except OSError as error: print("センサー読み取りエラー:", error)tryの中でエラーが発生しなければ、
温度と湿度を取得します。
センサー通信に関するOSErrorが発生した場合は、
exceptの処理へ移り、エラー内容を表示します。
プログラム全体を終了せず、2秒待って次の測定を試します。
エラーを無視しているのではありません。 エラーが発生したことを表示し、 正常な測定値と区別しています。
9-6 温湿度から状態を判定する
Section titled “9-6 温湿度から状態を判定する”次は、温度と湿度を研修用のしきい値と比較します。
| 条件 | 状態 | LED |
|---|---|---|
| 温度が28℃以上、または湿度が70%以上 | 注意 | 点灯 |
| どちらの条件にも当てはまらない | 通常 | 消灯 |
| センサーの読み取りに失敗 | 測定できない | 消灯 |
28℃と70%は、条件分岐と出力を確認するための 研修用のしきい値です。 健康、安全、熱中症、結露、製品保管などの 判断基準を示すものではありません。
次のプログラムをch09_02_temperature_state.pyとして
PC側へ保存し、実行します。
from machine import Pinimport dhtimport time
DHT_PIN = 16LED_PIN = 15MEASURE_INTERVAL = 2TEMP_WARNING = 28HUMIDITY_WARNING = 70
sensor = dht.DHT11(Pin(DHT_PIN))led = Pin(LED_PIN, Pin.OUT)led.off()time.sleep(2)
try: while True: try: sensor.measure() temperature = sensor.temperature() humidity = sensor.humidity()
if temperature >= TEMP_WARNING or humidity >= HUMIDITY_WARNING: state = "注意" led.on() else: state = "通常" led.off()
print( "温度:", temperature, "℃", "湿度:", humidity, "%", "状態:", state ) except OSError as error: led.off() print("センサー読み取りエラー:", error)
time.sleep(MEASURE_INTERVAL)finally: led.off()温度、湿度、状態が2秒ごとに表示されます。 どちらかの値がしきい値以上になると、 状態が「注意」になり、外付けLEDが点灯します。
if temperature >= TEMP_WARNING or humidity >= HUMIDITY_WARNING:orは、左右の条件のどちらか一方でも成立したときに
全体を成立とする演算子です。
この章では、温度または湿度のどちらかが しきい値以上になると「注意」と判定します。
判定結果を2つの出力へ使う
Section titled “判定結果を2つの出力へ使う”同じ判定結果を次の2か所へ出力しています。
- Shellへ
通常または注意を表示する - GP15のLEDを消灯または点灯する
センサーの値を取得するだけでなく、 人が確認できる文字と光へ変換しています。
停止時と読み取り失敗時は消灯する
Section titled “停止時と読み取り失敗時は消灯する”読み取りに失敗したときや、 プログラムを停止したときはLEDを消灯します。
測定できていない状態を、 直前の「注意」表示のまま残さないためです。 実際のシステムでは、測定不能を示す表示や通知を 通常・注意とは別に用意する場合があります。
9-7 データ活用の流れを確認する
Section titled “9-7 データ活用の流れを確認する”図9-2 温湿度の取得から状態判定までの流れ
第1章で確認したデータ活用の流れと対応させます。
| 段階 | この章で行うこと |
|---|---|
| 現場の状態 | 周囲の温度と湿度 |
| 取得 | DHT11で測定 |
| 整理 | 温度と湿度を別の数値として保持 |
| 可視化 | Shellへ単位付きで表示 |
| 判断 | 研修用しきい値と比較 |
| 行動 | 状態を表示し、注意時にLEDを点灯 |
| 改善 | 測定間隔や判定条件を目的に合わせて見直す |
この段階では、データはPico WとPCの間だけで確認しています。 後の章では、同じ温度・湿度データを ネットワーク経由で利用できる形へ発展させます。
変更してみる
Section titled “変更してみる”現在の室内環境ではLEDが点灯しない場合があります。
動作確認のため、TEMP_WARNINGを
現在の温度より1℃低い値へ一時的に変更します。
たとえば、Shellの温度が24℃の場合は次のようにします。
TEMP_WARNING = 23状態が「注意」になり、LEDが点灯することを確認します。
確認後は、元の28へ戻します。
しきい値だけを変更し、 センサーの配線や判定処理は変更しません。
- DHT11の正面と4つの端子を確認できる
-
VCC、DATA、NC、GNDを区別できる -
VCCとDATAの間へ4.7kΩ抵抗を接続できる -
DATAをGP16へ接続できる - 温度と湿度が2秒ごとに表示される
- 定期測定がポーリングであることを説明できる
- 読み取りエラーと正常な測定値を区別できる
- しきい値を使って「通常」と「注意」を判定できる
- 注意時にGP15のLEDが点灯する
- プログラム停止時にLEDが消灯する
よくある問題と確認方法
Section titled “よくある問題と確認方法”| 状況 | 主な確認箇所 |
|---|---|
| 値が表示されない | Thonnyの接続先、import dht、プログラムが実行中か |
| 読み取りエラーが続く | DHT11の向き、VCC・DATA・GND、GP16、4.7kΩ抵抗、ジャンパーワイヤーの接触 |
| センサーが熱くなる | 電源を直ちに外し、VCCとGNDの逆接続がないか確認 |
| 値がほとんど変わらない | DHT11は整数値を返すため、小さな変化は表示へ表れない場合がある |
| 1回目だけエラーになる | 電源投入後の待機、直前の測定から2秒空いているか |
| LEDが点灯しない | GP15、330Ω抵抗、LEDの向き、現在値としきい値 |
| LEDが常に点灯する | TEMP_WARNINGとHUMIDITY_WARNING、Shellに表示された現在値 |
| 停止後もLEDが点灯する | finallyとled.off()を確認し、必要ならShellからled.off()を実行 |
配線を確認するときは、先にUSBケーブルを外します。 エラーが続く場合は部品を追加せず、 端子順、接続先、抵抗値を順番に確認します。
- DHT11は、温度と相対湿度をデジタル信号として出力します
- 4端子単体品は、データ線へ外付けのプルアップ抵抗が必要です
- この章では、DHT11の
DATAをGP16へ接続します dht.DHT11()でセンサーを準備し、measure()で測定しますtemperature()とhumidity()で温度と湿度を取得します- 2秒ごとの測定は、センサーを定期的に確認するポーリングです
- センサー通信の失敗は、正常な測定値と区別して扱います
- 取得した値をしきい値と比較し、状態表示とLED出力へ利用できます
- しきい値は利用目的に合わせて定める必要があります
- センサーデータを取得、表示、判断、行動へつなげることがデータ活用の基本です
- MicroPython公式「DHT driver」(v1.26.0)
- ASAIR公式「DHT11 Temperature and Humidity Sensor Module」
- ASAIR公式「DHT11製品マニュアル」(PDF)
- Raspberry Pi公式「Raspberry Pi Pico W Datasheet」(PDF)
次の第10章では、Pico WをWi-Fiへ接続し、 IPアドレスとネットワーク上の役割を確認します。