4.3.6 雨水モニタリング

4.3.6.1 概要

Img

スチームセンサーが雨を検知すると、micro:bit ボードに信号を送ってさまざまな動作をトリガーします。例えば、micro:bit のスピーカーがアラームを鳴らして雨を知らせたり、現在の降雨量を OLED にリアルタイム表示したりします。これは屋外の天候や環境で特に有用で、利用者が必要な予防措置を取るのに役立ちます。さらに、スチームセンサー、OLEDディスプレイ、micro:bit ボードを含む雨水監視システムは、屋根や建物の漏水を検知して水の侵入による被害を防ぐことができます。

全体として、さまざまな用途で雨水の存在を検知できる多機能で効果的なツールです。

Img

4.3.6.2 コンポーネントの知識

Img

水検出センサー

Img

このスチームセンサーは水の存在を検知できるため、通常は雨水検知システムに使用されます。雨水がセンサーの導電パッド(検出領域)に接触すると、開発ボード(micro:bit など)に信号を送り、さまざまな動作をトリガーします。検出領域に水が多いほど、アナログ値は大きくなります。

Img

回路図:

Img

基板上の露出した平行線によって水の量を検出します。水が多いほど接続される配線が増え、導通の接触面積が増えるため、検出領域のピン2での電圧出力が徐々に上昇し、信号端子 S で検出されるアナログ値が大きくなります。水以外に空気中の水蒸気も検出できます。

パラメータ:

  • 動作電圧: DC 3.3V~5V

  • 動作電流: (Max)1.5mA@5V

  • 最大消費電力: 0.075W

  • 信号タイプ: アナログ信号

Img

4.3.6.3 必要なコンポーネント

Img

Img

Img

micro:bit V2 main board ×1

micro:bit shield ×1

OLED display ×1

Img

Img

Img

steam sensor ×1

micro USB cable ×1

4 pin wire ×1

Img

Img

Img

3 pin wire ×1

battery holder ×1

AA battery(自分で用意) ×6

4.3.6.4 配線図

⚠️ 配線する際は、ワイヤーの色にご注意ください。

OLED display

wire color

micro:bit shield pin

micro:bit board pin

GND

black

G

G

VCC

red

V2

V

SDA

blue

20

P20

SCL

green

19

P19

steam sensor

wire color

micro:bit shield pin

micro:bit board pin

G

black

G

G

V

red

V1

V

S

yellow

1

P1

Img

4.3.6.5 コードフロー

Img

4.3.6.6 テスト用コード

⚠️ Tip 1: コードを Microbit ボードにダウンロードする前に、ライブラリファイル “oled_ssd1306.py” をインポートしてください。詳しくは MUでのライブラリのインポート” .

Img

⚠️ Tip 2: “if()…elif()…” の閾値は実際の状況に応じて変更できます。

完成コード:

'''
Theme: Rainwater monitoring
Function: OLED displays the amount of rainwater and the steam sensor controls the fan and atomization module
Compiling IDE: MU 1.2.0
Author: https://docs.keyestudio.com
'''
from microbit import *
from oled_ssd1306 import *
import math
import music

# OLEDを初期化
initialize()
clear_oled()

# 設定パラメータ
RAIN_PIN = pin1
WET_VALUE = 1023
DRY_VALUE = 0

def map_value(value, in_min, in_max, out_min, out_max):
    """Linearly map the input values to the output range"""
    if in_max - in_min == 0:
        return out_min
    return (value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min

def get_rain_percentage():
    raw_value = RAIN_PIN.read_analog()
    percentage = map_value(raw_value, DRY_VALUE, WET_VALUE, 0, 100)
    return max(0, min(100, percentage)), raw_value

def get_rain_level(percentage):
    if percentage < 10:
        return "dry", 0
    elif percentage >= 10 and percentage < 20:
        return "slightly wet", 1
    elif percentage >= 20 and percentage < 40:
        return "wet", 2
    elif percentage >= 40 and percentage < 60:
        return "Very wet", 3
    else:
        return "hydrops", 4

def display_rain_info():
    percentage, raw_value = get_rain_percentage()
    level_text, level = get_rain_level(percentage)

    # OLEDに表示
    clear_oled()
    add_text(0, 0, "Rainfall Monitor")
    add_text(0, 1, "Analog: {}".format(raw_value))
    add_text(0, 2, "Humidity: {}%".format(percentage))
    add_text(0, 3, "State: {}".format(level_text))
    add_text(0, 4, "Class: {}".format(level))
    draw_screen()

    return percentage, level_text

while True:
    percentage, status = display_rain_info()

    # LEDマトリクスに表示し、スピーカーで異なる音を鳴らす
    if percentage >= 10 and percentage < 20:
        display.show(Image("00000:00000:00900:00000:00000"))  # 点
        music.play("C3:1")  # スピーカーがC3音を再生
    elif percentage >= 20 and percentage < 40:
        display.show(Image("00000:00900:09990:00900:00000"))  # 小さな円
        music.play("C4:1")  # スピーカーがC4音を再生
    elif percentage >= 40 and percentage < 60:
        display.show(Image("00900:09990:99999:09990:00900"))  # 中くらいの円
        music.play("C5:1")  # スピーカーがC5音を再生
    elif percentage >= 60:
        display.show(Image("09990:90009:90009:90009:09990"))  # 大きな円
        music.play("B5:1")  # スピーカーがB5音を再生
    else:
        display.show(Image("00000:00000:00000:00000:00000"))  # パターンを表示しない
        music.reset()  # 音を停止
    sleep(1000)  # 毎秒更新

Img

簡単な説明:

① microbit、oled_ssd1306、music、math のライブラリをインポートします。

from microbit import *
from oled_ssd1306 import *
import music
import math

② OLED の初期化とクリアを行います。

initialize()  # OLEDを初期化
clear_oled()  # OLEDをクリア

③ スチームセンサーのピン、最大値・最小値の変数を初期化します。

RAIN_PIN = pin1
WET_VALUE = 1023
DRY_VALUE = 0

④ 任意の数値レンジを別のレンジにマッピングする map サブ関数を定義します。

def map_value(value, in_min, in_max, out_min, out_max):
        """Linearly map the input values to the output range"""
    if in_max - in_min == 0:  
        return out_min
    return (value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min

⑤ 雨量の割合(強度)を取得するサブ関数を定義します。

def get_rain_percentage():
    raw_value = RAIN_PIN.read_analog()
    percentage = map_value(raw_value, DRY_VALUE, WET_VALUE, 0, 100)
    return max(0, min(100, percentage)), raw_value 

⑥ 雨量のレベルを取得するサブ関数を定義します。

def get_rain_level(percentage):
    if percentage < 10:
        return "dry", 0
    elif percentage >= 10 and percentage < 20:
        return "slightly wet", 1
    elif percentage >= 20 and percentage < 40:
        return "wet", 2
    elif percentage >= 40 and percentage < 60:
        return "Very wet", 3
    else:
        return "hydrops", 4

⑦ OLED に雨量情報を表示するサブ関数を定義します。

def display_rain_info():
    percentage, raw_value = get_rain_percentage()
    level_text, level = get_rain_level(percentage)

    # OLEDに表示
    clear_oled()
    add_text(0, 0, "Rainfall Monitor")
    add_text(0, 1, "Analog:: {}".format(raw_value))
    add_text(0, 2, "Humidity: {} %".format(percentage))
    add_text(0, 3, "State: {}".format(level_text))
    add_text(0, 4, "Class: {}".format(level))
    draw_screen()

    return percentage, level_text

⑧ OLED の表示内容を percentage と status の変数に代入します。

percentage, status = display_rain_info()

⑨ 判定文: if()…elif()…elif()…elif()…else…

検出された雨量が 10% 以上 20% 未満の場合、5×5 LED マトリクスは Img を表示し、スピーカーは警告として C3 音を再生します。

if percentage >= 10 and percentage < 20:
    display.show(Image("00000:00000:00900:00000:00000"))  # 点
    music.play("C3:1")  # スピーカーがC3音を再生

検出された雨量が 20% 以上 40% 未満の場合、5×5 LED マトリクスは Img を表示し、スピーカーは警告として C4 音を再生します。

elif percentage >= 20 and percentage < 40:
    display.show(Image("00000:00900:09990:00900:00000"))  # 小さな円
    music.play("C4:1")  # スピーカーがC4音を再生

検出された雨量が 40% 以上 60% 未満の場合、5×5 LED マトリクスは Img を表示し、スピーカーは警告として C5 音を再生します。

elif percentage >= 40 and percentage < 60:
    display.show(Image("00900:09990:99999:09990:00900"))  # 中くらいの円
    music.play("C5:1")  # スピーカーがC5音を再生

検出された雨量が 60% 以上の場合、5×5 LED マトリクスは Img を表示し、スピーカーは警告として B5 音を再生します。

elif percentage >= 60:
    display.show(Image("09990:90009:90009:90009:09990"))  # 大きな円
    music.play("B5:1")  # スピーカーがB5音を再生

それ以外の場合、5×5 LED は何も表示せず、スピーカーは無音になります。

display.show(Image("00000:00000:00000:00000:00000"))  # パターンを表示しない
music.reset()  # 音を停止

④ 1000ms(1秒)待機します。

sleep(1000)  # 毎秒更新

4.3.6.7 テスト結果

Img

配線して micro USB ケーブルで電源を入れた後、外部電源(6本の AA 電池)を接続して十分な電力供給を確保し、 “Flash” をクリックしてコードを micro:bit ボードにダウンロードします。

Img

テストコードをアップロードした後、micro:bit の背面にあるリセットボタンを押します。

Img

OLED には検出された雨量がリアルタイムで表示されます。(例:濡れた手でスチームセンサーの検出領域に触れて雨が降っている状態をシミュレートする)。

検出された雨量が 10% 以上 20% 未満の場合、5×5 LED マトリクスは Img を表示し、スピーカーは警告として C3 音を再生します。

検出された雨量が 20% 以上 40% 未満の場合、5×5 LED マトリクスは Img を表示し、スピーカーは警告として C4 音を再生します。

検出された雨量が 40% 以上 60% 未満の場合、5×5 LED マトリクスは Img を表示し、スピーカーは警告として C5 音を再生します。

検出された雨量が 60% 以上の場合、5×5 LED マトリクスは Img を表示し、スピーカーは警告として B5 音を再生します。

検出された雨量が 10% 未満の場合、5×5 LED は何も表示せず、スピーカーは無音になります。

Img

⚠️ 注意: 実験で使用しているブロック類はこのキットに含まれていません。

ヒント: 結果が表示されない場合は、micro:bit ボードのリセットボタンを押してください。)

Img