ArduinoとNode.jsで室内温度計を作るまで、、vol.01

###はじめに

Arduinoほぼ初心者。
電子工作を始めたいと思いつつ、3年前ぐらいにArduinoを買うが、LEDを点滅させて終わる。
以降、Arduinoは押入れにひっそりと眠っていました。

**夏休みの子どもの自由研究に最適！ 植物からメールをもらおう (1/3)**
http://www.atmarkit.co.jp/ait/articles/1408/01/news019.html

上のブログを見て、やることを決意。

###購入したもの

![2014-08-16-arduino-set.png](https://qiita-image-store.s3.amazonaws.com/0/15925/6ad5ec5f-04fb-dbc0-d436-8e39e41ffde4.png)

- [ARDUINO-A000066 Arduino Uno R3](http://www.switch-science.com/catalog/789/)
- [SEEED-SEN11301P GROVE - デジタル温度・湿度センサ](http://www.switch-science.com/catalog/818/)
- [SEEED-SLD01099P GROVE - ベースシールド V1.3](http://www.switch-science.com/catalog/1293/)

全部で5000円ぐらい。Arduinoが3000円ぐらいしました。


###Arudinoで温度取得

githubの[Seeed-Studio/Grove_Temperature_And_Humidity_Sensor](https://github.com/Seeed-Studio/Grove_Temperature_And_Humidity_Sensor)からライブラリをセットする。

ライブラリは<arduinosketchfolder>/libraries/上に於けば大丈夫です。

サンプルを動かすとシリアルモニタから温度と湿度が見れました。

![Screen Shot 2014-09-06 at 1.49.28 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15925/b52e40e8-b105-f53c-61e0-cdcc91738092.png)



ここまでは無事に動きましたー

###Arduinoからシリアル通信でローカル上のNode.jsサーバーへデータ送信

**シリアル通信とは**
1本の信号線や回線を使って1ビットずつ順番にデータを送受信する通信・転送方式  ([eWord](http://e-words.jp/w/E382B7E383AAE382A2E383ABE9809AE4BFA1.html)より)

ExpressとArudinoの連携については以下のブログを参考にしました。

**node-serialportを使ってNode.jsでArduinoと通信する**
http://tomowatanabe.hatenablog.com/entry/2013/03/23/233554




ArudinoとPCがUSBケーブルでつながっているので、USB経由でArudinoからPCにデータを送ることだと勝手に解釈しました。

Arudino側からPCにデータがjson形式で送信します。

```c:sam.ino
#include "DHT.h"

#define DHTPIN A1     // what pin we're connected to
#define LED  13

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 

DHT dht(DHTPIN, DHTTYPE);

char trans[20]; 

#define PORT 3000

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

void loop() 
{

    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(t) || isnan(h)) 
    {
        Serial.print("Failed to read from DHT");
    } 
    else 
    {
        memset(trans, 0, 20);
        char *json = &trans[0];
        int sendTemData = (int)(t);
        
        // 送信用のJSONデータの作成
        sprintf(json, "{\"temp\":%d, \"led\":%d}", sendTemData, digitalRead(LED));
        Serial.println(json);        
        
    }
    
    
    delay(5000);
}

```


参考: 
- https://github.com/tomovwgti/Node-SerialPort/blob/master/temp/temp.ino


###Node.jsサーバーからデータ受信
[node-serialport](https://github.com/voodootikigod/node-serialport)というモジュールを利用し、データ受信を行う。

node-serialportをインストール `npm install serialport`

シリアルポートを定義します。
これも先ほど紹介した[ブログ](http://tomowatanabe.hatenablog.com/entry/2013/03/23/233554)からそのまま使います。
portNameはArduino IDEから前もって調べおきます。

```js:main.js
var serialport = require('serialport');

// -----------------------
// --------- 中略 ---------
// -----------------------

var portName = "/dev/cu.usbmodem1451";
var sp = new serialport.SerialPort(portName, {
    baudRate: 115200,
    dataBits: 8,
    parity: 'none',
    stopBits: 1,
    flowControl: false,
    parser: serialport.parsers.readline("\n")   
});
```

シリアル通信でデータを取得するたびにターミナルで温度が表示されるようにする。


```js:main.js
sp.on('data', function(input) {

    var buffer = new Buffer(input, 'utf8');

    var jsonData;
    try {
        jsonData = JSON.parse(buffer);
        console.log('temp: ' + jsonData.temp);
    } catch(e) {
        console.log("error");
        // データ受信がおかしい場合無視する
        return;
    }

});
```
以上で終了です。

今回はnode.jsのフレームワークとしてexpressを使用しています。
node.jsサーバー実行します。

![Screen Shot 2014-09-06 at 2.20.41 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15925/56d76dab-e41b-5f46-4e53-6f05b9d46107.png)

28と出ているので、成功と信じます。

###今後に向けて

- MongoDBに温度データを保存する。
- 温度データを表示するページを作成し、ブラウザで見えるようにする。
- 毎回温度データが変わる毎に、表示ページがAjaxで更新されるようにする。

とりあえず、この3つはできるようになりたいですー