//
表示中
モノづくり, Computer - コンピューター, Electronics - 電子工作

ESP-WROOM-02からMQTTブローカーにデータを送信する


ESP-WROOM-02のプログラムを作り変えて、MQTTのクライアントにしました。ESP-WROOM-02がMQTTブローカーに対してパブリッシャーの役割をします。約15秒間隔でHDC1000温湿度センサーから温度と湿度を読み取り液晶の表示を更新してMQTTブローカーに送信します。

一方、Node.jsとMongoDBで開発した簡易的なMQTTサブスクライバーアプリケーションは、温度と湿度にタイムスタンプを追加してデータベースに記録します。画面は10秒間隔で表示を更新します。

変化が少なくてわかりにくいですが動作の様子をYouTube動画にしました。温度の湿度を計測したときは黄色のLEDが点滅します。データが送信するタイミングとブラウザの画面を更新するタイミングが少しズレますので、即座にというわけではありませんが、画面のテーブルの一番上の行に直近の計測値が表示されます。

次はもっと見やすいグラフを使ったダッシュボード形式の画面を作ります。できればiPhoneなどからも見やすいレスポンシブデザインにしたいと思います。

以下のソースコードはWebアプリケーションの主要部分で、MQTTブローカーにサブスクライバーとして自身を登録して、メッセージを受け取ったらデータベースに保存する部分です。

app.js

var express = require('express')
  , routes = require('./routes')
  , http = require('http')
  , https = require('https')
  , path = require('path')
  , logger = require('morgan')
  , bodyParser = require('body-parser')
  , methodOverride = require('method-override')
  , cookieParser = require('cookie-parser')
  , errorHandler = require('errorhandler')
  , session = require('express-session')
  , router = express.Router()
  , path = require('path')
  , models = require('./model/models')
  , config = require('./config');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(bodyParser.urlencoded({
    extended:true
}));
app.use(methodOverride());
app.use(cookieParser());
app.use(session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true,
    cookie: {
        httpOnly: true,
        maxAge: 60 * 60 * 1000
    }
}));
app.use(router);
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(errorHandler());
}
app.get('/', routes.index);
app.get('/service/thermoHumid', require('./routes/service').thermoHumid);

// MQTTのサブスクライバーとして自身を登録する
var mqtt = require('mqtt');
// MQTTブローカーに接続
var client = mqtt.connect("mqtt://" + config.mqttServer);
// サブスクライバーとして登録
client.subscribe("thermo_humid");
// メッセージ受信時の処理
client.on("message", function(topic, payload) {
    // payloadはBufferなので文字列に変換してからJSONに変換
    var json = JSON.parse(payload.toString());
    json.timestamp = new Date();
    console.log(json);
    // 現在時刻をセットして温度と湿度をMongoDBに保存
    var th = new models.ThermoHumid({
                temperature: json.temperature,
                humidity: json.humidity,
                timestamp: json.timestamp
            });
    th.save();
    
});

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

model/models.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var config = require('../config');


var url = 'mongodb://' + config.dbServer + '/' + config.dbName;
var db = mongoose.createConnection(url, function(err, res){
    if(err) {
        console.log('[db.js : createConnection] Error connected: ' + url + ' - ' + err);
    } else {
        console.log('Success connected: ' + url);
    }
});
// 温湿度データを記録するスキーマ定義
var ThermoHumidSchema = new Schema({
    temperature: Number,
    humidity: Number,
    timestamp: Date
});

exports.ThermoHumid = db.model('ThermoHumid', ThermoHumidSchema);

kazz12211 について

Working as a OO programmer and enjoying music, bicycle and photography.

ディスカッション

コメントはまだありません。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

評価

ブログ統計

  • 583,199 ヒット

カテゴリー

アーカイブ

カレンダー

2016年8月
« 7月   9月 »
 123456
78910111213
14151617181920
21222324252627
28293031  
%d人のブロガーが「いいね」をつけました。