### 4.3.6 雨水モニタリング #### 4.3.6.1 概要 ![Img](./media/top1.png) スチームセンサーが雨を検知すると、micro:bit ボードに信号を送ってさまざまな動作をトリガーします。例えば、micro:bit のスピーカーがアラームを鳴らして雨を知らせたり、現在の降雨量を OLED にリアルタイム表示したりします。これは屋外の天候や環境で特に有用で、利用者が必要な予防措置を取るのに役立ちます。さらに、スチームセンサー、OLEDディスプレイ、micro:bit ボードを含む雨水監視システムは、屋根や建物の漏水を検知して水の侵入による被害を防ぐことができます。 全体として、さまざまな用途で雨水の存在を検知できる多機能で効果的なツールです。 ![Img](./media/bottom1.png) #### 4.3.6.2 コンポーネントの知識 ![Img](./media/2top.png) **水検出センサー** ![Img](./media/steam.png) このスチームセンサーは水の存在を検知できるため、通常は雨水検知システムに使用されます。雨水がセンサーの導電パッド(検出領域)に接触すると、開発ボード(micro:bit など)に信号を送り、さまざまな動作をトリガーします。検出領域に水が多いほど、アナログ値は大きくなります。 ![Img](./media/cou41.png) **回路図:** ![Img](./media/couy41.png) 基板上の露出した平行線によって水の量を検出します。水が多いほど接続される配線が増え、導通の接触面積が増えるため、検出領域のピン2での電圧出力が徐々に上昇し、信号端子 S で検出されるアナログ値が大きくなります。水以外に空気中の水蒸気も検出できます。 **パラメータ:** - 動作電圧: DC 3.3V~5V - 動作電流: (Max)1.5mA@5V - 最大消費電力: 0.075W - 信号タイプ: アナログ信号 ![Img](./media/2bottom.png) #### 4.3.6.3 必要なコンポーネント | ![Img](./media/microbitV2.png)| ![Img](./media/ExpansionBoard.png) |![Img](./media/OLED.png) | | :--: | :--: | :--: | | micro:bit V2 main board ×1 | micro:bit shield ×1 | OLED display ×1 | |![Img](./media/steam1.png)|![Img](./media/usb.png) |![Img](./media/4pin.png)| | steam sensor ×1 | micro USB cable ×1 | 4 pin wire ×1 | |![Img](./media/3pin.png)|![Img](./media/batterycase.png)|![Img](./media/AAbattery.png)| | 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](./media/couj6.png) #### 4.3.6.5 コードフロー ![Img](./media/flow-chart-06.png) #### 4.3.6.6 テスト用コード ⚠️ **Tip 1: コードを Microbit ボードにダウンロードする前に、ライブラリファイル “oled_ssd1306\.py” をインポートしてください。詳しくは ** “[MUでのライブラリのインポート](https://docs.keyestudio.com/projects/KS4050/en/latest/docs/MicroPython/MU_development_environment.html#import-library-on-mu)” . ![Img](./media/WPSA1.png) ⚠️ **Tip 2: “if()...elif()...” の閾値は実際の状況に応じて変更できます。** **完成コード:** ```Python ''' 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](./media/line1.png) **簡単な説明:** ① microbit、oled_ssd1306、music、math のライブラリをインポートします。 ```Python from microbit import * from oled_ssd1306 import * import music import math ``` ② OLED の初期化とクリアを行います。 ```Python initialize() # OLEDを初期化 clear_oled() # OLEDをクリア ``` ③ スチームセンサーのピン、最大値・最小値の変数を初期化します。 ```Python RAIN_PIN = pin1 WET_VALUE = 1023 DRY_VALUE = 0 ``` ④ 任意の数値レンジを別のレンジにマッピングする map サブ関数を定義します。 ```Python 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 ``` ⑤ 雨量の割合(強度)を取得するサブ関数を定義します。 ```Python 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 ``` ⑥ 雨量のレベルを取得するサブ関数を定義します。 ```Python 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 に雨量情報を表示するサブ関数を定義します。 ```Python 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 の変数に代入します。 ```Python percentage, status = display_rain_info() ``` ⑨ 判定文: if()...elif()...elif()...elif()...else... 検出された雨量が 10% 以上 20% 未満の場合、5×5 LED マトリクスは ![Img](./media/ab7.png) を表示し、スピーカーは警告として C3 音を再生します。 ```Pytho 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](./media/ab8.png) を表示し、スピーカーは警告として C4 音を再生します。 ```Python 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](./media/ab9.png) を表示し、スピーカーは警告として C5 音を再生します。 ```Python elif percentage >= 40 and percentage < 60: display.show(Image("00900:09990:99999:09990:00900")) # 中くらいの円 music.play("C5:1") # スピーカーがC5音を再生 ``` 検出された雨量が 60% 以上の場合、5×5 LED マトリクスは ![Img](./media/ab10.png) を表示し、スピーカーは警告として B5 音を再生します。 ```Python elif percentage >= 60: display.show(Image("09990:90009:90009:90009:09990")) # 大きな円 music.play("B5:1") # スピーカーがB5音を再生 ``` それ以外の場合、5×5 LED は何も表示せず、スピーカーは無音になります。 ```Python display.show(Image("00000:00000:00000:00000:00000")) # パターンを表示しない music.reset() # 音を停止 ``` ④ 1000ms(1秒)待機します。 ```Python sleep(1000) # 毎秒更新 ``` #### 4.3.6.7 テスト結果 ![Img](./media/4top.png) 配線して micro USB ケーブルで電源を入れた後、外部電源(6本の AA 電池)を接続して十分な電力供給を確保し、 “Flash” をクリックしてコードを micro:bit ボードにダウンロードします。 ![Img](./media/A128.png) テストコードをアップロードした後、micro:bit の背面にあるリセットボタンを押します。 ![Img](./media/A455.png) OLED には検出された雨量がリアルタイムで表示されます。(**例:濡れた手でスチームセンサーの検出領域に触れて雨が降っている状態をシミュレートする**)。 検出された雨量が 10% 以上 20% 未満の場合、5×5 LED マトリクスは ![Img](./media/ab7.png) を表示し、スピーカーは警告として C3 音を再生します。 検出された雨量が 20% 以上 40% 未満の場合、5×5 LED マトリクスは ![Img](./media/ab8.png) を表示し、スピーカーは警告として C4 音を再生します。 検出された雨量が 40% 以上 60% 未満の場合、5×5 LED マトリクスは ![Img](./media/ab9.png) を表示し、スピーカーは警告として C5 音を再生します。 検出された雨量が 60% 以上の場合、5×5 LED マトリクスは ![Img](./media/ab10.png) を表示し、スピーカーは警告として B5 音を再生します。 検出された雨量が 10% 未満の場合、5×5 LED は何も表示せず、スピーカーは無音になります。 ![Img](./media/dongtu-06.gif) ⚠️ **注意: 実験で使用しているブロック類はこのキットに含まれていません。** (**ヒント:** 結果が表示されない場合は、micro:bit ボードのリセットボタンを押してください。) ![Img](./media/4bottom.png)