部屋の湿度の自動通知装置を自作した話その1
こんにちは!
先日、自分の部屋の湿度が上がりすぎたり下がりすぎたりした際に音声で自動通知してくれる装置をつくったのでそれについて書いていきたいと思います。今回は2回分割し、今回はハードウェア構成とマイコン側のプログラミング、次回はサーバー側のプログラミングについて書いていきます。
基本的には、以前作った自作温湿度計をベースにしたものですが、今回は液晶モニタはつけず、Wifi経由で通知してくれるような装置となっております。以前の温湿度計自作の記事はこちら↓。全体構成
DHTセンサーとかプログラムライブラリについてはそちらも参照ください。
全体構成
今回製作するシステムで実現したかった機能は「部屋の絶対湿度を計測し、既定値以上になったら音声で通知する」というものです。液晶モニターに写すのはそれはそれで役に立つのですが、やはり音声で通知してくれるのが一番かなと。湿度が下がってきたら「部屋が乾燥しています」とか音声で伝えてくれると、加湿器を入れたりそれに応じたアクションが取りやすいですしね。
この機能を実現するための大まかな流れとしては
① 温湿度センサーで温湿度を取得する
② 取得したデータを元にwifi機能付きマイコン(esp8266)で絶対湿度を算出
③ wifi経由でサーバーに温湿度・絶対湿度を送信
④ サーバー側プログラムで絶対湿度の判定、高すぎる/低すぎるときにはSlackにメッセージを投稿
⑤ 部屋の常設タブレット(Nexus 7)のアプリ「Tasker」でSlackの通知を読み上げ
とまあこんな感じ。お気づきの方もいるかもしれませんが、実はこれらはいままで作ってきたものの組み合わせで大部分が実装可能だったりします。サーバー側プログラムについては今回新たな試みとしてPythonによるWebフレームワーク「Flask」で実装してみましたが、それ以外の部分はこれまでにこのnoteで紹介した物を応用すれば割と気軽に実現することができました。
ちなみに、①と②については冒頭の温湿度計の記事、③と④については天気予報ランプの記事、⑤についてはTaskerの記事で使ったものを参考にしている感じです。ご興味のある方はそちらも是非読んでいただけると嬉しいです!
全体の構成としてはこんな感じ。
ハードウェア
システム構成で書いたとおり、温湿度計については以前と同様にDHT11を、マイコンとしてはWifiモジュール「esp8266」を使っています。esp8266については以前作成した自作シールドを利用。
そして今回は基盤への実装まではせずにブレッドボードを用いた簡易的な実装としました。ここからまだ改変するつもりだったというのもありますが、単純にはんだ付けなどがめんどくさかったという事情もありますww こんな感じ部屋の中に放置する感じですね。まあ、むき出しだとショートしたりするので本当は良くないんですけどね。。。
esp8266側のプログラムはこちらです。
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include "DHT.h"
#include <string.h>
#include <math.h>
#define DHTPIN 12 // 使用するGPIOピン
#define DHT_TYPE DHT11 // DHT 11
DHT dht(DHTPIN,DHT_TYPE);
const char* ssid = "接続するwifiのSSID";
const char* password = "接続するwifiのPassword";
const char* host = "192.168.179.11";
const double interval = 1000 * 60 * 30;
void setup() {
Serial.begin(9600);
delay(1000);
// We start by connecting to a WiFi network
Serial.println("");
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
dht.begin();
}
int value = 0;
void loop() {
delay(5000);
// Calculate absolute humidity
float humid = dht.readHumidity();
float temp = dht.readTemperature();
double Psat = 6.1078 * pow(10, 7.5 * temp / (temp + 273.15));
double Gsat = 217 * Psat / (temp + 273.15);
double Gabs = Gsat * humid / 100;
Serial.print("Temp: ");
Serial.println(temp);
Serial.print("Humid: ");
Serial.println(humid);
Serial.print("absolute humidity");
Serial.println(Gabs);
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 5000;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request
String url = "/?temp=" + String(temp) + "&humid=" + String(humid) + "&abs_humid=" + String(Gabs);
Serial.print("Requesting URL: ");
Serial.println(url);
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n"
"Host: " + host + "\r\n"
"Connection: close\r\n\r\n");
delay(5000);
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("closing connection");
delay(interval);
}
こちらのプログラムで行っているのは主に
① 温湿度センサー入力の取り込み
② 絶対湿度の計算
③ Wifi経由での温湿度データの送信
の三つです。温湿度データの送信については、urlパラメータとして渡す形にしています。具体的には下記の箇所ですね。
String url = "/?temp=" + String(temp) + "&humid=" + String(humid) + "&abs_humid=" + String(Gabs);
このurlパラメータをどのように扱うのかについては、次回の記事で紹介したいと思います!
まとめ
今回は、部屋の絶対湿度を音声で通知するシステムについて、全体の構成とハードウェア側について書きました。本文に書いたとおり、次回はサーバーサイドのプログラムと環境について書いていくつもりです。
今回の記事を書いていて思ったのは、やはり色々と手を出しているとその組み合わせで気軽にさまざまなことができるなぁということです。ある意味、自分のなかでライブラリ・モジュールが充実してくるようなイメージで、様々なライブラリが使えるようになることで一見すると複雑そうなものが比較的楽にできるというのは新しいことをはじめるハードルを下げる意味でも良いなと。
それでは、また!
この記事が気に入ったらサポートをしてみませんか?