はじめに
CO₂センサーMH-Z19Cは、室内の二酸化炭素濃度を測定できるデジタルセンサーです。換気管理や空気質の監視など、多様な用途があります。今回は、ラズベリーパイPicoからMH-Z19Cのデータ取得方法を説明します。

MH-Z19Cの概要
・MH-Z19Cは赤外線方式(NDIR)でCO₂濃度を検出できるセンサー
・電源電圧:5V
・通信方式:UART
・測定範囲:400〜5000 ppm
・更新周期:およそ2秒
※ 通信ピン(TX/RX)は3.3V対応のため、Picoからそのまま接続可能です
MH-Z19Cのガス検知メカニズム
MH-Z19C は、NDIR方式 (Non Dispersive Infrared:非分散型赤外線)という方式を使っています。
原理の概略
CO₂ は、特定の赤外線波長(約4.26µm)を強く吸収するという性質があります。その性質を使って、次のステップで濃度を検出します。
センサー内部の赤外線LEDから、空気中へ赤外線を照射
CO₂がその赤外線を一部吸収する
残った赤外線量を受光器で検出
吸収量からCO₂濃度を算出
赤外線が通る空間でCO₂の濃度が高いと受光器へ届く赤外線量が減る。その減り方から濃度を求めるという仕組み。
なぜ赤外線なのか?
CO₂の分子が、赤外線のうち約4.26µmの波長だけをよく吸収するためです。
| 気体 | 吸収しやすい赤外線の波長(μm) |
| CO2(二酸化炭素) | 4.26 |
| CH4(メタン) | 3.3 |
| CO(一酸化炭素) | 4.6 |
NDIR方式の強み
| 項目 | 特徴 |
| 精度 | 高い(ppm単位で検出可能) |
| 選択性 | CO2だけを検出できる |
| 長期安定性 | 劣化が少ない |
| 応答精度 | 数秒以内 |
配線
OLEDの接続は以前の記事を参照ください
| RaspberryPi Pico | MH-Z19C |
| VSYS(39番) | VCC |
| GND(38番) | GND |
| GP1(2) | TX |
| GP0(1) | RX |
CO2濃度と温度をOLEDに表示する
CO2濃度と温度をOLEDに表示します。OLEDの接続は下記を参照ください

MH‑Z19Cの応答データ構造
MH-Z19Cからは、以下のような9バイトのデータが取得できます。
| Byte番号 | 意味 | 説明 |
| 0 | スタートバイト | 常に0xFF(データ開始を示す) |
| 1 | コマンド番号 | 0x86:CO₂取得応答 |
| 2 | CO2値(上位バイト) | CO₂濃度の上位8ビット |
| 3 | CO2値(下位バイト) | CO₂濃度の下位8ビット |
| 4 | 温度データ | 温度 = データ値 – 40 (単位:°C) |
| 5 | ステータスフラグ① | デバイスの状態(通常0) |
| 6 | ステータスフラグ② | デバイスの状態(通常0) |
| 7 | ステータスフラグ③ | デバイスの状態(通常0) |
| 8 | チェックサム | データの正当性を検査する値 |
よって、CO2濃度と温度は以下で計算できます。
CO2値 = Byte2 × 256 + Byte3
温度 = Byte4 – 40
from machine import UART, Pin, I2C
import time
import ssd1306
# ---- CO₂センサー側 ----
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
GET_CMD = b'\xFF\x01\x86\x00\x00\x00\x00\x00\x79'
# ---- SSD1306側 ----
i2c = I2C(0, scl=Pin(17), sda=Pin(16), freq=400000)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
while True:
# CO₂取得
uart.write(GET_CMD)
time.sleep(0.1)
if uart.any():
response = uart.read(9)
if response and len(response) == 9:
co2 = response[2] * 256 + response[3]
temperature = response[4] - 40
print(f"CO₂濃度: {co2} ppm / 温度: {temperature} °C")
# ---- OLEDへ表示 ----
oled.fill(0) # 画面クリア
oled.text("CO2 Monitor", 0, 0)
oled.text(f"CO2 : {co2} ppm", 0, 20)
oled.text(f"Temp: {temperature} C", 0, 40)
oled.show()
time.sleep(2) # 次の取得まで2秒まとめ
二酸化炭素濃度が高いと眠くなったり、気分が悪くなったりします。換気の目安になりますのでぜひ可視化してみてください。また、植物や作物を育てている方は二酸化炭素濃度をコントロールする必要があると思いますので、ぜひご活用ください。
コメント