先日はArduinoとGroveのセンサで部屋の温度と湿度を測定して、Arduino IDEのシリアルモニタに表示させるところまでご紹介させていただきました。
・ArduinoとGroveのセンサで部屋の温度・湿度を測定してみた!
今回は、さらに受信した温度と湿度のデータをNoSQLのmonoDBに保存する方法をご紹介させていただきたいと思います。
Arduinoから送信する温度・湿度のデータをJSON形式にする
まず、Arduinoから送信する温度・湿度のデータをJSON形式で送信するようにします。
Arduino IDEのスケッチの内容を以下のソースに変更します。
もともと「Serial.print()」で送信していたデータの部分を、aJSONモジュールを使用してJSON形式のデータで送信するように変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#include <aJSON.h> #include "DHT.h" #define DHTPIN A0 #define DHTTYPE DHT11 char *jsonStr; DHT dht( DHTPIN, DHTTYPE ); void setup() { Serial.begin( 9600 ); dht.begin(); } void loop() { float Humidity = dht.readHumidity(); float Temperature = dht.readTemperature(); if( isnan(Temperature) || isnan(Humidity) ) { Serial.println( "Failed to read from DHT" ); } else { //Serial.print( "{""Humidity"": " ); //Serial.print( h ); //Serial.print( "%," ); //Serial.print( "t""Temperature"": " ); //Serial.print( t ); //Serial.println( " *C}" ); aJsonObject* aJosnLength = aJson.createObject(); aJson.addNumberToObject(aJosnLength,"Humidity", Humidity); aJson.addNumberToObject(aJosnLength,"Temperature", Temperature); jsonStr = aJson.print(aJosnLength); Serial.println(jsonStr); aJson.deleteItem(aJosnLength); free(jsonStr); } delay(1000); } |
❏関連資料・記事
・AWS IoTでArduinoからのセンサのデータをメールで通知する方法
・Rubyの「arduino_firmata」を使ってArduinoのLチカをやってみた!
・ArduinoとXBeeとNode.jsを使用してWeb画面からラジコンを操作できるようにしてみた!
サーバ側のNode.jsで温度・湿度のJSON形式のデータをmongoDBに保存する
Node.jsのサーバ側のソース(app.js)を以下のように変更します。
①「var a = JSON.parse(d).Humidity;」で受信した湿度のデータを変数aに格納します。
②「var b = JSON.parse(d).Temperature;」で受信した温度のデータを変数bに格納します。
③「collection.insertOne({ “Humidity”: a,”Temperature”: b }」でコレクションに湿度と温度のデータを入れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
// mongodbモジュールの読み込み var MongoClient = require("mongodb").MongoClient; // 接続文字列 var url = "mongodb://localhost/mydb"; var d = ""; //data from arduino sp.on('data', function(data) { //console.log("serialport data received: " + data); //JSON形式のデータが途切れても2回目以降に追加されるようにした d += data; console.log("emit_from_server_d = " + d); //lengthプロパティで文字数を格納 var len = d.length; //文字数が42文字より大きかったら以下の処理を実行 if(len > 42){ //console.log("emit_from_server_if_d = " + d); try{ //JSONデータからlengthの値を変数aに格納 var a = JSON.parse(d).Humidity; var b = JSON.parse(d).Temperature; // MongoDB へ 接続 MongoClient.connect(url, (error, db) => { var collection; // コレクションの取得 collection = db.collection("products"); // コレクションにドキュメントを挿入 collection.insertOne({ //変数aの値をlengthとして挿入 "Humidity": a, "Temperature": b // "name": a, // "price": 1280 }, (error, result) => { db.close(); }); }); console.log("emit_from_server_if_try_a = " + a); console.log("emit_from_server_if_try_b = " + b); io.sockets.emit('emit_from_server', a); d = ""; }catch(e){ console.log('error'); d = ""; } } }); |
Node.jsのサーバを起動してデータを受信する
以下の手順でNode.jsのサーバを起動してArduinoから送信されてきた温度と湿度のデータが受信できることを確認します。
[前提] ・上記の手順でArduino IDEのシリアルモニタに温度と湿度が表示されること①コマンドプロンプトを起動して「app.js」があるところまで移動します。
②「node app.js」でNode.jsのサーバを起動します。
③以下のようにコマンドプロンプトに温度と湿度のデータが表示されることを確認します。
mongoDBに温度と湿度のデータが保存されたことを確認する
以下の記事と同様にして、mongoDBを起動してデータが保存されたことを確認します。
・ArduinoとNode.jsで測定したセンサからの値をmongoDBに保存してみたよ!【#IoTっぽいこと】
①コマンドプロンプトを起動してmongoDBをインストールしたフォルダに移動します
②「mongo」と入力して実行します
③「use mydb」と入力して使用するDBを指定します
④「db.products.find()」と入力し、以下のようにデータベースのコレクション「products」に温度と湿度のデータを保存できたことを確認します
今回は以上の手順で、ArduinoとGroveのセンサで測定した温度と湿度のデータをmongoDBに保存することができました。今回のデータは2種類でしたが、今回と同じ様にしてJSONデータのソースを追記することでもっと複数のデータをやりとりできるようになるかと思います。
今後はこのDBに保存したデータをブラウザで表示したり、解析したりして利用できたらいいかなと思っています!
コメントを残す