今回、ArduinoとCubieboardをNode.jsで繋げ、設定した温度に達した時、メールを送信するシステムを作りました。
このシステムは、遠くにある給湯室にある電子ポッドが沸騰したとき、仕事に忙しく遅れて冷めてしまう前に
通知することにより時間の節約ができるのではないかという考えから作成しました。
今回は一定値の温度に達したときにメールが届くシステムをやりたいと思います。
使用したもの
- Cubieboard
- Arduino UNO
- 温度湿度センサーモジュール DHT11
OS linux debian version 7.8
Cubieboardでの利点
・小型であり場所をとらないので使いやすいです。また消費電力も少なく高性能です
・値段も安価で普通のPCのようにネットをみたりメールもすることができます
・始めてのプログラミングにも使いやすく、学習用として最適です
・シリアル通信をすることができ、工夫を入れた電子工作できます
Arduinoとは?
開発環境の一つで手軽に開発できC++に似た言語を用い構成していく。
また、オープンソースハードウェアなので誰でも作ることができる。
Node.jsとは?
Node.jsとは、サーバーサイドのjavascriptでノンブロッキングI/Oを採用している。ノンブロッキングI/Oとは、入出力の完了を待たずに他の処理をしていく仕組みです。
Arduino側の設定
写真のように接続し、下のソースコードを参考にし作成しました。
https://sites.google.com/a/gclue.jp/iot-docs/shi-du
https://github.com/adafruit/DHT-sensor-library
https://github.com/adafruit/DHT-sensor-library?のDHT.cとDHT.ccを取得し、張り付けます。
Arduinoのソースコード
Arduino serialport
#include "DHT.h" #define DHTPIN A0 // what pin we're connected to #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); char trans[20]; char recv[10]; void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { // シリアルからのデータ受信 memset(recv, 0, 10); char *p = &recv[0]; recvStr(p); int h = dht.readHumidity(); int t = dht.readTemperature(); memset(trans, 0, 20); char *json = &trans[0]; if (isnan(t) || isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C"); sprintf(json , "{\"t\":%d,\"h\":%d}" , t , h ); Serial.println(json); } delay(5000); } // データ受信 void recvStr(char *buf) { int i = 0; char c; while (Serial.available()) { c = Serial.read(); buf[i] = c; i++; } }
ここからツール→シリアルモニタで結果が見れます。
Node.js側の設定
次にarduinoで読み取ったデータをシリアル通信でNode.jsサーバーに送信し、設定した温度を超える又は下回った時メールを送る動作をさせます。
npm コマンドを使い’serialport’パッケージと’nodemailer’パッケージを入れます。
npm install serialport npm install nodemailer
送信先のメールサービスですがGmailでは安定しなかったため、Hotmailを使用することにしました。
今回はメールが送信できるかの確認なので26℃を到達または下回ったときメール送信するように設定しました。
また、下のソースコードを参考にし作成しました。
http://tomowatanabe.hatenablog.com/entry/2013/03/23/233554
http://qiita.com/yoh-nak/items/1e433b0075e3ebdef9e3
serialport.js
var http = require('http'); var express = require('express') , path = require('path') , serialport= require('serialport'); var mailer = require('nodemailer'); var nodemailer = require('nodemailer'); var jsonData ={}; //型番号 var portName ='/dev/ttyACM0'; var sp = new serialport.SerialPort(portName,{ baudRate:9600, dataBits:8, parity:'none', stopBits:1, flowControl:false, parser:serialport.parsers.readline("\n") }); var transporter = nodemailer.createTransport({ service: 'Hotmail', auth: { user: 'メールアドレス', pass: 'パスワード', port: 'ポート番号' } }); var mailOptions = { from: '送信元のアドレス', to: '送信先のアドレス', subject: 'arduinoからのお知らせ', html: '一定値の温度を達しました' } var senddone = 0 //arduinoのデータ読み取り sp.on('data',function(input){ var buffer =new Buffer(input,'utf8'); var jsonData; try{ console.log('buffer:' +buffer); jsonData=JSON.parse(buffer); console.log('h: ' + jsonData.h); console.log('t: ' + jsonData.t); }catch(e){ return; } if(jsonData.t>= 26 && senddone===0){ //ここで数値の設定 //メールの送信時の対応 transporter.sendMail(mailOptions, function(err, res){ //送信に失敗したとき if(err){ console.log(err); //送信に成功したとき } else{ console.log('メールを送信しました!' + res.message); senddone =1; } } )}; if(jsonData.t < 26 && senddone===1){ //ここの数値の設定 transporter.sendMail(mailOptions, function(err, res){ if(err){ console.log(err); }else{ console.log('メールを送信しました!' + res.message); senddone =0; } } )} });
このように送信することができました。
今回はここまでです。
次回は、電子ポッドにセンサーを組み込み、wifiを使いメール受信時ブザーが鳴るシステムを作っていきたいと思います。