[SensorTag] Texas Instruments の CC2650 SensorTag を試す（２）

前回はこちらでCC2650の動作確認を行いました :smile: 
[[SensorTag] Texas Instruments の CC2650 SensorTag を試す](http://qiita.com/madobon/items/3470235471b76105ad22)

今日は温度・湿度を継続的に取得するプラグラムを書いてみたいと思います。

node、npm のバージョンはこちら

```sh
$ # node.js
$ node -v
v5.0.0
```

```sh
$ # npm
$ npm -v
3.3.10
```

続いてさくさくとプロジェクトを作っていきます。

```sh
$ # create workspace
$ mkdir sensor && cd $_
```

```sh
$ # initialize git
$ git init
```

```sh
$ # create package.json
$ npm init -y
```

```sh
$ # gulp
$ npm install gulp gulp-babel --save-dev
```

```sh
$ # ES6/2015 support
$ npm install babel-preset-es2015 --save-dev
```

```sh
$ # ES7 support
$ npm install babel-preset-stage-0 --save-dev
```

```sh
$ # CC2560 SensorTag
$ npm install sensortag --save
```

git用に `.gitignore` を作ります。

```.gitignore
node_modules
dist
```
babel用に `.babelrc` を作ります。

```.babelrc
{
  "presets": ["es2015", "stage-0"]
}
```

gulp用に `gulpfile.babel.js` を作ります。
（ES6の記述に慣れるために `gulpfile` もES6で書いています。）

```gulpfile.babel.js
import gulp from 'gulp'
import babel from 'gulp-babel'

gulp.task('default', () => {
  return gulp.src('src/**.js')
    .pipe(babel())
    .pipe(gulp.dest('dist'));
});
```

`$ npm start` で プログラムを実行させたいので
`package.json` の `scripts` に `"start": "gulp && node ./dist/sample.js"` を追加します。

```package.json
{
  "name": "sensor",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "gulp && node ./dist/sample.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "sensortag": "^1.2.0"
  },
  "devDependencies": {
    "babel-preset-es2015": "^6.1.18",
    "babel-preset-stage-0": "^6.1.18",
    "gulp": "^3.9.0",
    "gulp-babel": "^6.1.1"
  }
}
```

ここから、メインのプログラムを書きます :santa: 


```src/sample.js
import SensorTag from 'sensortag'

const PERIOD = process.argv[2] || 2550;

console.log(`SensorTag を探しています...`);

SensorTag.discover(tag => {
  const sensorInfo = `[${tag.type}][${tag.id}]`;

  console.log(`${sensorInfo} SensorTag を発見しました。`);

	tag.on('disconnect', () => {
    console.log(`プログラムを終了します。`);
		process.exit(0);
	});

  console.log(`${sensorInfo} SensorTag へ接続します...`);

	tag.connectAndSetUp(error => {
    console.log(`${sensorInfo} SensorTag へ接続しました。`);
    tag.enableHumidity(error => {
      console.log(`${sensorInfo} SensorTag の情報取得周期を${PERIOD}msに変更します。`);
      tag.setHumidityPeriod(PERIOD, error => {
        console.log(`${sensorInfo} SensorTag の情報を取得します。`);
        tag.notifyHumidity(listenHumidity);
        tag.notifySimpleKey(listenSimpleKey);
      });
    });
  });

  function listenHumidity(error) {
    tag.on('humidityChange', (temperature, humidity) => {
      console.log(`${sensorInfo} 温度: ${temperature.toFixed(1)} °C`);
      console.log(`${sensorInfo} 湿度: ${humidity.toFixed(1)} %`);
    });
  }

  function listenSimpleKey(error) {
    tag.on('simpleKeyChange', (left, right) => {
      console.log(`${sensorInfo} 左: ${left} 右: ${right}`);
      if (left && right) {
        console.log(`${sensorInfo} SensorTag から切断します。`);
        tag.disconnect();
      }
    });
  }
});
```

```sh
$ # 動作確認
$ npm start

> sensor@1.0.0 start /Users/madobon/dev/original/sensor
> gulp && node ./dist/sample.js

[21:02:41] Requiring external module babel-core/register
[21:02:41] Using gulpfile ~/dev/original/sensor/gulpfile.babel.js
[21:02:41] Starting 'default'...
[21:02:41] Finished 'default' after 126 ms
SensorTag を探しています...
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] SensorTag を発見しました。
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] SensorTag へ接続します...
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] SensorTag へ接続しました。
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] SensorTag の情報取得周期を2550msに変更します。
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] SensorTag の情報を取得します。
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 温度: 15.2 °C
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 湿度: 84.2 %
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 温度: 15.2 °C
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 湿度: 84.2 %
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 温度: 15.2 °C
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 湿度: 84.1 %
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 温度: 15.2 °C
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 湿度: 84.1 %
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 左: false 右: true
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 左: true 右: true
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] SensorTag から切断します。
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 左: true 右: false
[cc2650][10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX] 左: false 右: false
プログラムを終了します。
```

うまく動いてそうですね。
ココらへんでコミットしときます。

```sh
$ # add to index
$ git add .
```
```sh
$ # check status
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   .babelrc
	new file:   .gitignore
	new file:   gulpfile.babel.js
	new file:   package.json
	new file:   src/sample.js
```
```sh
$ # commit files
$ git commit -m "first commit"
[master (root-commit) af380c9] first commit
 5 files changed, 82 insertions(+)
 create mode 100644 .babelrc
 create mode 100644 .gitignore
 create mode 100644 gulpfile.babel.js
 create mode 100644 package.json
 create mode 100644 src/sample.js
```

```sh
$ # add remote repository
$ git remote add origin https://github.com/madobon/sensor.git
```

```sh
$ # push origin to master
$ git push -u origin master
Counting objects: 8, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (8/8), 1.42 KiB | 0 bytes/s, done.
Total 8 (delta 0), reused 0 (delta 0)
To https://github.com/madobon/sensor.git
 * [new branch]      master -> master
```

とりあえずコミットまでしときました。

タグ `v_0.0.1` もつけておきます。

```sh
$ git tag v_0.0.1
```

```sh
$ git push origin v_0.0.1
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/madobon/sensor.git
 * [new tag]         v_0.0.1 -> v_0.0.1
```

ここまでのソースはこちらにあります。
https://github.com/madobon/sensor/tree/v_0.0.1

次回はWebSocketを使って、
気温をリアルタイムに描画することをしてみたいと思います :heart_eyes: