これはなに?
最近じめじめしてきたので、部屋の温度・湿度を記録してみたくなりました。
せっかくなのでセンサーとWifiボードを直結して、自動的に記録をするシステムにしてみました。
Wifi経由でサーバに送信し、サーバ側ではinfluxDBとgrafanaを用意し可視化しました。
設計
紙の上でばばばっと
(図中で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.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() {
if((WiFiMulti.run() == WL_CONNECTED)) {
HTTPClient http;
USE_SERIAL.print("[HTTP] begin...\n");
http.begin("http://なんかエンドポイント?" + getDHTString());
USE_SERIAL.print("[HTTP] GET...\n");
int httpCode = http.GET();
if(httpCode > 0) {
USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);
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);
delay(10000);
}
delay(10000);
}
こんな感じです。
サーバ側
今回は自分でサーバ側も書きます。
手抜きで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);
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のこういうガジェットが作れるというのは、なかなか面白いです。
次はにおいセンサーに挑戦したいな と思いつつ、しばらく運用してみます。