###はじめに
Arduinoほぼ初心者。
電子工作を始めたいと思いつつ、3年前ぐらいにArduinoを買うが、LEDを点滅させて終わる。
以降、Arduinoは押入れにひっそりと眠っていました。
夏休みの子どもの自由研究に最適! 植物からメールをもらおう (1/3)
http://www.atmarkit.co.jp/ait/articles/1408/01/news019.html
上のブログを見て、やることを決意。
###購入したもの
- ARDUINO-A000066 Arduino Uno R3
- SEEED-SEN11301P GROVE - デジタル温度・湿度センサ
- SEEED-SLD01099P GROVE - ベースシールド V1.3
全部で5000円ぐらい。Arduinoが3000円ぐらいしました。
###Arudinoで温度取得
githubのSeeed-Studio/Grove_Temperature_And_Humidity_Sensorからライブラリをセットする。
ライブラリは/libraries/上に於けば大丈夫です。
サンプルを動かすとシリアルモニタから温度と湿度が見れました。
ここまでは無事に動きましたー
###Arduinoからシリアル通信でローカル上のNode.jsサーバーへデータ送信
シリアル通信とは
1本の信号線や回線を使って1ビットずつ順番にデータを送受信する通信・転送方式 (eWordより)
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形式で送信します。
#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);
}
参考:
###Node.jsサーバーからデータ受信
node-serialportというモジュールを利用し、データ受信を行う。
node-serialportをインストール npm install serialport
シリアルポートを定義します。
これも先ほど紹介したブログからそのまま使います。
portNameはArduino IDEから前もって調べおきます。
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")
});
シリアル通信でデータを取得するたびにターミナルで温度が表示されるようにする。
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サーバー実行します。
28と出ているので、成功と信じます。
###今後に向けて
- MongoDBに温度データを保存する。
- 温度データを表示するページを作成し、ブラウザで見えるようにする。
- 毎回温度データが変わる毎に、表示ページがAjaxで更新されるようにする。
とりあえず、この3つはできるようになりたいですー