M5Stackで時計&天気表示

Clock & weather display ・ 时钟天气显示

CoreS3 で時計と天気を表示するデスク端末。ENV III で温湿度・気圧を計測し、OLED に補足情報を表示。

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

部品リスト(BOM)

部品役割ポートリンク・価格
M5Stack CoreS3Controller with screengrove_i2c, grove_analog, grove_uart, mbus, usb_c, sdcardofficial page — $59.9
Unit PaHub2I2C hubgrove_i2cofficial page — $7.95
Unit ENV IIITemp / humidity / pressuregrove_i2cofficial page — $5.95
Unit OLEDOLED displaygrove_i2cofficial page — $10.95

配線

作り方

M5Stack CoreS3とUnit PaHub2、ENV III、OLEDを使って、時計と天気を表示するデスクターミナルを作ります。ENV IIIが温度・湿度・気圧を測定し、OLEDに追加情報を表示します。PaHub2でI2Cユニットをまとめて接続します。

  1. 部品を用意する — 用意するもの:M5Stack CoreS3本体、Unit PaHub2(I2Cハブ)、Unit ENV III(温湿度・気圧センサー)、Unit OLED(1.3インチ有機ELディスプレイ)、Groveケーブル3本(各ユニットに付属)、CoreS3とパソコンをつなぐUSB-Cケーブル。
  2. PaHub2をCoreS3に接続する — Groveケーブル1本で、PaHub2のGrove端子(どちらでも可)とCoreS3のPort.A(赤色のI2Cポート)をつなぎます。コネクタは一方向にしか入らないので、無理に押し込まないでください。
  3. ENV IIIをPaHub2に接続する — 2本目のGroveケーブルで、ENV IIIのGrove端子とPaHub2の空いているGrove端子(チャンネル0〜5のどれか)をつなぎます。
  4. OLEDをPaHub2に接続する — 3本目のGroveケーブルで、OLEDのGrove端子とPaHub2の別の空いているGrove端子をつなぎます。
  5. パソコンにつないでMicroPythonを書き込む — USB-CケーブルでCoreS3をパソコンにつなぎます。UIFlowやThonnyなどのツールで、CoreS3にMicroPythonファームウェアが入っていることを確認し、下のコードをデバイスにコピーして実行します。
  6. 動作を確認する — コードを実行すると、CoreS3の画面に現在の日時と温度・湿度・気圧が表示され、OLEDにも同じ情報が表示されます。表示が正しいか確認してください。

サンプルコード(micropython)

# M5Stack CoreS3 + PaHub2 + ENV III + OLED
# Wiring:
#   CoreS3 Port.A (red I2C) -> PaHub2
#   PaHub2 ch0 -> ENV III
#   PaHub2 ch1 -> OLED
import time
from machine import Pin, I2C
from m5stack import lcd
import ntptime
import network

# I2C setup for CoreS3 (Port.A: sda=12, scl=11)
i2c = I2C(0, sda=Pin(12), scl=Pin(11), freq=400000)

# TCA9548A address (PaHub2)
TCA_ADDR = 0x70

def select_channel(ch):
    i2c.writeto(TCA_ADDR, bytes([1 << ch]))

# ENV III: SHT30 (0x44), QMP6988 (0x70)
# OLED: SH1107 (0x3C)

# Initialize OLED (SH1107) via channel 1
select_channel(1)
import sh1107
display = sh1107.SH1107_I2C(128, 64, i2c)

# Connect to WiFi for NTP (optional, for time sync)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('your_ssid', 'your_password')
while not wlan.isconnected():
    time.sleep(1)
ntptime.settime()

# Helper to read SHT30 (temperature, humidity)
def read_sht30():
    select_channel(0)
    i2c.writeto(0x44, b'\x2C\x06')
    time.sleep_ms(50)
    data = i2c.readfrom(0x44, 6)
    temp = -45 + 175 * ((data[0] << 8 | data[1]) / 65535.0)
    hum = 100 * ((data[3] << 8 | data[4]) / 65535.0)
    return temp, hum

# Helper to read QMP6988 (pressure)
def read_qmp6988():
    select_channel(0)
    # Simplified: read raw pressure (requires calibration in full code)
    i2c.writeto(0x70, b'\xF4\x34')
    time.sleep_ms(10)
    data = i2c.readfrom_mem(0x70, 0xF7, 3)
    raw = (data[0] << 16 | data[1] << 8 | data[2]) & 0xFFFFFF
    pressure = raw / 256.0  # approximate, real conversion needs calibration
    return pressure

while True:
    temp, hum = read_sht30()
    press = read_qmp6988()
    # Get local time (UTC+9 for Japan)
    import machine
    rtc = machine.RTC()
    now = rtc.datetime()
    # Format time string
    time_str = "%04d-%02d-%02d %02d:%02d:%02d" % (now[0], now[1], now[2], now[4], now[5], now[6])
    
    # Display on CoreS3
    lcd.clear()
    lcd.print(time_str, 10, 10)
    lcd.print("Temp: %.1f C" % temp, 10, 40)
    lcd.print("Hum: %.1f %%" % hum, 10, 70)
    lcd.print("Press: %.1f hPa" % press, 10, 100)
    
    # Display on OLED
    display.fill(0)
    display.text(time_str, 0, 0, 1)
    display.text("Temp: %.1f C" % temp, 0, 16, 1)
    display.text("Hum: %.1f %%" % hum, 0, 32, 1)
    display.text("Press: %.1f hPa" % press, 0, 48, 1)
    display.show()
    
    time.sleep(10)

コツ・安全上の注意

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

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

エディタで開く →

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