Node-RED で WebSocket を使った HTTP server push (2) ESP-WROOM-02 で Lチカ

## 目標
[前回](https://qiita.com/Kakimoty_Field/items/4d8c0b2c944c2108ccf8)はWebSocket をつかって、サーバからのきっかけでブラウザの表示を更新した。
今回は、サーバ側はほぼ同じ仕組みを利用し、クライアント側をマイコンに置き換えてLEDをチカチカさせる

## 利用環境
[ESP-WROOM-02 秋月電子通商ＤＩＰ化キット](http://akizukidenshi.com/catalog/g/gK-09758/)

[arduinoWebSockets 2.1.1](https://github.com/Links2004/arduinoWebSockets)

## 今回のゴール
サーバきっかけで、マイコン(ESP-WROOM-02)に接続された２つのLEDをチカチカさせる。

![チカチカさせるLED](https://dl.dropboxusercontent.com/s/nlkc5fhdclydfd9/181122-00.jpg)
赤、黄色 ２つのLEDを制御させてみる。

# 実践
Node-RED のフローと、ESP-WROOM-02 用のスケッチを作る。 

## Node-RED フロー
![flow](https://dl.dropboxusercontent.com/s/vzlxw6r338uinfl/181122-01.png)

### 使用ノード
#### [input] inject (ひとつ目）
**数値**で**[4]**を `Payload` に入力する。
![inject Setting](https://dl.dropboxusercontent.com/s/7f147ebk9e1gr9h/181122-02.png)

#### [input] inject (ふたつ目）
**数値**で**[5]**を `Payload` に入力する。
![inject Setting](https://dl.dropboxusercontent.com/s/5cw9xuz1hrzjqcd/181122-03.png)

#### [output] websocket
クライアントとなるマイコン側が接続する URL を `path` に入力する。
![output websocket Setting](https://dl.dropboxusercontent.com/s/izukpitu6j2lm5s/181122-04.png)

# ESP-WROOM-02 側
### 配線

| Arduino PIN | DST |
| :--- | :--- |
| IO4 | 赤色LED |
| IO5 | 黄色LED |

### スケッチ
[参考(arduinoWebSockets:ESP8266 sample)](https://github.com/Links2004/arduinoWebSockets/blob/master/examples/esp8266/WebSocketClient/WebSocketClient.ino)


```c:wroomsebsock.ino
#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <WebSocketsClient.h>

const char* ssid = "your-ssid";
const char* password = "your-ap-password";

IPAddress myIp(192, 168, 1, 1);
IPAddress myDNS(192, 168, 1, 254);
IPAddress myGATEWAY(192, 168, 1, 254);
IPAddress myNETMASK(255, 255, 255, 0);

WebSocketsClient webSocket;

void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {
  switch(type) {
    case WStype_DISCONNECTED:
      break;
    case WStype_CONNECTED:
      break;
    case WStype_TEXT:
      Serial.printf("[WSc] get text: %s\n", payload);
      // websocket で受信した数値に応じた GPIO を ON にして、LED を点灯する。
      if( payload[0] == '4' )
        digitalWrite(4, HIGH);
      if( payload[0] == '5' )
        digitalWrite(5, HIGH);

      // しばらく待つ (300 msec)
      delay(300);

      // GPIO を OFF にして、LEDを消灯する。
      if( payload[0] == '4' )
        digitalWrite(4, LOW);
      if( payload[0] == '5' )
        digitalWrite(5, LOW);
      break;
    case WStype_BIN:
      break;
  }
}

void setup() {
  Serial.begin(74880);
  
  // アクセスポイント接続＋スタティックIP設定
  WiFi.config(myIp, myGATEWAY, myNETMASK, myDNS);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(250);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println(WiFi.macAddress());

  //  WebSocket Client 設定
  // server address, port and URL
  // ３番目の引数を Node-RED [websokcet] ノードの path にする
  webSocket.begin("your.host", 80, "/test_arduino");
  // event handler
  webSocket.onEvent(webSocketEvent);
  // try ever 5000 again if connection has failed
  webSocket.setReconnectInterval(5000);

  // チカチカさせるLEDが接続されたGPIO設定
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  webSocket.loop();
}
```

## 実行と結果

#### サーバきっかけで Push
Node-RED の inject ノード を実行する。
![inject 実行](https://dl.dropboxusercontent.com/s/lrj5rztg7nacg1z/181122-05.png)

実行確認デモ動画
[![ESP-WROOM-02 Lチカ](http://img.youtube.com/vi/TY8FOKLwLes/0.jpg)](https://www.youtube.com/watch?v=TY8FOKLwLes)


## まとめ
インターネットを通じて、手元のデバイスを制御する仕組みを簡単に試すことができた。今回は INPUT ノードに [inject] を使用したが、
[http] を使用すれば、デバイスを制御するための WebAPI を実装できる。
スマホなどからもデバイスを操作できるようになるので、いろいろ遊べそう。