これはなに?
最近じめじめしてきたので、部屋の温度・湿度を記録してみたくなりました。
せっかくなのでセンサーとWifiボードを直結して、自動的に記録をするシステムにしてみました。
Wifi経由でサーバに送信し、サーバ側ではinfluxDBとgrafanaを用意し可視化しました。
材料
最近はこういうものを作るのはすごく簡単になってます。
まずはWifiを簡単に扱えるマイコンボード
ESP-WROOM-02
http://cerevo.shop-pro.jp?pid=91592223
秋月やスイッチサイエンスでも買うことができます。
ブレイクアウトボード付きで1000円くらい。
- 出版社/メーカー: スイッチサイエンス(Switch Science)
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
今回はこのボードをArduinoとして利用します。
ちょうどこの前のIoT合宿で使い方を調べていたので、さくっと使い始めることができました。
http://d.hatena.ne.jp/inajob/20160606
それから温度センサ
AM2320
http://www.akizukidenshi.com/catalog/g/gM-08663/
こちらは秋月のちょっといいやつ600円
AM2320デジタル温度湿度センサーAM2320B、SHT10、SHT11および他のシリーズに代わる
- 出版社/メーカー: JINGLUYAO
- メディア:
- この商品を含むブログを見る
有名なものらしくArduinoのライブラリが公開されていたので、細かいことを気にせずに利用できそう。
計画
まずはESP-WROOM-02の使い方を調べます。
https://tech-blog.cerevo.com/archives/859/
配線はこれでよさそう
ESP-WROOM-02はファームウェアを書き換えることでArduino的に扱えるようになるとのことなのでそれも調べてみる。
http://deviceplus.jp/hobby/entry034/
この辺が参考になりそう。
書き込みの設定もいくつかある模様
http://qiita.com/umi_kappa/items/ced90c258a14be165291
この辺りを参考にした。
Wifiは電気を食うのでDeepSleepモードというものについても調べてみた
http://qiita.com/azusa9/items/65a5c3772c41631b5ca1
温度センサーの使いかた発見
https://www.sglabs.jp/esp-wroom-02-sensor/
http://d.hatena.ne.jp/high-sai/20160409/1460245483
さて、材料はそろったかな
試しに使ってみる。
https://tech-blog.cerevo.com/archives/859/
ここに従って回路を組み立てて、ATコマンドでWeb上のコンテンツをとってくるというのを試した。
続いてArduinoとして使えるというのを試すためにArduinoIDEからLチカのプログラムを流し込む。
最後に組み合わせ技で、Web上のファイルを読み込み、その中身に応じてLEDの光をつけたり消したりする、というのを作りました。
ここまでは肩慣らし。
設計
紙の上でばばばっと
(図中でESP-WROOM-02となっているところはCEREVOのブレイクアウトボードです。 http://cerevo.shop-pro.jp?pid=91592223 )
この温度センサは1本の線で制御できるらしいということで、こんな感じ。
プログラムは
#include <Arduino.h> #include <ESP8266WiFi.h> #include <ESP8266WiFiMulti.h> #include <ESP8266HTTPClient.h> #include <DHT.h> #define USE_SERIAL Serial ESP8266WiFiMulti WiFiMulti; DHT dht(4, DHT22); void setup() { USE_SERIAL.begin(115200); // USE_SERIAL.setDebugOutput(true); USE_SERIAL.println(); USE_SERIAL.println(); USE_SERIAL.println(); for(uint8_t t = 4; t > 0; t--) { USE_SERIAL.printf("[SETUP] WAIT %d...\n", t); USE_SERIAL.flush(); delay(1000); } WiFiMulti.addAP("<SSID>", "<PASSWORD>"); } String getDHTString(){ float t = dht.readTemperature(); float h = dht.readHumidity(); if(isnan(h) || isnan(t)){ USE_SERIAL.print("failed to read from dht sensor!"); USE_SERIAL.flush(); return ""; } return "t=" + String(t) + "&h=" + String(h); } void loop() { // wait for WiFi connection if((WiFiMulti.run() == WL_CONNECTED)) { HTTPClient http; USE_SERIAL.print("[HTTP] begin...\n"); // configure traged server and url http.begin("http://なんかエンドポイント?" + getDHTString()); //HTTP USE_SERIAL.print("[HTTP] GET...\n"); // start connection and send HTTP header int httpCode = http.GET(); // httpCode will be negative on error if(httpCode > 0) { // HTTP header has been send and Server response header has been handled USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); // file found at server if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); USE_SERIAL.println(payload); } } else { USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); ESP.deepSleep(30 * 1000 * 1000 , WAKE_RF_DEFAULT); // 30sec delay(10000); } delay(10000); }
こんな感じです。
組み立て
はんだ付けして、空いていたZiplocに入れてみる。
電源は単三電池4本
基板は秋月C基板に これまた秋月のアクリルパネルをねじで固定して背面がショートするのを防いでいます。
アクリルパネル: http://akizukidenshi.com/catalog/g/gP-09853/
サーバ側
今回は自分でサーバ側も書きます。
手抜きでPHPでさっと作る。
たまたまサーバにはInfluxdbとGrafhanaがはいっていたのでそこに流し込みます。
<?php error_log("get t=" . $_GET["t"] . " h=" . $_GET["h"]); require_once __DIR__ . '/vendor/autoload.php'; define('INFLUXDB_HOST', 'INFLUXDBサーバ'); define('INFLUXDB_PORT', INFLUXDBポート); define('INFLUXDB_NAME', 'DBの名前'); define('INFLUXDB_USER', 'ユーザ名'); define('INFLUXDB_PASS', 'パスワード'); $client = new InfluxDB\Client(INFLUXDB_HOST, INFLUXDB_PORT); $db = $client->selectDB('INFLUXDB_NAME'); $points = array( new InfluxDB\Point( 'temperature', (float)$_GET['t'] ), new InfluxDB\Point( 'humidity', (float)$_GET['h'] ), ); try { $result = $db->writePoints($points, InfluxDB\Database::PRECISION_SECONDS); #var_dump($result); error_log(var_export($result, true)); } catch (Exception $e) { error_log(var_export($e, true)); } error_log("success"); ?>
電池が切れた
3日目にして電池が切れました。 30s間隔で動かしてこんなもん(起動などがあるので実質1分間隔くらい)
ということで30分間隔にすると30倍持つということかな? であれば90日持つか?
これから実験してみよう
いったんまとめ
2000円くらいでセンサ+Wifiのこういうガジェットが作れるというのは、なかなか面白いです。
次はにおいセンサーに挑戦したいな と思いつつ、しばらく運用してみます。