Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

はじめに

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つはできるようになりたいですー

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした