ESP8266 (ESP-WROOM-02) でセンサーを扱う

# 概要
ESP8266(ESP-WROOM-02 以下 WROOM02) を使って、温度、湿度、照度、振動の各センサーから値を取得する。

# はじめに
WROOM02 は Wi-Fi 通信機能が内蔵された Arduino (として使える IC) です。

Arduino UNO より高性能で、かつ、格安。秋月で550円。
http://akizukidenshi.com/catalog/g/gM-09607/

ブレッドボードで使えるように端子を2.54mmピッチに展開したモジュールなら650円。
http://akizukidenshi.com/catalog/g/gK-09758/

開発環境の構築は、先達が詳しくまとめてくれているので、そちらを参照。
<a href="http://qiita.com/azusa9/items/264165005aefaa3e8d7d">技適済み格安高性能Wi-FiモジュールESP8266をArduinoIDEを使ってIoT開発する為の環境準備を10分でやる方法</a>

WROOM02 は、A/D 変換は 1ch [10bit] だけ内蔵しています。今回は多種類のセンサーを繋げたいので、A/D コンバータ(MCP3008 8ch [10bit])を別途で用意します。

A/Dコンバータとは SPI プロトコルで通信します。WROOM02 はハード的には SPI プロトコルを使用可能です。しかしまだ、ドライバ的に正式サポートでは無いようです。先達が開発(<a href="https://github.com/MetalPhreak/ESP8266_SPI_Driver">ESP8266_SPI_Driver</a>)してくれてますので、今回はそれを使用することにします。

# 回路図
回路図の作成には Eagle を使いました。Eagle は無料で高機能ですが、部品(マクロ)がほとんど整備されていなく、自分で用意する必要があります。

WROOM02 と A/Dコンバータ 等のマクロを含む、Eagle プロジェクト全体はこちらの Github にアップしています。
https://github.com/exabugs/eagleSensorProject

実際の回路図は以下。

![imagee.png](https://qiita-image-store.s3.amazonaws.com/0/69410/e919af9a-8587-ac5f-4352-d64a7829a474.png)

SPI インタフェース部分と A/Dコンバータを繋げばよいです。

タクトスイッチ S1 は 書き込み/実行 モードの切り替えです。タクトスイッチ S2 はリセットです。
リセットした瞬間のモードで WROOM02 が起動します。

[注意]
 - WROOM02 は 3.3V 駆動です。電源回路は別途足してください。
 - USB-シリアル変換 のインタフェースは、回路図から外していますので、TXD/RXD, GND に適切に接続してください。

# スケッチ

スケッチは以下になります。
 - A/Dコンバータ との SPI 通信プロトコルが若干怪しいですが、0〜1,023 の値をうまくとれているので、あっていると思います。
 - 各センサーの値は、それぞれ、適切に変換する必要があります。
 - 振動センサーは一瞬なので、5msec でポーリング。他は 1sec でポーリングしてます。

```cpp
extern "C"{
#include <spi.h>
#include <spi_register.h>
}

#include <Ticker.h>

Ticker ticker;
Ticker ticker2;

void setup() {
  Serial.begin(115200);
  Serial.print("\n");

  spi_init(HSPI);

  ticker.attach_ms(1000, timer);
  ticker2.attach_ms(5, Angularity);
}

void loop() {
}

volatile uint32 angularity = 0;
void Angularity() {
  uint32 val = check(3);
  if (val > angularity) {
    angularity = val;
  }
}

void timer() {

  uint32 val0 = check(0);
  uint32 val1 = check(1);
  uint32 val2 = check(2);
  //uint32 val3 = check(3);
  uint32 val3 = angularity;
  angularity = 0;
  uint32 val4 = check(4);

  Serial.print(" Temperature:");
  Serial.print(val0);
  Serial.print(" Illuminance:");
  Serial.print(val1);
  Serial.print(" Humidity:");
  Serial.print(val2);
  Serial.print(" Angularity:");
  Serial.print(val3);
  Serial.print(" Test:");
  Serial.print(val4);
  Serial.print("\n");

}

uint32 check(int channel) {
  uint8 cmd = (0b11 << 3) | channel;

  const uint32 COMMAND_LENGTH = 5;
  const uint32 RESPONSE_LENGTH = 12;

  uint32 retval = spi_transaction(HSPI, 0, 0, 0, 0, COMMAND_LENGTH, cmd, RESPONSE_LENGTH, 0);

  retval = retval & 0x3FF; // mask to 10-bit value
  return retval;
}
```

SPIライブラリを含む、Arduino スケッチ 全体はこちらの Github から。
https://github.com/exabugs/sketchSensorProject



# 制作

実際に作ってみると、こんな感じです。

![IMG_0255.JPG](https://qiita-image-store.s3.amazonaws.com/0/69410/66ac1746-350e-7922-0ef3-fbf19a4f00c1.jpeg)

![スクリーンショット 2016-01-01 18.31.03.png](https://qiita-image-store.s3.amazonaws.com/0/69410/57bae50c-92ac-6785-ae84-4e0ca92db0fd.png)

# まとめ
ESP8266(ESP-WROOM-02 以下 WROOM02) を使って、温度、湿度、照度、振動の各センサーから値を取得しました。
Eagle で回路図を作成しました。
部品代 1,000円 くらいで、ここまでできるとは WROOM02 バンザイです。
次は、取得した値をクラウドに飛ばして、IoT ですかね。