### 4.3.3 太陽紫外線検出器
#### 4.3.3.1 概要

太陽紫外線検出器は、太陽からの紫外線の強度を測定するための精密機器です。人間の目には見えない紫外線(UV)を検出し、その強度を定量化します。照度検出器と同様に光電効果をベースとしていますが、その核心は紫外線を選択的に検出する点にあります。
本プロジェクトでは、OLEDが検出した紫外線強度をリアルタイムに表示します。ある値を超えると、ボード上のスピーカーがアラームを鳴らし、5×5 LEDマトリクスが警告用のパターンを表示します。
紫外線検出器は「紫外線」を定量化する必要のあるほぼすべての場面で広く使用されています。UV硬化ランプや日焼け止め製品のテスト、紫外線光線療法機器、浄水システムや空気清浄システム内の紫外線殺菌ランプの監視などが含まれます。

#### 4.3.3.2 コンポーネント知識

**Solar Ultraviolet Sensor**

紫外線センサは紫外線を検出するためのもので、主に半導体フォトダイオードに基づく G365S01M で構成されています。環境中の紫外線照度を、マイコン(例:micro:bit ボード)で読み取れるアナログ電圧信号に変換できます。回路図は以下の通りです。

フォト電気変換:センサ内部の紫外線フォトダイオードが紫外線にさらされると、非常に微弱な電流が発生します(紫外線強度に比例)。
電流増幅:この微弱な電流は内部に統合されたオペアンプで増幅されます。
信号出力:増幅された信号がピンから直接アナログ電圧として出力されます。電圧値は通常0V〜1Vの範囲です(3.3V電源時)。紫外線強度が強いほど電圧は高くなります。
**仕様:**
- 動作電圧: DC 5V
- 応答波長ピーク: 355nm (λmax)
- ピーク感度 (355nm) : 0.18A/W (Rmax)
- スペクトル応答範囲: 220~370nm
- 紫外/可視光応答比 (Rmax/R400nm): > (VB)
**Microbit 5×5LED マトリクス**

micro:bit ボードのLEDマトリクスは格子状に25個のLEDを含みます。テストコード内で位置値を指定することで特定のLEDを制御できます。理論上は複数のLEDを同時に点灯させてパターン、数字、スクロール文字などを表示できます。

#### 4.3.3.3 必要な部品
| |  | |
| :--: | :--: | :--: |
| micro:bit V2 メインボード ×1 | micro:bit シールド ×1 | OLED ディスプレイ ×1 |
|| ||
| 紫外線センサ ×1 | micro USB ケーブル ×1 | 4 ピン ワイヤ ×1 |
||||
| 3 ピン ワイヤ ×1 | 電池ホルダー ×1 | AA 電池(**自分で用意**) ×6 |
#### 4.3.3.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 |
| ultraviolet sensor | wire color | micro:bit shield pin | micro:bit board pin |
| :----------------: | :--------: | :------------------: | :-----------------: |
| G | black | G | G |
| V | red | V2 | V |
| S | yellow | 1 | P1 |

#### 4.3.3.5 コードフロー

#### 4.3.3.6 テストコード
⚠️ **Tip 1: Microbit ボードにコードをダウンロードする前に、ライブラリファイル “oled_ssd1306\.py” をインポートしてください。参照:** “[Import Library on MU](https://docs.keyestudio.com/projects/KS4050/en/latest/docs/MicroPython/MU_development_environment.html#import-library-on-mu)” .

⚠️ **Tip 2: if() 文内のしきい値 5 は実際の状況に応じて変更できます。**
**Complete code:**
```Python
'''
Theme: Solar ultraviolet detector
Function: OLED displays the intensity of ultraviolet rays and the ultraviolet sensor controls the 5×5 dot matrix and speaker
Compiling IDE: MU 1.2.0
Author: https://docs.keyestudio.com
'''
# import related libraries
from microbit import *
from oled_ssd1306 import *
import music
import math
# initialize and clear oled
initialize() # initialize oled
clear_oled() # clear oled
# Initialize the ADC pin (the ultraviolet sensor is connected to pin1)
uv_sensor = pin1
def read_uv_index():
# Read the analog value (0-1023 corresponds to 0-5.0V)
raw_value = uv_sensor.read_analog()
# Make sure the value is within the valid range
if raw_value > 1023:
raw_value = 1023
elif raw_value < 0:
raw_value = 0
# Map to the ultraviolet index range of 0 to 15
# The mapping range can be adjusted according to the actual characteristics of the sensor
uvi = raw_value * (15.0 / 1023)
return round(uvi, 1)
while True:
clear_oled() # clear OLED
uv = read_uv_index() # Read the ultraviolet intensity level detected by the ultraviolet sensor
add_text(0, 0, "UV Intensity:") # Display the character string in the corresponding position of OLED
add_text(14, 0, str(int(uv))) # Display Ultraviolet intensity level in the corresponding position of OLED
if uv >= 5: # when uv level >=5
display.show(Image.NO) # LED matrix displays the no pattern
music.play("B5:4") # speaker plays B5 tone
sleep(100)
music.play("C5:4") # speaker plays C5 tone
display.show(Image.SAD) # LED matrix displays the sad pattern
sleep(100)
else: # or
display.show(Image.HAPPY) # LED matrix displays the happy pattern
music.reset() # no tone
sleep(1000)
```

**簡単な説明:**
① microbit、oled_ssd1306、music、math のライブラリをインポートします。
```Python
from microbit import *
from oled_ssd1306 import *
import music
import math
```
② OLED を初期化し、クリアします。
```Python
initialize() # initialize oled
clear_oled() # clear oled
```
③ 太陽紫外線センサのピンを初期化します。
```Python
uv_sensor = pin1
```
④ センサが検出した紫外線値を返すサブ関数を定義します。
```Python
def read_uv_index():
# Read the analog value (0-1023 corresponds to 0-3.3V)
raw_value = uv_sensor.read_analog()
# Make sure the value is within the valid range
if raw_value > 1023:
raw_value = 1023
elif raw_value < 0:
raw_value = 0
# Map to the ultraviolet index range of 0 to 15
# The mapping range can be adjusted according to the actual characteristics of the sensor
uvi = raw_value * (15.0 / 1023)
return round(uvi, 1)
```
⑤ センサの紫外線値を読み取りOLEDに表示します。
```Python
uv = read_uv_index() # Read the ultraviolet intensity level detected by the ultraviolet sensor
add_text(0, 0, "UV Intensity:") # Display the character string in the corresponding position of OLED
add_text(14, 0, str(int(uv))) # Display Ultraviolet intensity level in the corresponding position of OLED
```
⑥ 判定文: if()...else...
太陽光の検出された紫外線強度が5以上の場合、5×5 LEDマトリクスは  と  を表示し、スピーカーがアラームを鳴らします。そうでない場合、マトリクスは  を表示し、スピーカーはアラームを鳴らしません。
```Python
if uv >= 5: # when uv level >=5
display.show(Image.NO) # LED matrix displays the no pattern
music.play("B5:4") # speaker plays B5 tone
sleep(100)
music.play("C5:4") # speaker plays C5 tone
display.show(Image.SAD) # LED matrix displays the sad pattern
sleep(100)
else: # or
display.show(Image.HAPPY) # LED matrix displays the happy pattern
music.reset() # no tone
```
⑦ 1000ms(1秒)待機します。
```Python
sleep(1000)
```
#### 4.3.3.7 テスト結果

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

テストコードをアップロードしたら、micro:bit の裏面にあるリセットボタンを押してください。

⚠️ **注意:** 紫外線センサのテスト環境: 正午前後の日光(10:00〜14:00);影を避ける;センサを直接太陽に向けること。
OLEDは検出された紫外線強度をリアルタイムで表示します。太陽光の検出された紫外線強度が5以上の場合、5×5 LEDマトリクスは  と  を表示し、スピーカーがアラームを鳴らします。そうでない場合、マトリクスは  を表示し、スピーカーはアラームを鳴らしません。

⚠️ **注意: 実験で使用するブロック(building blocks)はこのキットに含まれていません。**
(**Tip:** 結果が観測されない場合は、micro:bit ボードのリセットボタンを押してください。)
