Comfort index display ・ 舒适度显示
温度・湿度・CO2を測定し、不快指数を計算して画面に表示します。
この構成をエディタで開く・編集する →| 部品 | 役割 | ポート | リンク・価格 |
|---|---|---|---|
| M5Stack Core2 | Controller with display | grove_i2c, grove_analog, grove_uart, mbus | official page — $46.9 |
| Unit PaHub2 | I2C hub (1→6) | grove_i2c | official page — $7.95 |
| Unit ENV III | Temp / humidity / pressure | grove_i2c | official page — $5.95 |
| Unit CO2 | CO2 sensor | grove_i2c | official page — $33.9 |
M5Stack Core2とPaHub2、ENV III、CO2ユニットを使って、温度・湿度・CO2濃度を測定し、不快指数を計算して表示する装置です。PaHub2でI2Cバスを拡張し、複数のセンサーを同時に使います。
# 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® 製品向けの非公式ツール。作りたいものを書くと、部品リストと配線図が出ます。