Raspberry PiでCO2濃度を測定|MH-Z19Cセンサーの接続・データ取得・活用法まとめ

目次

はじめに

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)を強く吸収するという性質があります。その性質を使って、次のステップで濃度を検出します。

STEP
赤外線発光

センサー内部の赤外線LEDから、空気中へ赤外線を照射

STEP
吸収

CO₂がその赤外線を一部吸収する

STEP
検出

残った赤外線量を受光器で検出

STEP
計算

吸収量からCO₂濃度を算出

赤外線が通る空間でCO₂の濃度が高いと受光器へ届く赤外線量が減る。その減り方から濃度を求めるという仕組み。

なぜ赤外線なのか?

CO₂の分子が、赤外線のうち約4.26µmの波長だけをよく吸収するためです。

気体吸収しやすい赤外線の波長(μm)
CO2(二酸化炭素)4.26
CH4(メタン)3.3
CO(一酸化炭素)4.6

NDIR方式の強み

項目特徴
精度高い(ppm単位で検出可能)
選択性CO2だけを検出できる
長期安定性劣化が少ない
応答精度数秒以内

配線

OLEDの接続は以前の記事を参照ください

RaspberryPi PicoMH-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₂取得応答
2CO2値(上位バイト)CO₂濃度の上位8ビット
3CO2値(下位バイト)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秒

まとめ

二酸化炭素濃度が高いと眠くなったり、気分が悪くなったりします。換気の目安になりますのでぜひ可視化してみてください。また、植物や作物を育てている方は二酸化炭素濃度をコントロールする必要があると思いますので、ぜひご活用ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次