背景色変更

arduinoで温度を計測しメールで通知するシステム

今回、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を使いメール受信時ブザーが鳴るシステムを作っていきたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>