M5StackとFirebaseを使ってenebularからトイレを流してみる

身近な人たちが、みんなenebularを使い始めているので、私も少し触ってみることにしました（入門）。

普通であればLチカですが、今回はトイレを流します（何を言っているのか）。

#参考URL
完全に以下のリンク先の記事を参考にします。ほぼこちらの内容で、差分だけ後述します。

**[M5StackとFirebaseを使ってenebularとつないでみよう](https://blog.enebular.com/firebase/m5stack-firebase-enebular-collaboration/)**
https://blog.enebular.com/firebase/m5stack-firebase-enebular-collaboration/

#差分

##M5Stackのソースコード
M5Stackには以下のコードを書き込みます。
※別途、M5Stackに挿しているSDカードに待機中の画像とトイレを流した際の画像を入れておく必要があります。

```
#include <IOXhop_FirebaseESP32.h>
#include <M5Stack.h>
#include <WiFi.h>
 
#define WIFI_SSID "WIFI_SSID"
#define WIFI_PASSWORD "WIFI_PASSWORD"

#define FIREBASE_DATABASE_URL "XXXXXX.firebaseio.com"

// 赤外線LED
const int ledPin = 22;

//TOTOウォシュレットの流す赤外線信号データ
unsigned int data_nagasu[] = {601,297,59,50,64,160,69,45,67,45,64,45,64,48,66,48,67,44,59,50,59,53,66,47,62,159,64,48,61,50,61,53,64,45,64,47,64,48,61,53,67,43,66,45,64,48,69,44,67,156,61,48,61,164,67,154,61,51,61,50,64,50,61,48,61,162,61,52,64,157,61,162,61,53,64,45,64,48,61,50,61,3889,601,295,64,48,61,164,59,50,61,50,61,50,61,53,61,48,64,48,61,51,61,53,64,48,61,162,67,45,67,45,64,45,59,53,66,47,67,44,59,50,61,51,61,50,64,50,62,48,64,160,69,45,67,154,61,162,61,51,66,45,64,47,64,48,61,164,59,50,61,162,61,164,64,45,64,50,64,47,62,50,59};

unsigned long now;
unsigned long waitStartMicros;
 
void setup() {
  M5.begin();
   
  Serial.begin(115200);
   
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(10, 10);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setTextSize(3);
  M5.Lcd.printf("START");

  pinMode(ledPin, OUTPUT);
 
  // connect to wifi.
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
 
  // WiFi Connected
  Serial.println("\nWiFi Connected.");
  Serial.println(WiFi.localIP());
  M5.Lcd.println("WiFi Connected.");
  M5.Lcd.println("");
   
  Firebase.begin(FIREBASE_DATABASE_URL);
  
  Firebase.setBool("/M5Stack/wash", false);
}
 
void loop() {
  if(Firebase.getBool("/M5Stack/wash")) {
    M5.Lcd.drawJpgFile(SD, "/wash.jpg");
    M5.update();
    sendSignal(data_nagasu,sizeof(data_nagasu)/sizeof(data_nagasu[0]));
    
    delay(3000);

    // Firebaseへ送信
    Firebase.setBool("/M5Stack/wash", false);
 
    delay(2000);
    M5.Lcd.fillScreen(BLACK);
  }

  M5.Lcd.drawJpgFile(SD, "/wait.jpg");
  M5.update();
}

/*
 赤外線信号の送出
*/
void sendSignal(unsigned int *data, int dataSize) {

  for (int i = 0; i < dataSize; i++) {
    unsigned long dataLength = data[i] * 10;
    now = micros();

    do {
      digitalWrite(ledPin, 1 - i % 2);
      wait(8);
      digitalWrite(ledPin, 0);
      wait(7);
    } while (long(now + dataLength - micros()) > 0);
  }
}

void wait(signed long waitTime) {
  waitStartMicros = micros();
  while (micros() - waitStartMicros < waitTime) {};
}
```
赤外線LEDは以下のように22番とGNDに挿します。（長い方を22番に）
![DSC_0537.JPG](https://qiita-image-store.s3.amazonaws.com/0/117651/f888bec6-aff4-37ff-f963-d6d167735f7a.jpeg)

ちなみに、赤外線LEDの使い方は、蔵下さんの著書「[センサーでなんでもできる おもしろまじめ電子工作](http://amzn.asia/d/37XJWl3)」がすごく参考になります。

## enebularのフロー
以下のようにします。
![スクリーンショット 2018-10-30 1.17.15.png](https://qiita-image-store.s3.amazonaws.com/0/117651/f5f81c41-a497-7d4a-dc11-6f38807d3ea4.png)

injectノード（左側）は以下のようにします。
![スクリーンショット 2018-10-30 1.17.27.png](https://qiita-image-store.s3.amazonaws.com/0/117651/3fbfaa63-82b1-e458-8e6c-c1fd9e7ac035.png)

Firebaseノード（右側）は以下のようにします。
![スクリーンショット 2018-10-30 1.19.18.png](https://qiita-image-store.s3.amazonaws.com/0/117651/f62a19d9-1aac-adf2-dc1f-f94ad83a623d.png)

Deployボタンを押して設定完了です。

# 実際に動かしてみる

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">enebularからトイレを流してみた <a href="https://t.co/JCPbhof2w0">pic.twitter.com/JCPbhof2w0</a></p>&mdash; やまちょ (@yamacho1111) <a href="https://twitter.com/yamacho1111/status/1056947308858757122?ref_src=twsrc%5Etfw">2018年10月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

現場からは以上です。