Last Updated on 2018-04-16 by djnagureo
ホテル住まいではわからなかったのですが、
沖縄に在住すると、湿度がたかく、すぐにカビる。
自分も早速、靴にカビがちらほら見えまして、かつ
ゴキXXなど、虫も大嫌いです。
空気も、掃除も、自動化。
きれいで住み心地の良い部屋対策をすることとしました。
部屋の空気の流れをよくするために、安めのサーキュレーターと
奮発をして、連続排水(タンクがない)除湿機を購入しました。
裏にホースが接続できて、浴室に除水を送っています。
仕組み
湿度が上がる=70%を超える=除湿機・サーキュレーターON
下がる=60%から下がる=除湿機・サーキュレーターOFF
「温度・湿度センサー」と「通信モジュール」を中心に作ってみる。
ちょっとマニアックなので、概要だけにしておきます。
- 1時間おきに湿度と温度を測定
- 一定の湿度(70%)を超えたら、インターネット(ifttt)へ投稿をして、部屋の除湿機器を制御する。
- ついでにgoogleカレンダーにも記録
こんな感じです。
部屋はインターネットの契約をしていないこともあり、携帯の格安SIMをつかってネットに接続。
家電のON/OFFをさせます。
除湿機やサーキュレータは、一般的なものなので、電源ボタンを物理的にプッシュできるものを使います。
システム
除湿機 | コロナ CD-H18A | ホースで連続排水できる | たかかった |
サーキュレーター | アイリスオオヤマ PCF-HD15 | 安価 | |
スイッチ | Switchbot | Bluetooth | |
スイッチ用HUB | Switchlink | SwitchbotをWiFiに接続 | |
マイコン | ARDUINO系 ESP-32 | なんでも良い | 手持ち |
センサー | DHP-11 | 温度と湿度センサー | 手持ち |
通信ユニット | 3GIM | 通信モジュール | 手持ち |
格安SIM | 480円/月額 | なんでも良い | ヤマダ電機 |
1.センサーから、温度と湿度を1時間おきに取得をするプログラム
半田づけをしなくて、差込みで回路がつくれるブレッドボードをつかいます。
USBが電源で、処理(プログラム)を実行するマイコンと、温度・湿度センサーと、
ネットに通信をおこなうモジュールの構成です。
部品全体
2.ifttt
iftttとは、
ネットに「到達した情報」に対し、「何かの処理」をするサービスです。
「18:30分になったら、LINEに通知する」
インターネットに接続をする家電やガジェットが、
何か判断をして実行するためのサービスです。
通信モジュールから情報が来たら、SwitchbotのJyoshitsuのボタンを押す設定です。
3.除湿機がポチッとスイッチオンになる。
壁のコンセントもカチッとONになります。
スマートハウス
家の中のいろいろな家電が、環境(時間・気温・室温)で制御ができます。
自分は、那覇の住まいを意識することなく、東京と往復できるようになりました。
不在時でも、湿度の維持はもちろん、夜になると防犯のために(在宅として)照明をつけたり
いろいろな制御を自動化しています。
これが、もっともっと簡単にできたら良いのですが、教材を考えています。
初めまして。
ESP32用の3gimライブラリを何を用いていますか?
返信遅くなりました。
ESP32の場合、ハードウェアシリアル関連で3GIMライブラリをインクルードした際に、エラーが出てしまい
修正に時間を要しそうでしたので、3GIMライブラリを使用せず、コマンド通信としました。
以下、汚いのですが、ソースです。
// WIFIとBLYNK、DHT温度湿度センサーの読み込み、ESPのスリープ(省エネ)設定
#include
#include
#include “DHT.h”
#include “esp_deep_sleep.h”
// 3GIM格安SIMを使った通信モデムの設定。家のネット環境が停止した際の非常用。月480円のSIM。
unsigned long Baudrate_serialMonitor = 9600; //シリアルモニタの通信速度
unsigned long baudrate_3gim = 9600; //3GIMとの通信速度 $YB 9600 等で設定
HardwareSerial Serial1(2);
//#define ioSerial Serial // USB Serial port(not Serial)
//#define a3gSerial Serial1 // Use serial port
//BLYNKのAPI PASS
const char auth[] = “********”;
//WiFI設定
const char ssid[] = “********”;
const char pass[] = “********”;
//3GIMのモデム電源のON/OFF
const int powerPin = 5; // 3gim power pin(If not using power control, 0 is set.)
int len;
int one_sec = 1000;
// BLYNKのAPI、アプリを使用する
#define BLYNK_PRINT Serial
void process();
// 気温と湿度センサー
#define DHTPIN 23 // 使用するGPIOピン ESP32の23PIN
DHT dht(DHTPIN, DHT11); //DHT11という種類設定
BlynkTimer timer ;
// IFTTTへの送信API
String IFTTT_HOST = “$WG https://maker.ifttt.com“;
String IFTTT_URI1 = “/trigger/nahatemp/with/key/********”;
String IFTTT_URI2 = “/trigger/naha70jyoshitsu/with/key/********”;
String IFTTT_URI3 = “/trigger/naha80jyoshitsu/with/key/********”;
String IFTTT_URI4 = “/trigger/nahaoffjyoshitsu/with/key/********”;
void setup() {
while (!Serial1);
dht.begin();
Serial.begin(Baudrate_serialMonitor);
Serial1.begin(baudrate_3gim);
esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_SLOW_MEM, ESP_PD_OPTION_OFF);
esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_FAST_MEM, ESP_PD_OPTION_OFF);
esp_deep_sleep_pd_config(ESP_PD_DOMAIN_MAX, ESP_PD_OPTION_OFF);
Serial.println(“start…”);
Serial.println(“please wait a moment…”);
pinMode(powerPin, OUTPUT); digitalWrite(powerPin, HIGH); delay(100);
digitalWrite(powerPin, LOW);
//Welcome to 3GIMが表示されるまで待機
String str;
do {
while (!Serial1.available());
str = Serial1.readStringUntil(‘\n’);
Serial.println(str);
} while (str.indexOf(“3GIM”) < 0); Serial.println("Connected"); } void sendEnv() { delay(2000); float temp = dht.readTemperature(); float hum = dht.readHumidity(); if (isnan(temp) || isnan(hum)) { Serial.println("Failed to read from DHT sensor!"); return; } Blynk.virtualWrite(V6, temp) ; Blynk.virtualWrite(V5, hum) ; Serial.println("Temperature: " + String(temp) + "C Humidity: " + String(hum) + "%"); RequestToIFTTT("?value1=NAHA%20temp_humi&value2=" + String(round(temp)) + "&value3=%20" + String(round(hum))); if (hum > 80 ) {
RequestToHishitsudo(“?value1=NAHA%20temp_humi&value2=” + String(round(temp)) + “&value3=%20” + String(round(hum)));
}
else if (hum > 70 ) {
RequestToShitsudo(“?value1=NAHA%20temp_humi&value2=” + String(round(temp)) + “&value3=%20” + String(round(hum)));
}
else if (hum < 60 ) { RequestToShitsudooff("?value1=NAHA%20temp_humi&value2=" + String(round(temp)) + "&value3=%20" + String(round(hum))); } } void loop() { Blynk.run() ; delay(2000); // DeepSleepに入る Serial.println("Go to sleep..."); unsigned long tm = millis(); while (millis() - tm < 35000) { while (Serial1.available()) { char c = Serial1.read(); Serial.print(c); } } // delay(one_sec * 3600); delay(one_sec * 60); } // IFTTTにリクエストを送る void RequestToIFTTT(String param) { /* Serial.print("Initializing.. "); if (a3gs.start(DHTPIN) == 0 && a3gs.begin(0, baudrate_3gim) == 0) { Serial.println("Succeeded."); } */ // delay(25000); // ウェイトを持たせる Serial.println("httpGET() requesting.. "); Serial.println(IFTTT_HOST + IFTTT_URI1 + param); Serial1.println(IFTTT_HOST + IFTTT_URI1 + param); } void RequestToShitsudo(String param) { /* Serial.print("Initializing.. "); if (a3gs.start(DHTPIN) == 0 && a3gs.begin(0, baudrate_3gim) == 0) { Serial.println("Succeeded."); } */ // delay(25000); // ウェイトを持たせる Serial.println("httpGET() requesting.. "); Serial.println(IFTTT_HOST + IFTTT_URI2 + param); Serial1.println(IFTTT_HOST + IFTTT_URI2 + param); } void RequestToHishitsudo(String param) { // delay(25000); // ウェイトを持たせる Serial.println("httpGET() requesting.. "); Serial.println(IFTTT_HOST + IFTTT_URI3 + param); Serial1.println(IFTTT_HOST + IFTTT_URI3 + param); } void RequestToShitsudooff(String param) { // delay(25000); // ウェイトを持たせる Serial.println("httpGET() requesting.. "); Serial.println(IFTTT_HOST + IFTTT_URI4 + param); Serial1.println(IFTTT_HOST + IFTTT_URI4 + param); }