M5Stackで快適度ディスプレイ

Comfort index display ・ 舒适度显示

温度・湿度・CO2を測定し、不快指数を計算して画面に表示します。

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

部品リスト(BOM)

部品役割ポートリンク・価格
M5Stack Core2Controller with displaygrove_i2c, grove_analog, grove_uart, mbusofficial page — $46.9
Unit PaHub2I2C hub (1→6)grove_i2cofficial page — $7.95
Unit ENV IIITemp / humidity / pressuregrove_i2cofficial page — $5.95
Unit CO2CO2 sensorgrove_i2cofficial page — $33.9

配線

作り方

M5Stack Core2とPaHub2、ENV III、CO2ユニットを使って、温度・湿度・CO2濃度を測定し、不快指数を計算して表示する装置です。PaHub2でI2Cバスを拡張し、複数のセンサーを同時に使います。

  1. 部品を用意する — 用意するもの:M5Stack Core2本体、Unit PaHub2、Unit ENV III、Unit CO2、Groveケーブル3本(各ユニットに付属)、Core2とパソコンをつなぐUSB-Cケーブル。
  2. PaHub2をCore2に接続する — Groveケーブル1本で、PaHub2の入力ポート(INと書かれた方)とCore2の赤いPort.A(I2Cポート)をつなぎます。コネクタは一方向にしか入らないので、向きを確認して差し込んでください。
  3. ENV IIIをPaHub2に接続する — 2本目のGroveケーブルで、ENV IIIとPaHub2のチャンネル0(CH0)ポートをつなぎます。
  4. CO2ユニットをPaHub2に接続する — 3本目のGroveケーブルで、CO2ユニットとPaHub2のチャンネル1(CH1)ポートをつなぎます。
  5. パソコンにつないでMicroPythonを書き込む — USB-CケーブルでCore2をパソコンにつなぎます。UIFlowやThonnyなどのツールで、Core2にMicroPythonファームウェアが入っていることを確認し、下のコードをデバイスにコピーして実行します。
  6. 動作を確認する — コードを実行すると、Core2の画面に温度、湿度、CO2濃度、不快指数が表示されます。数値が正しく表示されるか確認してください。CO2濃度は屋外で約400ppm、室内で1000ppm前後が目安です。

サンプルコード(micropython)

# M5Stack Core2 + PaHub2 + ENV III + CO2
# Wiring:
#   Core2 Port.A (red) -> PaHub2 IN
#   PaHub2 CH0 -> ENV III
#   PaHub2 CH1 -> CO2
import time
from machine import Pin, I2C
from m5stack import lcd

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

# TCA9548A multiplexer address (PaHub2)
MUX_ADDR = 0x70

def select_channel(ch):
    """Select one of 6 channels on PaHub2."""
    i2c.writeto(MUX_ADDR, bytes([1 << ch]))

def read_sht30():
    """Read temperature and humidity from SHT30 on ENV III."""
    select_channel(0)
    # SHT30 address 0x44
    i2c.writeto(0x44, b'\x2C\x06')  # high repeatability, clock stretching disabled
    time.sleep_ms(50)
    data = i2c.readfrom(0x44, 6)
    if len(data) != 6:
        return None, None
    raw_temp = (data[0] << 8) | data[1]
    raw_hum = (data[3] << 8) | data[4]
    temp = -45 + 175 * raw_temp / 65535.0
    hum = 100 * raw_hum / 65535.0
    return temp, hum

def read_scd40():
    """Read CO2, temperature, humidity from SCD40 on CO2 unit."""
    select_channel(1)
    # SCD40 address 0x62
    # Start measurement
    i2c.writeto(0x62, b'\x21\xB1')  # start periodic measurement
    time.sleep_ms(500)
    # Read measurement
    i2c.writeto(0x62, b'\xEC\x05')  # read measurement command
    time.sleep_ms(50)
    data = i2c.readfrom(0x62, 9)
    if len(data) != 9:
        return None, None, None
    # CRC check skipped for simplicity
    co2 = (data[0] << 8) | data[1]
    temp = -45 + 175 * ((data[3] << 8) | data[4]) / 65535.0
    hum = 100 * ((data[6] << 8) | data[7]) / 65535.0
    return co2, temp, hum

def discomfort_index(temp, hum):
    """Calculate discomfort index (Thom's formula)."""
    if temp is None or hum is None:
        return None
    return 0.81 * temp + 0.01 * hum * (0.99 * temp - 14.3) + 46.3

while True:
    temp1, hum1 = read_sht30()
    co2, temp2, hum2 = read_scd40()
    # Use ENV III values for display (more accurate)
    temp = temp1 if temp1 is not None else temp2
    hum = hum1 if hum1 is not None else hum2
    di = discomfort_index(temp, hum)
    lcd.clear()
    lcd.print('Temp: {:.1f}C'.format(temp), 10, 20)
    lcd.print('Hum: {:.1f}%'.format(hum), 10, 50)
    lcd.print('CO2: {} ppm'.format(co2), 10, 80)
    lcd.print('DI: {:.1f}'.format(di), 10, 110)
    time.sleep(2)

コツ・安全上の注意

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

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

エディタで開く →

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