### 4.3.7 温度と湿度の調節
#### 4.3.7.1 概要

このプロジェクトでは、micro:bit ボード、XHT11 温湿度センサ、130 モータ、加湿モジュールおよび OLED ディスプレイを使って温度と湿度を調節するシステムの作り方を紹介します。
システムは XHT11 センサで周囲の温度と湿度を計測し、必要に応じてファンの回転や加湿モジュールによるミスト噴射を制御してこれらを調整します。温度または湿度が設定した閾値を超えると、ファンを回し、加湿モジュールからミストを噴射します。同時に OLED には現在の温度と湿度がリアルタイムに表示されます。
温度と湿度を調節できるため、温湿度管理が必要なプロジェクトに広く応用できます。

#### 4.3.7.2 コンポーネントの知識

**XHT11 温湿度センサ**

XHT11 温湿度センサはデジタル信号を出力します。アナログ信号を取得して変換し、温度と湿度を検出して長期の安定性と高い信頼性を確保します。さらに、高精度の抵抗式湿度センサと抵抗式温度センサを内蔵し、8ビット高性能マイコンと接続されています。
**XHT11 の通信方式:**
XHT11 は簡易な単線バス通信を採用しています。単線バスはデータ線が1本のみであることを意味し、システム内のデータ交換と制御はここで行われます。
- 単線バスのデータビット送信定義:
- 単線バスデータ形式: 40ビットのデータを一度に送信し、上位ビットが先に出力されます。
- 8ビット湿度整数部 + 8ビット湿度小数部 + 8ビット温度整数部 + 8ビット温度小数部 + 8ビットパリティビット。**湿度の小数部は 0 に注意してください。**
- パリティビットのデータ定義:
- 8ビット湿度整数部 + 8ビット湿度小数部 + 8ビット温度整数部 + 8ビット温度小数部。8ビットのパリティビットは結果の最後の8ビットです。

データの時間系列図:
ホスト(MCU)がスタート信号を1回送ると、XHT11 は低電力モードから高速モードに切り替わります。ホストのスタート信号が終了すると、XHT11 は応答信号を送り、40ビットのデータを出力して信号取得を行います。信号の送受信は下図のとおりです。

⚠️ **注意:** ホストが XHT11 から読み取る温度と湿度のデータは常に前回の測定値です。2回の測定の間隔が長い場合は、連続して2回読み取り、2回目の値をリアルタイム値として使用してください。
**回路図:**

**パラメータ:**
- 動作電圧: DC 3.3V~5V
- 動作電流: (最大)2.5mA@5V
- 最大消費電力: 0.0125W
- 温度範囲: -25 ~ +60°C (±2℃)
- 湿度範囲: 5 ~ 95%R (約25°Cでの精度 ±5%RH)
- 出力信号: デジタル双方向単線バス
**加湿(Atomization)モジュール**

加湿モジュールはドライバと加湿シートで構成され、水を微粒化します。マイコンや手動ボタンで制御できます。
**動作原理:** 加湿モジュールは一般的に超音波技術を用いてミストを発生させます。圧電セラミックプレートを含み、高周波電圧が加わると振動を始めます。振動は水面上に小さな水滴を集め、それらを拡散して細かい水ミストを形成します。
**ミストの粒子サイズ:** このモジュールは水を効果的に微小粒子に変換でき、通常 1〜5 ミクロン程度です。この細かいミストは蒸発しやすく空気中に拡散しやすいため、効果的な加湿効果があります。
⚠️ **注意:**
**1. 電源を入れた後、加湿シートは水中に置いてください。長時間空気中に放置するとシートが熱くなり焼損します。**
**2. 加湿シートは水面に優しく置いてください。水中に完全に沈めるとミストは発生しません。**
**パラメータ:**
- 動作電圧: DC 3.3 ~ 5V
- 取り付け穴: 直径 4.8mm、ピッチ 16mm
- 寸法: 長さ 31mm、幅 23mm、高さ 8mm
- 重量: 4.5g
- 動作温度: -25°C ~ +60°C
- モジュール端子: 3ピン曲げピン、ピッチ 2.54
- 加湿シート端子: PH2.0 メス端子
- 機能: 水を細かいミストに変換して空気中に放出する
**加湿シートの寸法:**

⚠️ **注意: シート上の配線をなるべく引っ張らないでください。はんだ付け部が外れる恐れがあります。**
**加湿モジュールの使用手順:**
制御モードはボタン制御と MCU 制御の2種類があります。
**ボタン制御:** ボタンを押して加湿モジュールをオンにします。もう一度押すとオフになります。
**MCU プログラム制御:** ボタンの押下をシミュレートします。通常は高レベルを出力し、押されると低レベルになります。ボタンを離すと再び高レベルを出力します。
したがって、MCU を使う場合はモジュールに短い低レベルを入力すればよく、ボタンを押す操作と同じです。高レベルの時間を調整することで、加湿モジュールの開始・停止時間を制御できます。
**綿棒ロッドの取り付け:**
1\. 綿棒ロッドを完全に水に浸してください(ロッド全体を浸せる大きめの容器を用意し、5分以上浸して十分に水を吸わせてください)。

2\. プラスチックブラケットの内側に加湿シートを取り付けます。シートの向きに注意し、配線をブラケットの溝に置いてください。


3\. プラスチックブラケットのもう一方の側を閉じます。

4\. 綿棒ロッドをブラケットの中央に差し込みます。ロッドは底までしっかり差し込み、必ず加湿シートに触れるようにしてください。

5\. シートをモジュールの PH2.0 メス端子に接続します。下図を参照ください。

6\. 加湿モジュールを micro:bit shield に接続し、外部電源を接続します。

7\. 綿棒ロッドを再度 3 分以上水に浸します。できるだけロッドが水に覆われるようにし、ただし水が溢れないようにしてください。

8\. モジュールの黒いボタンを押すと噴霧が始まります。ミストは 3 秒間噴霧されます。再度ボタンを押すと停止します。
⚠️ **注意: 加湿シートを長時間連続で動作させないでください。1回の動作は 5 秒を超えないようにし、綿棒ロッドが十分に水を含むまで 1〜2 分間の休止を入れるのが望ましいです。さもなければ焼損する可能性があります。**



#### 4.3.7.3 必要な部品
| |  | |
| :--: | :--: | :--: |
| micro:bit V2 main board ×1 | micro:bit shield ×1 | atomization module ×1 |
||| |
| XHT11 temperature and
humidity sensor ×1 | OLED display ×1 | 130 motor ×1 |
| |||
| micro USB cable ×1 | 4 pin wire ×2 | 3 pin wire ×2 |
| || |
| fan ×1 | battery holder ×1 | AA battery(**自分で用意**) ×6 |
#### 4.3.7.4 配線図
⚠️ **配線時はケーブルの色に注意してください。**
| 130 motor | wire color | micro:bit shield pin | micro:bit board pin |
| :-------: | :--------: | :------------------: | :-----------------: |
| G | black | G | G |
| V | red | V2 | V |
| IN+ | blue | 2 | P2 |
| IN- | green | 13 | P13 |
| 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 |
| atomization module | wire color | micro:bit shield pin | micro:bit board pin |
| :----------------: | :--------: | :------------------: | :-----------------: |
| G | black | G | G |
| V | red | V2 | V |
| S | yellow | 16 | P16 |
| XHT11 temperature and
humidity sensor | wire color | micro:bit shield pin | micro:bit board pin |
| :----------------------------------------: | :--------: | :------------------: | :-----------------: |
| G | black | G | G |
| V | red | V1 | V |
| S | yellow | 0 | P0 |

#### 4.3.7.5 コードの流れ

#### 4.3.7.6 テスト用コード
⚠️ **Tip 1: Microbit ボードにコードをダウンロードする前に、ライブラリファイル “oled_ssd1306\.py” とライブラリファイル “DHT11\.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() 条件内の閾値 30 と 70 は実際の状況に合わせて変更できます。**
**完全なコード:**
```Python
'''
Theme: Air temperature and humidity regulation
Function: OLED displays temperature and humidity, XHT11 sensor controls the motor and the atomization module to regulate the environment temperature and humidity
Compiling IDE: MU 1.2.0
Author: https://docs.keyestudio.com
'''
# ライブラリをインポート
from microbit import *
from oled_ssd1306 import *
from DHT11 import *
# OLED を初期化してクリア
initialize()
clear_oled()
sensor = DHT11(pin0) # 温湿度センサのピンを設定
# 初期化の待ち時間を追加
display.show(Image.ALL_CLOCKS, wait=False, loop=True)
sleep(3000) # センサに 3 秒の安定化時間を与える
display.clear()
pin16.write_digital(1) # P16 ピンを高レベルに設定
# 読み取りカウンタを追加
read_count = 0
last_valid_temp = 0
last_valid_humid = 0
while True:
# 複数回読み取りを試行
for i in range(3):
sensor.read() # 温度と湿度の値を読み取る
if sensor.temp != 0 or sensor.humid != 0:
break
sleep(1000)
T = sensor.temp # 温度の値を T に保存
H = sensor.humid # 湿度の値を H に保存
# データの妥当性をチェック
if T == 0 and H == 0 and read_count < 5:
# 最初の数回の読み取りは 0 になることがある。継続して試行する
read_count += 1
add_text(0, 0, "Initializing...")
add_text(0, 2, "Attempt: " + str(read_count))
sleep(1000)
continue
# データが有効なら、最後の有効値を更新
if T != 0 or H != 0:
last_valid_temp = T if T != 0 else last_valid_temp
last_valid_humid = H if H != 0 else last_valid_humid
read_count = 10 # マークが正常に読み取られた
# 有効なデータを使用(現在の値が 0 の場合は最後の有効値を使用)
display_temp = T if T != 0 else last_valid_temp
display_humid = H if H != 0 else last_valid_humid
clear_oled()
add_text(0, 0, "Temper: " + str(display_temp) + " C") # 温度を表示
add_text(0, 2, "Humid: " + str(display_humid) + " %RH") # 湿度を表示
# 制御ロジック
if display_temp > 30 or display_humid > 70:
add_text(0, 4, "Cooling/Humidifying")
pin2.write_analog(500)
pin13.write_digital(0)
sleep(2000)
pin2.write_analog(0)
pin13.write_digital(0)
sleep(500)
pin16.write_digital(0)
sleep(200)
pin16.write_digital(1)
sleep(3000)
pin16.write_digital(0)
sleep(200)
pin16.write_digital(1)
sleep(1000)
else:
add_text(0, 4, "Normal State")
pin2.write_analog(0)
pin13.write_digital(0)
pin16.write_digital(1)
sleep(500)
```

**簡単な説明:**
① microbit、oled_ssd1306、DHT11 のライブラリをインポートします。
```Python
from microbit import *
from oled_ssd1306 import *
from DHT11 import *
```
② OLED の初期化とクリアを行います。
```Python
initialize()
clear_oled()
```
③ XHT11 温湿度センサのピンを初期化します。
```Python
sensor = DHT11(pin0) # 温湿度センサのピンを設定
```
④ 変数を定義し初期値を 0 に設定します。
```Python
read_count = 0
last_valid_temp = 0
last_valid_humid = 0
```
⑤ 温度と湿度を複数回読み取り、読み取った温度を変数 T、湿度を H に代入します。
```Python
for i in range(3):
sensor.read() # 温度と湿度の値を読み取る
if sensor.temp != 0 or sensor.humid != 0:
break
sleep(1000)
T = sensor.temp # 温度の値を T に保存
H = sensor.humid # 湿度の値を H に保存
```
⑥ 温度と湿度の値の妥当性を確認します。
```Python
if T == 0 and H == 0 and read_count < 5:
# 最初の数回の読み取りは 0 になることがある。継続して試行する
read_count += 1
add_text(0, 0, "Initializing...")
add_text(0, 2, "Attempt: " + str(read_count))
sleep(1000)
continue
```
⑦ データが有効なら最後の有効値を更新します。
```Python
if T != 0 or H != 0:
last_valid_temp = T if T != 0 else last_valid_temp
last_valid_humid = H if H != 0 else last_valid_humid
read_count = 10 # マークが正常に読み取られた
```
⑧ 有効なデータを使用します(現在の値が 0 の場合は最後の有効値を使用)。
```Python
display_temp = T if T != 0 else last_valid_temp
display_humid = H if H != 0 else last_valid_humid
```
⑨ XHT11 センサで検出した温度と湿度を OLED に表示します。
```Python
add_text(0, 0, "Temper: " + str(display_temp) + " C") # 温度を表示
add_text(0, 2, "Humid: " + str(display_humid) + " %RH") # 湿度を表示
```
⑩ 判定文: if()...else...
検出した温度が 30℃ を超えるか湿度が 70%RH を超えると、ファンは 2 秒間回転した後停止します。その後、加湿モジュールが動作してミストを噴射し、周囲の温度と湿度を調節します。同時に OLED には “Cooling/Humidifying” と表示されます。
```Python
if display_temp > 30 or display_humid > 70:
add_text(0, 4, "Cooling/Humidifying")
pin2.write_analog(500)
pin13.write_digital(0)
sleep(2000)
pin2.write_analog(0)
pin13.write_digital(0)
sleep(500)
pin16.write_digital(0)
sleep(200)
pin16.write_digital(1)
sleep(3000)
pin16.write_digital(0)
sleep(200)
pin16.write_digital(1)
sleep(1000)
```
それ以外の場合は、ファンと加湿モジュールは動作せず、OLED には “Normal State” と表示されます。
```Python
else:
add_text(0, 4, "Normal State")
pin2.write_analog(0)
pin13.write_digital(0)
pin16.write_digital(1)
```
⑪ 500ms(0.5秒)待機
```Python
sleep(500)
```
#### 4.3.7.7 テスト結果

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

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

micro:bit ボードの 5×5 LED ドットマトリクスは回転ポインタのパターンを表示し、OLED は XHT11 温湿度センサの初期化情報を表示した後、XHT11 センサが検出した温度と湿度の値をリアルタイムで表示します。
検出した温度が 30℃ を超えるか湿度が 70%RH を超えると、ファンは 2 秒間回転した後停止します。その後、加湿モジュールが動作してミストを噴射し、周囲の温度と湿度を調節します。同時に OLED には “Cooling/Humidifying” と表示されます。そうでない場合は、ファンと加湿モジュールは動作せず、OLED には “Normal State” と表示されます。

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