M5Stackで貯水タンク水位監視

Water tank level monitor ・ 水箱水位监测

超音波距離センサで貯水タンクの水位を監視します。

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

部品リスト(BOM)

部品役割ポートリンク・価格
M5Stack Core2Controllergrove_i2c, grove_analog, grove_uart, mbusofficial page — $46.9
Unit Ultrasonic-IO (UNIT SONIC IO)Ultrasonic distance sensorgrove_analogofficial page — $5.95

配線

作り方

M5Stack Core2と超音波距離センサー「Unit Ultrasonic-IO」を使って、貯水タンクの水位を監視する装置です。センサーが水面までの距離を測り、Core2の画面に水位を表示します。水が少なくなるとアラートを出すこともできます。

  1. 部品を用意する — 用意するもの:M5Stack Core2本体、Unit Ultrasonic-IO(超音波距離センサーユニット)、Groveケーブル(ユニットに付属)、USB-Cケーブル(Core2とパソコンをつなぐ用)。
  2. センサーをタンクの上に設置する — Unit Ultrasonic-IOの超音波プローブ(丸い面)を、タンクの水面に向けて真下に向けます。プローブと水面の間に障害物がないようにし、プローブが水に触れないように注意してください。センサーはタンクのふたなどに固定します。
  3. GroveケーブルでCore2とセンサーをつなぐ — Groveケーブルの一端をUnit Ultrasonic-IOのポートに差し込みます。もう一端をCore2の黒いPort.B(アナログ/IOポート)に差し込みます。コネクタは一方向にしか入らないので、無理に押し込まないでください。
  4. Core2をパソコンにつないでMicroPythonを書き込む — USB-CケーブルでCore2をパソコンにつなぎます。UIFlowやThonnyなどのツールで、Core2にMicroPythonファームウェアが入っていることを確認し、下のコードをデバイスにコピーして実行します。
  5. 距離の値を確認する — コードを実行すると、Core2の画面にセンサーから水面までの距離(cm)が表示されます。タンクが満水のときと空のときの値をメモし、必要に応じてコード内のしきい値を調整します。
  6. 動作をテストする — タンクの水位を変えて(または手でセンサーの前を遮って)距離が変わることを確認します。画面の表示が正しく更新されれば成功です。

サンプルコード(micropython)

# M5Stack Core2 + Unit Ultrasonic-IO (water tank level monitor)
# Wiring: Unit Ultrasonic-IO -> Core2 black Port.B (analog/GPIO)
import time
from machine import Pin, ADC
from m5stack import lcd

# Port.B pins on Core2: GPIO 36 (analog input) and GPIO 26 (digital output)
# For Unit Ultrasonic-IO, we use GPIO 26 to trigger and GPIO 36 to read echo.
# However, the unit uses a single-wire protocol (trigger + echo on same pin).
# We'll use GPIO 26 as both trigger and echo (open-drain with pull-up).
# Actually, the unit is connected to Port.B, which has two pins: 36 (ADC) and 26 (GPIO).
# The unit uses a single signal line (SIG) which we connect to GPIO 26.
# We'll use GPIO 26 for both trigger and echo.

TRIG = Pin(26, Pin.OUT)
ECHO = Pin(26, Pin.IN)

def get_distance():
    # Send 10us trigger pulse
    TRIG.value(0)
    time.sleep_us(2)
    TRIG.value(1)
    time.sleep_us(10)
    TRIG.value(0)
    
    # Wait for echo start (timeout 1s)
    timeout = time.ticks_us() + 1000000
    while ECHO.value() == 0:
        if time.ticks_us() > timeout:
            return -1
    start = time.ticks_us()
    
    # Wait for echo end
    timeout = time.ticks_us() + 1000000
    while ECHO.value() == 1:
        if time.ticks_us() > timeout:
            return -1
    end = time.ticks_us()
    
    # Calculate distance (speed of sound = 34300 cm/s)
    duration = end - start
    distance = duration * 34300 / 2 / 1000000  # cm
    return distance

lcd.clear()
lcd.print("Water Level Monitor", 10, 10)

while True:
    dist = get_distance()
    if dist < 0:
        lcd.print("Error: no echo", 10, 50)
    else:
        lcd.print("Distance: %.1f cm" % dist, 10, 50)
        # Assume tank depth is known, e.g., 100 cm
        tank_depth = 100  # change to your tank depth
        water_level = tank_depth - dist
        if water_level < 0:
            water_level = 0
        lcd.print("Water level: %.1f cm" % water_level, 10, 80)
        if water_level < 20:
            lcd.print("WARNING: Low water!", 10, 110)
    time.sleep(1)

コツ・安全上の注意

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

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

エディタで開く →

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