【IoT】ESPr Developer（Arduino）を使って超音波距離センサーの値をFirebaseに送信してみた

[ESPr® Developer](https://www.switch-science.com/catalog/2652/)を使って、超音波距離センサーで取得した値を、[Firebase](https://firebase.google.com/?hl=ja)に送信してみました。
ESPr® DeveloperはWifiが内蔵されているので、簡単にIoT機器として利用することが出来ます。

#ハード準備
* [ESPr® Developer（ピンソケット実装済）](https://www.switch-science.com/catalog/2652/)
* [ジャンパワイヤ(オス～オス)](https://www.switch-science.com/catalog/57/)
* [普通のブレッドボード](https://www.switch-science.com/catalog/313/)
* [HC-SR04 超音波距離センサーモジュール For Arduino](http://store.shopping.yahoo.co.jp/sky-sky/1129.html?sc_e=slga_pla)

接続例
![IMG_0195.JPG](https://qiita-image-store.s3.amazonaws.com/0/154355/6102d7f3-36cd-0d33-1bee-227059a3150e.jpeg)
#Firebase登録
[Firebase](https://console.firebase.google.com/?hl=ja&pli=1)にアクセスし、
コンソール画面にある新規作成を押して、プロジェクトを作成します。
![スクリーンショット 2017-02-15 13.33.07.png](https://qiita-image-store.s3.amazonaws.com/0/154355/97d3358a-b72c-e4f6-00bc-f965ca594ac8.png)

プロジェクトの設定を開きます
![スクリーンショット 2017-02-15 13.33.48.png](https://qiita-image-store.s3.amazonaws.com/0/154355/f1ae1ff2-c48f-4d81-1d9b-3b6a52753098.png)

データベースのシークレットで`表示する`を押して、表示されたシークレットキーをメモしておきます。
![スクリーンショット 2017-02-15 13.36.35.png](https://qiita-image-store.s3.amazonaws.com/0/154355/e00385db-c6b5-1247-f5c1-53f2d3e986ea.png)

プロジェクトIDもメモしておきます。
![スクリーンショット 2017-02-15 13.42.07.png](https://qiita-image-store.s3.amazonaws.com/0/154355/1110fe5c-750c-7a40-9651-06de5780a842.png)

データベースの書き込み許可をしておきます。
![スクリーンショット 2017-02-27 10.14.33.png](https://qiita-image-store.s3.amazonaws.com/0/154355/66701539-315f-3440-7061-d4372cc2793b.png)

#Arduino設定
Arduinoにプログラムを書き込みます。
[FirebaseArduino](https://github.com/firebase/firebase-arduino)というライブラリが公開されているので、zipダウンロードしてきます。

Arduino IDEのスケッチ-ライブラリをインクルード-.ZIP形式のライブラリをインストール…を選択します。
![スクリーンショット 2017-02-27 10.30.40.png](https://qiita-image-store.s3.amazonaws.com/0/154355/e5a02aa4-4e7a-8520-5e45-f0a8845b328b.png)

#プログラム例

```ino:ultrasonic_Firebase.ino
#include <ESP8266WiFi.h>
#include <Firebase.h>
#include <FirebaseArduino.h>
#include <FirebaseCloudMessaging.h>
#include <FirebaseError.h>
#include <FirebaseHttpClient.h>
#include <FirebaseObject.h>

#define FIREBASE_HOST "xxxxxxxx.firebaseio.com"
#define FIREBASE_AUTH "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

//ご自分のルーターのSSIDを入力してください
const char* ssid = "xxxxxxx";
//ご自分のルーターのパスワード
const char* password = "xxxxxxxxxxxxxx";

#define echoPin 12 // Echo Pin
#define trigPin 14 // Trigger Pin
double Duration = 0; //受信した間隔
double Distance = 0; //距離

void setup() {
  Serial.begin(115200);

  // 超音波センサー接続
  pinMode( echoPin, INPUT );
  pinMode( trigPin, OUTPUT );
  
  // connect to wifi.
  WiFi.begin(ssid, password);
  WiFi.mode(WIFI_STA); // omajinai
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(10000);
  }
  Serial.println();
  Serial.print("connected: ");
  Serial.println(WiFi.localIP());

  // setup firebase.
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);

}

void loop()
{
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  digitalWrite( trigPin, HIGH ); //超音波を出力
  delayMicroseconds( 10 ); //
  digitalWrite( trigPin, LOW );
  Duration = pulseIn( echoPin, HIGH ); //センサからの入力
  if (Duration > 0) {
    Duration = Duration/2; //往復距離を半分にする
    Distance = Duration*340*100/1000000; // 音速を340m/sに設定
  }

  // update value
  Firebase.setFloat("dist", Distance);
  // handle error
  if (Firebase.failed()) {
      Serial.print("setting /number failed:");
      Serial.println(Firebase.error());  
      return;
  }
  delay(100);

  // get value 
  Serial.print("dist: ");
  Serial.println(Firebase.getFloat("dist"));
  delay(100);

}
```

#Firebase設定
こちらの`FIREBASE_HOST`と`FIREBASE_AUTH`は先程メモしたものを記述してください。

```
#define FIREBASE_HOST "xxxxxxxx.firebaseio.com"
#define FIREBASE_AUTH "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
```

#Wifi設定
WifiルータのSSIDとパスワードを入力してください。

```
//ご自分のルーターのSSIDを入力してください
const char* ssid = "xxxxxxx";
//ご自分のルーターのパスワード
const char* password = "xxxxxxxxxxxxxx";
```

#Firebaseに値送信
serFloatで小数値をFirebaseに送信しています。

```
// update value
Firebase.setFloat("dist", Distance);
// handle error
if (Firebase.failed()) {
    Serial.print("setting /number failed:");
    Serial.println(Firebase.error());  
    return;
}
delay(100);
```

#Firebaseから値取得
getFloatで対象値のデータを取得します。

```
// get value 
Serial.print("dist: ");
Serial.println(Firebase.getFloat("dist"));
delay(100);
```

#動作確認
手を超音波距離センサーに近づけると、センサー値がリアルタイムに変化します。
![IMG_0197.JPG](https://qiita-image-store.s3.amazonaws.com/0/154355/0b9b0c75-05aa-ef52-44d3-a2ae9c464048.jpeg)

Firebaseに値が反映されていきます。
![スクリーンショット 2017-02-15 13.52.14.png](https://qiita-image-store.s3.amazonaws.com/0/154355/5302b603-0f05-7f02-afe2-790ff354f68a.png)

#まとめ
これで簡単にセンサー値を送信することが出来ました。
Firebaseを利用すれば、iOSやAndroidからも数値を取得することが出来ますので、
センサーを使ったIoT機器の開発が簡単に行なえます。
色んなセンサーで数値を登録して素敵なIoTライフを！