LoginSignup
66
66

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-06

はじめに

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

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

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

購入したもの

2014-08-16-arduino-set.png

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

Arudinoで温度取得

githubのSeeed-Studio/Grove_Temperature_And_Humidity_Sensorからライブラリをセットする。

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

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

Screen Shot 2014-09-06 at 1.49.28 PM.png

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

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形式で送信します。

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というモジュールを利用し、データ受信を行う。

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

シリアルポートを定義します。
これも先ほど紹介したブログからそのまま使います。
portNameはArduino IDEから前もって調べおきます。

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")   
});

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

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

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

今後に向けて

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

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

66
66
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
66