M5Stackで空気質モニター

Air quality monitor ・ 空气质量监测

PM2.5粒子状物質とTVOC/eCO2をI2Cセンサーで測定。PaHub経由で接続。

この構成をエディタで開く・編集する →

部品リスト(BOM)

部品役割ポートリンク・価格
M5Stack Core2Controllergrove_i2c, grove_analog, grove_uart, mbusofficial page — $46.9
Unit PaHub2I2C hub (1→6)grove_i2cofficial page — $7.95
Module Air Quality (PM2.5)PM2.5 sensormbus, i2cofficial page — $31.9
Unit Mini TVOC/eCO2 (SGP30)TVOC/eCO2 sensorgrove_i2cofficial page — $10.95

配線

作り方

M5Stack Core2とPaHub2、PM2.5モジュール、TVOC/eCO2ユニットを使った空気品質モニターです。PaHub2でI2Cバスを拡張し、2つのセンサーを同時に接続します。PM2.5モジュールはM-Bus経由、TVOCユニットはGrove I2C経由でPaHub2に接続します。Core2の画面にPM2.5、TVOC、eCO2の値を表示します。

  1. 部品を用意する — 用意するもの:M5Stack Core2本体、Unit PaHub2、Module Air Quality (PM2.5)、Unit Mini TVOC/eCO2 (SGP30)、Groveケーブル2本(PaHub2に付属)、Core2とパソコンをつなぐUSB-Cケーブル。
  2. PaHub2をCore2に接続する — Groveケーブル(I2C用)を使って、PaHub2の入力ポート(IN)とCore2のPort.A(赤色)を接続します。コネクタは一方向にしか入らないので、向きを確認して差し込んでください。
  3. PM2.5モジュールをPaHub2に接続する — PM2.5モジュールはM-Busコネクタを持ちますが、PaHub2のGroveポートに接続するには変換が必要です。PM2.5モジュールのM-Busポートに付属のGrove変換ケーブル(または別途用意したM-Bus to Groveケーブル)を接続し、そのGroveケーブルをPaHub2のチャンネル1(CH1)に差し込みます。
  4. TVOCユニットをPaHub2に接続する — もう1本のGroveケーブルで、TVOCユニットとPaHub2のチャンネル2(CH2)を接続します。これで2つのI2Cセンサーが別々のチャンネルで動作します。
  5. パソコンにつないでMicroPythonを書き込む — USB-CケーブルでCore2をパソコンにつなぎます。UIFlowやThonnyなどのツールで、Core2にMicroPythonファームウェアが入っていることを確認し、下のコードをデバイスにコピーして実行します。
  6. 動作を確認する — コードを実行すると、Core2の画面にPM2.5、TVOC、eCO2の値が表示されます。センサーの前で息を吹きかけるなどして値が変化することを確認してください。

サンプルコード(micropython)

# M5Stack Core2 + PaHub2 + PM2.5 (PMSA003) + TVOC/eCO2 (SGP30)
# Wiring: Core2 Port.A -> PaHub2 IN
#         PaHub2 CH1 -> PM2.5 Module (via M-Bus to Grove)
#         PaHub2 CH2 -> TVOC Unit
import time
from machine import Pin, I2C
from m5stack import lcd

# Initialize I2C on Core2 Port.A (default pins: scl=22, sda=21)
i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=100000)

# TCA9548A address (PaHub2)
TCA_ADDR = 0x70

def select_channel(ch):
    """Select a channel on the PaHub2 (0-5)."""
    i2c.writeto(TCA_ADDR, bytes([1 << ch]))

# PMSA003 I2C address (PM2.5 module)
PMSA_ADDR = 0x12
# SGP30 I2C address (TVOC unit)
SGP30_ADDR = 0x58

def read_pm25():
    """Read PM2.5 value from PMSA003 (channel 0)."""
    select_channel(0)
    time.sleep_ms(10)
    # Request data (command 0xe1, 0x00)
    i2c.writeto(PMSA_ADDR, bytes([0xe1, 0x00]))
    time.sleep_ms(10)
    data = i2c.readfrom(PMSA_ADDR, 32)
    if len(data) >= 12:
        pm25 = data[6] * 256 + data[7]
        return pm25
    return 0

def read_sgp30():
    """Read TVOC and eCO2 from SGP30 (channel 1)."""
    select_channel(1)
    time.sleep_ms(10)
    # Send measure command (0x20, 0x08)
    i2c.writeto(SGP30_ADDR, bytes([0x20, 0x08]))
    time.sleep_ms(50)  # wait for measurement
    data = i2c.readfrom(SGP30_ADDR, 6)
    if len(data) == 6:
        eco2 = data[0] * 256 + data[1]
        tvoc = data[3] * 256 + data[4]
        return tvoc, eco2
    return 0, 0

while True:
    pm25 = read_pm25()
    tvoc, eco2 = read_sgp30()
    lcd.clear()
    lcd.print('PM2.5: %d ug/m3' % pm25, 10, 20)
    lcd.print('TVOC: %d ppb' % tvoc, 10, 60)
    lcd.print('eCO2: %d ppm' % eco2, 10, 100)
    time.sleep(2)

コツ・安全上の注意

この作り方はAIが構成から生成したものです(未検証)。通電前に配線とコードをご確認ください。

この構成はAIが実在するM5Stack部品から設計し、ポート互換をサーバで検証したものです。編集・共有できます。

エディタで開く →

UnitKit は M5Stack® 製品向けの非公式ツール。作りたいものを書くと、部品リストと配線図が出ます。