概要
温湿度センサーは、周囲の空気の温度(°C)と相対湿度(%RH)を測定するセンサーです。環境モニタリング・空調制御・IoTデバイス・気象観測・農業・食品保管・産業プロセス管理など、幅広い分野で使われる最も普及したセンサーの一つです。
現代の温湿度センサーは、温度検出と湿度検出を一体化したモジュールとして提供されることが多く、I2CやSPIなどのデジタルインターフェースでマイコンと接続できます。代表的なチップにはBosch BME280(温度・湿度・気圧の3機能統合)、Sensirion SHT4xシリーズ、AOSONG DHT11/DHT22などがあります。
温度センサーと湿度センサーは物理的に別の検出方式を使いますが、一体化することで同一の熱的条件・空間での同時計測が可能となり、露点計算・不快指数の計算など湿熱関係の推定精度が向上します。
歴史・背景
温度計の歴史は16世紀のガリレオによる空気温度計に遡ります。電気的な温度センサーとしては、熱電対(1821年、ゼーベック効果発見)と白金抵抗温度計(1871年、シーメンス)が19世紀に実用化され、現在も産業計測の標準として使われています。
湿度計(ハイグロメータ)は、毛髪が湿度変化で伸縮する性質を利用した毛髪湿度計(1783年、ソシュール)が古典的な例です。電気的な湿度センサーは20世紀に入ってから実用化されました。
現代のデジタル温湿度センサーの普及を大きく促したのは、2000年代のSensirion社(スイス)によるSHTシリーズの登場です。SHT11(2002年)は当時非常に高精度な温湿度センサーモジュールとして注目を集め、I2Cインターフェースで簡単に接続できることからエンジニアの間で急速に普及しました。2010年代にはDHT11/DHT22(安価なワイヤーバスセンサー)がArduinoコミュニティで爆発的に普及し、Bosch BME280が温度・湿度・気圧の3機能を数百円で提供したことでIoT分野での利用が加速しました。
技術仕様
代表的な温湿度センサーの比較
| センサー | 温度精度 | 湿度精度 | 温度範囲 | 湿度範囲 | I/F | 備考 |
|---|---|---|---|---|---|---|
| DHT11 | ±2°C | ±5%RH | 0〜50°C | 20〜90%RH | 1-Wire独自 | 安価・低精度 |
| DHT22 | ±0.5°C | ±2%RH | -40〜80°C | 0〜100%RH | 1-Wire独自 | DHT11の高精度版 |
| BME280 | ±1.0°C | ±3%RH | -40〜85°C | 0〜100%RH | I2C/SPI | 気圧も計測 |
| SHT31 | ±0.3°C | ±2%RH | -40〜125°C | 0〜100%RH | I2C | 産業グレード |
| SHT41 | ±0.2°C | ±1.8%RH | -40〜125°C | 0〜100%RH | I2C | 最新高精度 |
| HDC2080 | ±0.2°C | ±2%RH | -40〜85°C | 0〜100%RH | I2C | TI製・低消費電力 |
| Si7021 | ±0.4°C | ±3%RH | -40〜125°C | 0〜80%RH | I2C | Silicon Labs製 |
温度センサーの種類
サーミスタ(Thermistor)
温度係数(NTC:負特性):
R(T) = R₀ × exp[B × (1/T - 1/T₀)]
R₀: 25°C時の抵抗値(例: 10kΩ)
B: B定数(材料固有, 例: 3950K)
T: 絶対温度(K)
非線形特性のため、Steinhart-Hart式でより精度よく温度変換:
1/T = A + B×ln(R) + C×(ln(R))³
NTCサーミスタは安価で感度が高く、広く使われますが非線形特性のためADC+変換式が必要です。
RTD(白金抵抗温度計)
白金(Pt)の抵抗が温度に比例して変化する性質を利用。PT100(0°C時100Ω)・PT1000(0°C時1000Ω)が産業標準です。高精度ですが高価で、4線式計測が推奨されます。
R(T) = R₀ × [1 + A×T + B×T² + C×(T-100)×T³]
A = 3.9083×10⁻³, B = -5.775×10⁻⁷ (0〜850°C)
熱電対(Thermocouple)
異種金属接合部の温起電力(ゼーベック効果)を利用。高温(〜1300°C)計測が可能で、K型(ニッケル合金)が最も一般的です。微小電圧(数mV)のため専用ICが必要です。
ICバンドギャップ温度センサー
シリコンのpn接合の特性を利用した温度センサー。LM35・DS18B20などの単体センサーICから、MCU内蔵の温度センサーまで幅広く使われます。精度はRTDに劣りますが安価で扱いやすい。
湿度センサーの種類
容量式湿度センサー(Capacitive)
感湿ポリマー膜が水分を吸収すると誘電率が変化し、静電容量が変わる原理を利用。現代の高精度デジタル湿度センサー(SHT4x、BME280等)はほぼこの方式です。
C(RH) = C₀ × (1 + α × RH)
α: 湿度容量係数(センサー固有)
RH: 相対湿度(0〜100%)
抵抗式湿度センサー(Resistive)
感湿材料の電気抵抗が湿度で変化する方式。安価ですが精度・長期安定性に劣ります。DHT11はこの方式です。
動作原理
相対湿度(Relative Humidity)の定義
相対湿度は「現在の空気中の水蒸気量(水蒸気分圧)」を「同温度での飽和水蒸気量(飽和水蒸気圧)」で割った割合です。
RH = (e / es(T)) × 100 [%]
e: 現在の水蒸気分圧 [hPa]
es(T): 温度Tでの飽和水蒸気圧 [hPa]
テテンスの式(飽和水蒸気圧の近似):
es(T) = 6.1078 × 10^(7.5T / (237.3 + T)) [hPa]
(T: 気温 [°C])
温度が変わると飽和水蒸気量が変わるため、水蒸気量が同じでも相対湿度は変化します。例えば同じ空気が15°C(湿度70%)から25°C(湿度約40%)に温まるとRHが下がります。
露点温度(Dew Point)の計算
露点温度は空気を冷やしたときに結露が始まる温度で、絶対的な水分量の指標です。
import math
def dew_point(T, RH):
"""
Magnus式による露点温度計算
T: 気温 [°C]
RH: 相対湿度 [%]
戻り値: 露点温度 [°C]
"""
a = 17.62
b = 243.12 # [°C]
alpha = math.log(RH / 100.0) + a * T / (b + T)
dp = b * alpha / (a - alpha)
return dp
# 例: 25°C, 60%RH の露点
print(f"露点: {dew_point(25, 60):.1f}°C") # → 16.7°C
絶対湿度と不快指数
def absolute_humidity(T, RH):
"""絶対湿度 [g/m³] の計算"""
es = 6.1078 * 10 ** (7.5 * T / (237.3 + T)) # 飽和水蒸気圧 [hPa]
e = es * RH / 100.0 # 水蒸気圧 [hPa]
return 216.7 * e / (T + 273.15) # [g/m³]
def discomfort_index(T, RH):
"""不快指数(Thom's Discomfort Index)"""
return 0.81 * T + 0.01 * RH * (0.99 * T - 14.99) + 46.3
# 75以上: 不快, 80以上: ほぼ全員不快
用途・ユースケース
スマートホーム・ビル管理
室内の温湿度をBLEやZigBee、Wi-Fiを介してスマートフォンやクラウドに送信し、エアコン・加湿器・換気扇を自動制御します。ESP32+BME280の組み合わせは最も普及したIoT環境センサーの一例です。
農業・温室管理
植物の生育に適した温湿度を管理するため、温室内に多数の温湿度センサーを配置し、LoRaWANで農場全体を監視します。露点計算で結露リスクを判断し、換気タイミングを自動制御します。
食品・医薬品の保管・輸送管理
コールドチェーンの品質確保のため、冷蔵庫・倉庫・輸送コンテナの温湿度をMQTT経由でリアルタイム監視します。規制上の要件(GMP等)から、計測値のログ記録と警告発報が義務付けられる場合があります。
気象観測・環境モニタリング
アマチュア気象ステーション(Raspberry Pi + BME280等)から、国土交通省・気象庁の地上観測網まで幅広く使われます。温湿度気圧のセットで気象データロガーを構成します。
電子機器・サーバーの冷却管理
データセンターの温度管理、電子機器の熱対策に使われます。結露は電子回路の故障原因となるため、露点管理も重要です。
工業プロセス制御
塗装工場(塗膜の乾燥条件管理)、半導体製造クリーンルーム(湿度制御)、木材乾燥炉(含水率管理)など、製品品質に直結する工業プロセスで高精度計測が求められます。
実装・開発のポイント
BME280 I2C読み取り(MicroPython / Raspberry Pi Pico)
from machine import I2C, Pin
import struct, time
class BME280:
"""BME280 温度・湿度・気圧センサードライバ(簡略版)"""
def __init__(self, i2c, addr=0x76):
self.i2c = i2c
self.addr = addr
self._read_calibration()
# 計測設定: 温度・湿度・気圧 各オーバーサンプリング×1, ノーマルモード
self._write(0xF2, 0x01) # hum ctrl: osrs_h=1
self._write(0xF4, 0x27) # ctrl_meas: osrs_t=1, osrs_p=1, mode=normal
def _write(self, reg, val):
self.i2c.writeto_mem(self.addr, reg, bytes([val]))
def _read(self, reg, length):
return self.i2c.readfrom_mem(self.addr, reg, length)
def _read_calibration(self):
cal = self._read(0x88, 26)
self.T1, self.T2, self.T3 = struct.unpack_from('<HhH', cal, 0)[:3]
# 省略: 気圧・湿度補正係数も同様に読み取る
def read_temperature(self):
raw = self._read(0xFA, 3)
adc_T = ((raw[0] << 16) | (raw[1] << 8) | raw[2]) >> 4
var1 = (adc_T / 16384.0 - self.T1 / 1024.0) * self.T2
var2 = (adc_T / 131072.0 - self.T1 / 8192.0) ** 2 * self.T3
self.t_fine = int(var1 + var2)
return self.t_fine / 5120.0 # [°C]
# 使用例
i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=400000)
sensor = BME280(i2c)
while True:
temp = sensor.read_temperature()
print(f"温度: {temp:.2f}°C")
time.sleep(1)
DHT22(独自1-Wireプロトコル)の実装
DHT11/DHT22は専用のシリアルプロトコルを使い、1本の信号線で温湿度を送信します。
// DHT22 読み取り(C言語、タイムクリティカルな処理)
#include <stdint.h>
#include "gpio_hal.h"
#include "delay_us.h"
#define DHT_PIN GPIO_PIN_5
int dht22_read(float *temperature, float *humidity) {
uint8_t data[5] = {0};
// スタートシグナル: 最低1msのLOW → HIGH
gpio_set_output(DHT_PIN);
gpio_write(DHT_PIN, 0);
delay_ms(18); // 18ms LOW
gpio_write(DHT_PIN, 1);
delay_us(40);
gpio_set_input_pullup(DHT_PIN);
// センサー応答待ち
uint32_t timeout = 0;
while (gpio_read(DHT_PIN) == 1) { if (++timeout > 10000) return -1; }
while (gpio_read(DHT_PIN) == 0) { if (++timeout > 10000) return -1; }
while (gpio_read(DHT_PIN) == 1) { if (++timeout > 10000) return -1; }
// 40ビット読み取り
for (int i = 0; i < 40; i++) {
while (gpio_read(DHT_PIN) == 0); // LOWパルス待ち
delay_us(35); // 50μs以上でHIGH="1", 35μsで判定
data[i / 8] <<= 1;
if (gpio_read(DHT_PIN) == 1) data[i / 8] |= 1;
while (gpio_read(DHT_PIN) == 1); // HIGHパルス終了待ち
}
// チェックサム確認
if ((data[0] + data[1] + data[2] + data[3]) != data[4]) return -2;
*humidity = ((data[0] << 8) | data[1]) / 10.0f;
*temperature = (((data[2] & 0x7F) << 8) | data[3]) / 10.0f;
if (data[2] & 0x80) *temperature = -(*temperature);
return 0;
}
センサー精度の最大化
- 十分な加温時間(ウォームアップ): センサー通電後、安定した読み取りまで数秒〜数分待つ(DHT22は2秒以上)
- 直射日光・輻射熱を避ける: センサーに直接熱が当たると誤差が増大する
- 通気性の確保: センサー周囲の気流が少ないと正確な環境温度を反映しない
- 自己加熱対策: I2Cセンサーの一部は消費電力で自己発熱するため、間欠測定モードを使用
- 複数点キャリブレーション: 精度が求められる場合は、校正済みセンサーと比較してオフセット補正
間欠測定による省電力化
IoTデバイスでは電池寿命のため、必要なときだけセンサーを起動します。
// センサーの電源をGPIOで制御する省電力構成例
void measure_and_sleep(void) {
// センサーに電源投入
gpio_write(SENSOR_VCC_PIN, 1);
delay_ms(100); // センサー安定待ち
// I2C初期化・計測
bme280_init();
float temp, hum, pres;
bme280_read(&temp, &hum, &pres);
// センサー電源OFF
gpio_write(SENSOR_VCC_PIN, 0);
// データ送信・処理
send_data(temp, hum, pres);
// MCUディープスリープ(次の計測まで)
sleep_deep_seconds(60); // 1分ごとに計測
}
他技術との比較
主要温湿度センサーの用途別比較
| 比較項目 | DHT11/DHT22 | BME280 | SHT4x | 産業用PT100+抵抗湿度計 |
|---|---|---|---|---|
| 精度 | 低〜中 | 中 | 高 | 非常に高い |
| 価格 | 非常に安価(数十〜百円) | 安価(数百円) | 中程度(数百〜千円) | 高価(数千〜数万円) |
| インターフェース | 独自1-Wire | I2C/SPI | I2C | アナログ+ICが必要 |
| 気圧計測 | なし | あり | なし | なし(別センサー) |
| 主な用途 | 教育・ホビー | IoT・ホビー〜産業入門 | IoT・産業 | 産業計測・気象 |
| 寿命・信頼性 | 低(数年) | 中 | 高(長期安定) | 非常に高い |
デジタルセンサー(I2C)vs アナログ温度センサー
| 比較項目 | デジタル温湿度センサー | アナログ温度センサー(サーミスタ等) |
|---|---|---|
| 湿度計測 | 一体で計測可能 | 別途湿度センサーが必要 |
| ADCの要否 | 不要 | MCU内蔵ADCが必要 |
| ノイズ | 低い | 配線・EMI影響あり |
| 実装難易度 | I2Cプロトコル必要 | ADC+変換計算で実装容易 |
| コスト | やや高い | 非常に安価 |
| 長距離配線 | 数mが限界(I2C) | 差動回路・4〜20mAで長距離可 |