Skip to content

第9章 温湿度の測定と状態判定

この章では、DHT11温湿度センサーを使い、 周囲の温度と湿度を数値として取得します。

取得した値を表示するだけでなく、 あらかじめ決めた条件と比較して「通常」または「注意」と判定します。 注意と判定したときは、第5章で配線した外付けLEDを点灯します。

周囲の温度・湿度
DHT11で測定
Pico Wで数値を取得
しきい値と比較
状態を表示し、LEDへ出力

センサーから得たデータを判断と行動へ結び付ける、 小さなデータ活用の仕組みを作ります。

この章でできるようになること

Section titled “この章でできるようになること”
  • 温度・湿度センサーの役割を説明できる
  • 4端子DHT11の端子を確認できる
  • データ端子にプルアップ抵抗が必要な理由を説明できる
  • MicroPythonのdhtモジュールで温度と湿度を取得できる
  • 一定時間ごとに測定する処理をポーリングとして説明できる
  • 読み取りエラーが起こる可能性を踏まえて処理できる
  • しきい値を使って状態を判定できる
  • 判定結果をShell表示とLED出力へ反映できる
分類使用するもの数量
制御用ボードピンヘッダー実装済みのRaspberry Pi Pico WまたはPico WH1
配線ブレッドボード1
センサーDHT11温湿度センサー(青色、4端子単体品)1
抵抗4.7kΩ抵抗(黄・紫・赤・金)1
出力回路第5章で配線した赤色LEDと330Ω抵抗1組
配線ジャンパーワイヤー4本程度を追加
PC接続データ通信対応Micro USBケーブル1

第8章の可変抵抗と、第6章・第7章のタクトスイッチは、 配線したままでも構いません。 この章のプログラムではGP14とGP26を使用しません。

  • 配線を追加・変更するときは、Pico WからUSBケーブルを外します
  • DHT11の電源には3V3(OUT)を使用します
  • DHT11の向きと端子番号を確認してから接続します
  • データ端子を3V3(OUT)やGNDへ直接接続しません
  • 3番端子のNCには何も接続しません
  • 第5章のLEDには、引き続き330Ω抵抗を直列に使用します
  • 配線後は講師または接続表による確認を行ってからUSB接続します

DHT11は、温度と相対湿度を測定し、 デジタル信号として出力するセンサーです。

測定値この章での単位
温度24
相対湿度%55

MicroPythonのDHT11用ドライバーは、 温度と湿度を整数として返します。 小数を含む細かな変化を測定する用途には向きませんが、 データ取得、表示、判定、送信の流れを学ぶ本研修では十分に利用できます。

DHT11の値を精密な計測値として扱いません。 業務上の判断へ使用する場合は、 目的に合ったセンサー、校正、設置条件、測定基準が必要です。

9-2 4つの端子とプルアップ抵抗

Section titled “9-2 4つの端子とプルアップ抵抗”

この章では、基板が付いていない4端子のDHT11を使用します。 センサーの格子が見える面を正面にして、 端子を下へ向けたときの端子順は次のとおりです。

左から端子名役割この章での接続
1VCCセンサーの電源3V3(OUT)
2DATA測定データの信号GP16
3NC内部で未接続接続しない
4GND電源の基準GND

互換品では外観や表示が異なる場合があります。 実物の型番表示と資料を確認し、 向きを推測だけで決めないようにします。

DHT11のデータ線には、 信号を使用していない間の電圧を3.3V側へ保つ プルアップ抵抗が必要です。

この章では、VCCDATAの間に 4.7kΩ抵抗を接続します。 4.7kΩ抵抗には向きがありません。

3端子のDHT11モジュールには、 基板上にプルアップ抵抗が実装されている製品があります。 今回は4端子のセンサー単体品であるため、 外付け抵抗を省略しません。

第5章のGP15 LED回路を残し、 DHT11を次のように追加します。

接続元接続先物理ピン
DHT11の1番端子VCCPico Wの3V3(OUT)36
DHT11の2番端子DATAPico WのGP1621
DHT11の3番端子NC接続しない
DHT11の4番端子GNDPico WのGND23
4.7kΩ抵抗の片側DHT11の1番端子VCC
4.7kΩ抵抗の反対側DHT11の2番端子DATA
接続元接続先物理ピン
Pico WのGP15330Ω抵抗20
330Ω抵抗LEDのアノード
LEDのカソードPico WのGND18

格子のある面を正面にした4端子DHT11の1番端子を3V3 OUT、2番端子をGP16、4番端子をGNDへ接続し、1番端子と2番端子の間へ4.7kΩのプルアップ抵抗を接続する。3番端子は接続しない。GP15には330Ω抵抗と赤色LEDを接続する。

図9-1 DHT11の入力回路とGP15のLED出力

次の順番で配線します。

  1. Pico WからUSBケーブルを外します
  2. DHT11の格子が見える面を正面にし、4つの端子を確認します
  3. 1番端子VCCを物理ピン36の3V3(OUT)へ接続します
  4. 2番端子DATAを物理ピン21のGP16へ接続します
  5. 4番端子GNDを物理ピン23のGNDへ接続します
  6. 1番端子と2番端子の間に4.7kΩ抵抗を接続します
  7. 3番端子NCに何も接続していないことを確認します
  8. 第5章のGP15 LED回路を接続表と照合します
  9. 講師の確認後、USBケーブルを接続します

MicroPythonには、DHT11を扱うためのdhtモジュールがあります。 別のライブラリを追加せず、次のプログラムで測定します。

次のプログラムをch09_01_dht11_read.pyとして PC側へ保存し、実行します。

ch09_01_dht11_read.py
from machine import Pin
import dht
import time
DHT_PIN = 16
MEASURE_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 %

表示される値は、室内環境、センサーの個体差、 設置場所などによって異なります。

sensor = dht.DHT11(Pin(DHT_PIN))

Pin(16)でGP16を指定し、 そのピンへ接続したDHT11をDHT11()で準備します。

sensor.measure()
temperature = sensor.temperature()
humidity = sensor.humidity()

measure()で新しい測定を行います。 その後、temperature()で温度、 humidity()で相対湿度を取り出します。

前回の値を取り出すだけにならないよう、 温度と湿度を読む前にmeasure()を実行します。

MEASURE_INTERVAL = 2

このプログラムは、測定、表示、待機を繰り返します。 一定時間ごとにセンサーの状態を調べるため、 第6章で学んだポーリングの例です。

短い間隔で連続して測定せず、 この章では測定間隔を2秒に統一します。 後のクラウド送信では、通信量や保存件数も考えて さらに長い送信間隔を使用します。

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側へ保存し、実行します。

ch09_02_temperature_state.py
from machine import Pin
import dht
import time
DHT_PIN = 16
LED_PIN = 15
MEASURE_INTERVAL = 2
TEMP_WARNING = 28
HUMIDITY_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か所へ出力しています。

  • Shellへ通常または注意を表示する
  • GP15のLEDを消灯または点灯する

センサーの値を取得するだけでなく、 人が確認できる文字と光へ変換しています。

停止時と読み取り失敗時は消灯する

Section titled “停止時と読み取り失敗時は消灯する”

読み取りに失敗したときや、 プログラムを停止したときはLEDを消灯します。

測定できていない状態を、 直前の「注意」表示のまま残さないためです。 実際のシステムでは、測定不能を示す表示や通知を 通常・注意とは別に用意する場合があります。

9-7 データ活用の流れを確認する

Section titled “9-7 データ活用の流れを確認する”

DHT11が温度と湿度を取得し、Pico Wが28℃と70%の研修用しきい値と比較する。どちらかがしきい値以上なら注意としてLEDを点灯し、どちらも未満なら通常としてLEDを消灯する。読み取りに失敗した場合はエラーを表示して次の測定を待つ。

図9-2 温湿度の取得から状態判定までの流れ

第1章で確認したデータ活用の流れと対応させます。

段階この章で行うこと
現場の状態周囲の温度と湿度
取得DHT11で測定
整理温度と湿度を別の数値として保持
可視化Shellへ単位付きで表示
判断研修用しきい値と比較
行動状態を表示し、注意時にLEDを点灯
改善測定間隔や判定条件を目的に合わせて見直す

この段階では、データはPico WとPCの間だけで確認しています。 後の章では、同じ温度・湿度データを ネットワーク経由で利用できる形へ発展させます。

現在の室内環境ではLEDが点灯しない場合があります。 動作確認のため、TEMP_WARNINGを 現在の温度より1℃低い値へ一時的に変更します。

たとえば、Shellの温度が24℃の場合は次のようにします。

TEMP_WARNING = 23

状態が「注意」になり、LEDが点灯することを確認します。 確認後は、元の28へ戻します。

しきい値だけを変更し、 センサーの配線や判定処理は変更しません。

  • DHT11の正面と4つの端子を確認できる
  • VCCDATANCGNDを区別できる
  • VCCDATAの間へ4.7kΩ抵抗を接続できる
  • DATAをGP16へ接続できる
  • 温度と湿度が2秒ごとに表示される
  • 定期測定がポーリングであることを説明できる
  • 読み取りエラーと正常な測定値を区別できる
  • しきい値を使って「通常」と「注意」を判定できる
  • 注意時にGP15のLEDが点灯する
  • プログラム停止時にLEDが消灯する
状況主な確認箇所
値が表示されないThonnyの接続先、import dht、プログラムが実行中か
読み取りエラーが続くDHT11の向き、VCC・DATA・GND、GP16、4.7kΩ抵抗、ジャンパーワイヤーの接触
センサーが熱くなる電源を直ちに外し、VCCとGNDの逆接続がないか確認
値がほとんど変わらないDHT11は整数値を返すため、小さな変化は表示へ表れない場合がある
1回目だけエラーになる電源投入後の待機、直前の測定から2秒空いているか
LEDが点灯しないGP15、330Ω抵抗、LEDの向き、現在値としきい値
LEDが常に点灯するTEMP_WARNINGHUMIDITY_WARNING、Shellに表示された現在値
停止後もLEDが点灯するfinallyled.off()を確認し、必要ならShellからled.off()を実行

配線を確認するときは、先にUSBケーブルを外します。 エラーが続く場合は部品を追加せず、 端子順、接続先、抵抗値を順番に確認します。

  • DHT11は、温度と相対湿度をデジタル信号として出力します
  • 4端子単体品は、データ線へ外付けのプルアップ抵抗が必要です
  • この章では、DHT11のDATAをGP16へ接続します
  • dht.DHT11()でセンサーを準備し、measure()で測定します
  • temperature()humidity()で温度と湿度を取得します
  • 2秒ごとの測定は、センサーを定期的に確認するポーリングです
  • センサー通信の失敗は、正常な測定値と区別して扱います
  • 取得した値をしきい値と比較し、状態表示とLED出力へ利用できます
  • しきい値は利用目的に合わせて定める必要があります
  • センサーデータを取得、表示、判断、行動へつなげることがデータ活用の基本です

次の第10章では、Pico WをWi-Fiへ接続し、 IPアドレスとネットワーク上の役割を確認します。