LoginSignup
33
32

More than 5 years have passed since last update.

XBee Wi-FiでセンサーデータをAWSにアップロードする

Last updated at Posted at 2014-07-27

pic

温湿度センサーのデータをArduinoからXBee Wi-Fiを介してAWSにアップロードする。

準備

センサー回路

  • センサー: 扱いやすいセンサーがよいだろう。温湿度センサーRHT03(950円)など。(秋月店頭で買ったときは950円もしなかった気がするが、正確に覚えていない。アウトレット品だったかもしれない) ついでの以下のものを買う。安いものでよい。
  • ブレッドボード
  • ジャンパー線セット
  • 0.1μFセラミックコンデンサ

XBee Wi-Fi

スイッチサイエンスなどで買える。4000円程度。

Arduino XBeeシールド

スイッチサイエンスなどで買える。1300円程度だが、ハンダ付けのためハンダとこて、こて台が必要。
写真を見ながらハンダ付けしておく。
※XBeeとArduinoを接続するだけなのでプロトタイピング段階ではブレッドボードなどで代用してもよいかも。
とくにArduinoからシールドへの通信とMacへの通信がバッティングするので、MacからArduinoへプログラムを書き込むたびにシールドを抜き差しすることになりあまりよくない。

Arduino Uno

Amazonでも買える。3000円程度。

ACアダプター

回路全体に電源を入力する。家庭用ACを6V以上のDCに変換できればなんでもよい。
マルツなどで買えば1900円程度。

回路組み立て

回路図はMacでいいソフトを知らないので割愛。
センサのデータシートを見ながら、組み立てたシールドと接続する。
RHT03をブレッドボードに差し、左から1,2,3,4番ピンとして、ジャンパ線で1をVCC(3.3V)、2をArduinoの入力(ここでは7番とする)、4をGNDにつなぐ。
1と4の間に0.1μFを渡す。

ソフトウェア設定

Webサーバー

AWSのEC2インスタンスにSinatraなどを準備する。
inbound/outboundの4567番(Sinatraのデフォルト)を開けたセキュリティグループにインスタンスを割り当てる。ポートは別に変更してもよい。

$ gem install sinatra
api.rb
require 'sinatra'

post '/api/measurements' do
  vals = request.body.read
  logger.info vals
end
$ ruby api.rb  -o 0.0.0.0

Arduino

WebでArduinoをDLしておく。

今回のセンサは回路は単純だがデータの読み取りはやや複雑(温度と湿度のデータが1本の線にパルス化して乗ってくる)で、専用のライブラリがあるのでArduinoのライブラリディレクトリに配置。

$ git clone https://github.com/adafruit/DHT-sensor-library /Applications/Arduino.app//Contents/Resources/Java/libraries/DHT

Arduinoを起動し、Sketch > Import Library > DHTと追加されていることを確認。

透過モードのXBeeに対してデータを送るためには、ArduinoからはSerial.printを使えばよい。

新しいスケッチを書いてCommand + UでArduinoに転送。

  • ライブラリは華氏温度を返すので摂氏温度にする。
  • DHT22_PIN7にしているのはArduinoの7番にセンサをつないでいるから。
  • floatからStringへの変換はArduino Unoの場合はdtostrfを使う。
DHTtest.ino
#include <DHT.h>
#define DHTTYPE DHT22
#define DHT22_PIN 7
DHT dht(DHT22_PIN, DHTTYPE);

void setup() {
  pinMode(DHT22_PIN, INPUT);      
  Serial.begin(9600);
}

char ch[10];
char ct[10];

void loop()
{
  float h  = dht.readHumidity() ;
  float t  = 5.0/9.0*(dht.readTemperature(true)-32.0); // fahrenheit -> celsius
  dtostrf(h, 6, 2, ch);
  dtostrf(t, 6, 2, ct);

  String postData = "{humidity:";
  postData.concat(ch);
  postData.concat(",temperture:");
  postData.concat(ct);
  postData.concat("}");

  Serial.print("POST /api/measurements HTTP/1.1\r\n");
  Serial.print("Content-Length: " + String(postData.length()) + "\r\n\r\n");
  Serial.print(postData);

  delay(2000);

}

XBee Wi-Fi

前回と同様にXBeeの設定を行う。変更が必要なのは以下くらいだろう。

  • Destination IP Address : (EC2インスタンスのpublic IP)
  • Source Port : 11D7 (4567 = 0x11D7)
  • Destination Port : 11D7

確認

XBee Wi-Fiとシールド、Arduinoを組み合わせ、電源を入れる。
サーバーログを見て

"{humidity: 59.40,temperture: 27.50}"
xxx.xx.xxx.xxx - - [27/Jul/2014 14:24:43] "POST /api/measurements HTTP/1.1" 200 35 0.0005
XXX.ne.jp - - [27/Jul/2014:14:24:43 UTC] "POST /api/measurements HTTP/1.1" 200 35
- -> /api/measurements

のようにJSONが2秒おきに送られ始めたら成功(だめならtcpdump port 4567も見る)。
湿度は59.40%、気温は27.50度ということらしい。
濡れたタオルなどを近づけると湿度が上がるのを確認する。
あとはWebサーバー側で煮るなり焼くなりすればよい。

参考

33
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
32