Arduinoとスマホでお家をモニタ【IoTシステム構築紹介＆Arduino＋Bluetooth編】

# はじめに
昨今、IoTといったネットと物とを繋ぐのが流行っていますね。流行したのは少し前ですが、今もその流れは衰えていません。このIoTは民生品は勿論のこと、現在では産業界（ファクトリーオートメーション(FA)、車載、物流）でも大きく広がり始めています。
今回はそんなIoTを理解するためにスマホ、Arduino、センサを使ってIoTシステムを学びながら構築していきます。

# システム概要
本シリーズで構築するシステムは以下のようになっています。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/0c696ba7-60d3-416f-20b6-d9f4d8aa32e4.png)
「Arduino Uno」というマイコンボードとセンサを使って、その値をBluetoothでスマホに送信します。スマホからは携帯電話通信を利用してサーバーに情報を送信します。そのデータは各種端末で利用できるようにします。

パート1の本記事ではセンサからArduinoへデータを取り込み、それをBluetoothで送信するところまでを解説します。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/8f016ef2-ba86-a028-f6d5-c71652d796fd.png)


# 用意するもの

```
*本記事
・Arduino Uno(互換機でも多分いけます)
・USBケーブル(Arduino⇔PC接続用)
・温湿度センサ(SHT31　高精度温湿度センサモジュールキット)
・RN-42(RN-42　Bluetooth無線モジュール評価キット)
・ブレッドボード
・ジャンプワイヤ
・抵抗器2kΩと3kΩ
・PC
*今後使用する予定のもの
・Bluetoothが使えるAndoridスマホ（古すぎないもの、5年前~現在のものが良い）
```

今回は「部屋の中の環境を測定」するという前提で、部屋の温度と湿度を測れる温湿度センサを使ってみます。
秋月リンク→https://akizukidenshi.com/catalog/g/gK-12125/
![SHT31](https://akizukidenshi.com/img/goods/L/K-12125.jpg)
また、Bluetooth送信機としてRN-42評価キットを使います。
秋月リンク→https://akizukidenshi.com/catalog/g/gK-07378/
![RN-42](https://akizukidenshi.com/img/goods/L/K-07378.JPG)

用意するものをざっと書きました。別記事では用意するものを増やすかもです...が基本的にはこれでシステムは構築できます。PCとスマホ以外は秋月で揃いますので通信販売か店舗で直接お求めください！

# Arduinoとセンサで環境測定
では、始めていきましょう！
まずは温湿度をセンサからArduinoで取得するプログラムを書いていきます。[秋月の商品ページにスケッチ例](ttps://akizukidenshi.com/catalog/g/gK-12125/)がありましたのでそれを使っていきます。

```c++:SHT31_Sample.ino
//---------------------------------------------------//
//  AKIZUKI DENSHI TSUSHO CO.,LTD.
//  Version 1.0  2017-06-20
//---------------------------------------------------//


#include <Arduino.h>
#include <Wire.h>
#include "AE_SHT31.h"


//---------------------------------------------------//
// AE-SHT31    ------     Arduino UNO                //
//                                                   //
//   V+        ------        5.0V                    //
//  SDA        ------        A4                      //
//  SCL        ------        A5                      //
//  ADR        ------       (Open = 0x45)            //
//  GND        ------        GND                     //
//---------------------------------------------------//

// SHT31のアドレスを設定
AE_SHT31 SHT31 = AE_SHT31(0x44);


void setup() {
  // シリアル通信を9600bpsに設定
  Serial.begin(9600);
  // シリアルに文字を出力
  Serial.println("SHT31 Test!!");
  // SHT31をソフトリセット
  SHT31.SoftReset();
  // 内蔵ヒーター 0:OFF 1:ON
  SHT31.Heater(0);
}



void loop()
{
  // SHT31から温湿度データを取得
  SHT31.GetTempHum();
  
  Serial.println("--------------------------");
  // SHT31.Temperature()　より温度データ取得
  Serial.println("Temperature ('C)");
  Serial.println(SHT31.Temperature());
  // SHT31.Humidity()　より相対湿度データ取得
  Serial.println("Humidity (%)");
  Serial.println(SHT31.Humidity());
  // 待ち時間
  delay(800);
}

```

ではプログラムを書いて配線していきましょう。こちらも秋月の販売リンクのデータシートを参照しています。

|Arduino  |<---->|センサ|
|---|---|---|
|5.0V  |  |VDD|
|A4  |  |SDA|
|A5  |  |SCL|
|接続しない  |  |ADR|
|GND  |  |GND|

補足として、温湿度センサはI2Cという通信インターフェイスを使用します。これは電源端子の他にSDA、SCLの配線だけでデータをやり取りできるものです。

動作させてみてシリアルモニターで温度と湿度が出ていれば大丈夫です。



# Bluetoothでデータを送信する
では次にArduinoで取れたデータをBluetoothで送信します。
送信するためにはBluetoothで情報を送信できる**送信機**が必要です。今回は使用容易性とシステムの内容理解のために、RN-42というBluetooth送受信機を使用します。

これにより**SPP（Serial Port Profile）を**用いて、スマホと通信させることができます。

ではArduinoの情報を送信するプログラムを書いていくのですが、今回はソフトウェアシリアルを用いてRN-42にデータを送信します。ハードウェアシリアルでも良いのですが、シリアルモニタでハードウェアシリアルを監視しながら動作させたいので今回は使用しません。

ではプログラムを書いていきましょう。

```c++:SHT_31_RN-42.ino
#include <Arduino.h>
#include <Wire.h>
#include "AE_SHT31.h"
#include <SoftwareSerial.h>
SoftwareSerial DataSerial(2,3);
AE_SHT31 SHT31 = AE_SHT31(0x44);

void setup() {
    //RN-42デフォルト設定ではシリアル通信のボーレートは115200pbsが必要
    DataSerial.begin(115200);
    // シリアル通信を9600bpsに設定
    Serial.begin(9600);
    // シリアルに文字を出力
    Serial.println("SHT31 Test!!");
    // SHT31をソフトリセット
    SHT31.SoftReset();
    // 内蔵ヒーター 0:OFF 1:ON
    SHT31.Heater(0);
}

void loop() {
    // SHT31から温湿度データを取得
    SHT31.GetTempHum();
    // SHT31.Temperature()　より温度データ取得
    Serial.print("Temperature ('C)");
    Serial.println(SHT31.Temperature());
    // SHT31.Humidity()　より相対湿度データ取得
    Serial.print("Humidity (%)");
    Serial.println(SHT31.Humidity());
    

    //Bluetooth送信機にデータを送る動作
    DataSerial.print(SHT31.Temperature());
    DataSerial.print(",");
    DataSerial.println(SHT31.Humidity());

    // 待ち時間
    delay(800);

}
```

プログラムの一部を解説します。2行目でソフトウェアシリアルで使用するRXとTXのピンを割り当てます。`setup()`ではソフトウェアシリアルのボーレートを決定します。この時初期状態のRN-42ではボーレートが115200bpsのみ対応しているので、`DataSerial.begin(115200);`としています。`loop()`の中身の最後に`DataSerial.print(~);`を追加していますが、これがArduinoからRN-42に送られる情報です。

# Arduino、センサ、RN-42の配線
では上記のプログラムが書き込めたら、前のArduino+センサの回路にRN-42を接続していきます。回路図は以下のようになります。

|Arduino  |<---->|センサ|
|---|---|---|
|5.0V  |  |VDD|
|A4  |  |SDA|
|A5  |  |SCL|
|接続しない  |  |ADR|
|GND  |  |GND|
|追記↓ |  ||
|Arduino  |<---->|RN-42|
|3.3V  |  |3.3V|
|2(RX)  |  |TX D|
|3(TX)  |分圧2kΩと3kΩ  |RX D|
|/  |  |RTS->CTS|
|GND  |  |GND|

先ほどソフトウェアシリアルのプログラムで`SoftwareSerial DataSerial(2,3);`と設定したので2番がArduinoから見たRX、3番がArduinoから見たTXになります。よって、RN-42から見たらこれらのピンは2番がTX、3番がRXとなりますので、**RN-42のRXピンに3番、RN-42のTXピンに2番を接続します**。間違えやすいので注意してください。また、RN-42のCTSとRTSはショートさせます。[^1]

Arduino 3pin →RN-42 RX Dの分圧回路の詳細は以下の通りです。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/fb1363f2-4bcc-33af-0ca8-f2f6d591c016.png)

RN-42は3.3Vで動作しますのでArduino UNOの5Vを直接入力してしまうと壊れてしまいます。その為、分圧回路により3Vまで落とします。

# 動作確認
ではBluetoothで情報が送れているかを確認しましょう。
まずはPCで確認します。PCでRN-42のペアリングを行ってください。私はWindows OSを使用していますので、説明もWindows環境で行います。

設定を開いて「Bluetoothとデバイス」をクリックします。その状態で先ほど配線したArduinoの電源を入れます。PCに戻りデバイスの追加をクリックします。

すると、RNBT-○○○○というデバイスが出てきます。そのデバイスを追加してください。
Bluetoothとデバイスのウインドウで下の画像の状態になればOKです。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/fa21ce85-1b60-e2ce-2eed-67ae786b54fd.png)

次にTera Termというソフトを使います。インストールができていない人はインストールしてください。Tera Termで検索すればインストール手順が出てきますのでそちらを参照してください。
↓Tera Termのアイコン
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/d228e82d-5f70-659c-5c87-9f516798e7bb.png)

Arduinoを起動した状態でTera Termを立ち上げます。
すると下のようなウインドウが出ますので、シリアルを選択します。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/b13edf32-d73d-7b78-2b4b-d9d845575d03.png)

選択できたら右のポート(R)のところからドロップダウンリストから「COM○(番号):Bluetoothリンク経由の標準シリアル（COM○）」をクリックします。この項目はいくつかあるので、上から接続して接続できるものを選択してください。接続できていても何も表示されない場合も同様に別の選択肢に切り替えてみてください。[^2]
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/b9f205e1-46ec-02e0-4e56-7337ded4b0b5.png)

正常に接続できると下図のように映し出されます。

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/491ce118-0450-e32e-79fe-8110e64f2516.png)

表示されているウインドウの左の数値は温度、右側の数字は湿度です。

# 今後に向けての工夫
次の記事ではAndoridスマホを用いてBluetoothの情報を得ます。しかし、前のTera Termの表示はどの情報がどのような意味を持っているかが分かりにくいです。また、今後情報量を増やしていきたいときに情報の識別で問題が発生してしまいます。

このような問題の対策として、どの情報が何を意味するのかを示しておく必要があります。そこで<ins>数値の前にその数値の識別情報を送信します。</ins>
例えば温度の数値の前にtempという文字情報を送信することで、「temp」という文字列の後の数値が気温の情報であるとわかります。これは人間だけでなく、機械にとってもわかりやすいものになります。

では下のように書き変えてみましょう。
```c++:SHT_31_RN-42_kai.ino
#include <Arduino.h>
#include <Wire.h>
#include "AE_SHT31.h"
#include <SoftwareSerial.h>
SoftwareSerial DataSerial(2,3);
AE_SHT31 SHT31 = AE_SHT31(0x44);

void setup() {
    //RN-42デフォルト設定ではシリアル通信のボーレートは115200pbsが必要
    DataSerial.begin(115200);
    // シリアル通信を9600bpsに設定
    Serial.begin(9600);
    // シリアルに文字を出力
    Serial.println("SHT31 Test!!");
    // SHT31をソフトリセット
    SHT31.SoftReset();
    // 内蔵ヒーター 0:OFF 1:ON
    SHT31.Heater(0);
}

void loop() {
    // SHT31から温湿度データを取得
    SHT31.GetTempHum();
    // SHT31.Temperature()　より温度データ取得
    Serial.print("Temperature ('C)");
    Serial.println(SHT31.Temperature());
    // SHT31.Humidity()　より相対湿度データ取得
    Serial.print("Humidity (%)");
    Serial.println(SHT31.Humidity());
    

    //Bluetooth送信機にデータを送る動作
    //温度情報の前に文字列tempを挿入
    DataSerial.print("temp");
    DataSerial.print(",");
    DataSerial.print(SHT31.Temperature());
    DataSerial.print(",");
    //湿度情報の前に文字列humidを挿入
    DataSerial.print("humid");
    DataSerial.print(",");
    DataSerial.println(SHT31.Humidity());

    // 待ち時間
    delay(800);

}
```

Tera Termのウインドウで送信情報を確認します。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/58b071c1-dae1-9908-5111-115377c21264.png)

これでどの数値がどの情報なのかがよくわかりますね。

# 最後に
本記事は以上です。次回はTera Termで見た情報をAndoridスマホで受け取るプログラムを書いていきます。ここからが面白く難しいところです。

次の記事もなるべく早く出す予定ですが、いろいろ忙しいので後になるかもしれません！気長にお待ちください！

何か不明点、修正点などありましたらコメントください。対応させていただきます。




[^1]:ここはRS232Cというシリアル通信の通信方式のCTS/RTSフロー制御で使うものです。今回はBluetoothが送信のみであるためRTSとCTSを短絡させています（CTSに常に1が入力）。

[^2]:正常に接続できていても何も表示されない場合があります。それはTera Termのボーレートが間違っている可能性がありますので、Tera Termウインドウ>設定>シリアルポート>スピードの項目で正しいレートを選択してください。