【自作】洗濯物 取り込み忘れ防止機器
目次
はじめに
WIFIモジュールを用いて、洗濯物 取り込み忘れ防止機器を作成します。
仕組みとしてはWIFIルーターとWIFIモジュールの信号強度(RSSI)の値からWIFIモジュールが屋外にあるか、屋内にあるか判定します。
屋内の場合はRSSIが小さく、屋外の場合はRSSIが大きくなります。
取得したRSSIはWIFIモジュール内で屋内外の判定を行い、屋外であれば信号を出力します。出力した信号はWIFIルーター、Webhooks、LINEを経由してスマートフォンへ通知する仕組みとなっています。
Webhooks、LINEの設定はIFTTTを用いて、行っています。
使用したもの
・WIFIモジュール:ESP-WROOM-02 ピッチ変換済みモジュール
・降圧レギュレータ:AMS1117-3.3 DC-DC降圧コンバータモジュール
・モバイルバッテリー:CP-EL(メーカー:SONY) 電池容量 2000mAh
WIFIモジュールはarduinoIDEで開発可能な事と入手しやすいため、
回路図
IC2:AMS1117-3.3 DC-DC降圧コンバータモジュールで5V→3.3Vへ変換しています。
このモジュールにはOUTピンーGND間に22uFのコンデンサが実装されています。
また、動作確認用のLEDも実装されています。
IC1周辺回路はESP-WROOM-02のデータシートの回路図を参照して回路を構成しています。
IO16ピンーRSTピン間のスイッチSW1はDeep Sleepモード切り替え用のスイッチになります。
IO0ピンーGND間のスイッチSW2は書き込みモード、フラッシュモードを切り替えるスイッチです。
消費電力を抑えるため、通常起動時はDeep Sleepモードを用いています。
そのため、IC1へのプログラム書き込み時、通常起動時のSW1,SW2の設定は下記になります。
SW1 | SW2 | |
プログラム書き込み | Open | Short |
通常起動 | Short | Open |
プログラムコード
#include <ESP8266WiFi.h>
#include <time.h>
#define JST 3600*9
//ネットワーク情報
char* ssid = "********"; //””で囲まれた中にWiFiルーターのssid
char* password = "*******"; //””で囲まれた中にWiFiルーターのpassword
//IFTTT情報
const char* host = "maker.ifttt.com";
const char* eventName = "*****"; // ””で囲まれた中にeventNameをいれる
const char* key = "******"; // ””で囲まれた中にkeyをいれる
WiFiServer server(80);//webサーバーをポート80に設定する
String header;//HTTPリクエストのヘッダーを格納する変数
unsigned long currentTime = millis();
unsigned long previousTime = 0;
const long timeoutTime = 2000;
void setup(void)
{
Serial.begin(115200);
Serial.print("Connecting to ");
Serial.println(ssid);
//Wi-Fi接続を開始する
WiFi.begin(ssid, password);
//接続が開始するのを待つ
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
yield();
}
//WiFiServer server(80);で作成したサーバーを開始
server.begin();
configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
//時刻反映を正確にするためにdelay必要
delay(5000);
}
void loop(void)
{
time_t t;
struct tm *tm;
static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
t = time(NULL);
tm = localtime(&t);
Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
wd[tm->tm_wday],
tm->tm_hour, tm->tm_min, tm->tm_sec);
//無線の強さを取得
long rssi = WiFi.RSSI();
Serial.println(rssi);
//無線の強さ かつ 時間を判定
if(rssi<-67&&tm->tm_hour>16){ //無線の強さから屋内外判定 かつ 時間を判定
sendifttt(); //iftttへ信号出力
}
//deep sleepは上限35分(36分以上は不安定になった)
ESP.deepSleep(35*60 * 1000 * 1000, WAKE_RF_DEFAULT);
// スリープモード移行用待機処理
delay(1000);
}
//IFTTTへ送信
void sendifttt(){
Serial.print("connecting to ");
Serial.println(host);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
client.print(String("GET ") + "/trigger/"+ eventName + "/with/key/" + key + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Client Timeout !");
client.stop();
return;
}
yield();
}
while(client.available()) {
String line = client.readStringUntil('\r');
Serial.print(line);
yield();
}
Serial.println();
client.stop();
Serial.println("closing connection");
}
WIFI通信の設定を行い、時刻とWIFI通信の強さを取得し、屋外の通信強度でかつ16時より遅い時間であれば、IFTTTへ信号を送信するようにしています。
その後は消費電力削減のため、35分間deep sleepモードへ遷移するようにしています。
ネットワーク情報のssid、passwordはWIFIルーターに合わせて、設定します。
IFTTT情報はIFTTTの設定に合わせる必要があります。
if(rssi<-67&&tm->tm_hour>16)の部分は
無線の環境に合わせて-67を変更し、16はアラームを出力したい時間へ変更すると出力条件を変更できます。
deep sleepは35分までは正常動作したため、35分と設定しました。
プログラム上の設定時間の単位はμsecになるため、35*60 * 1000 * 1000としています。
出来上がり
・モジュール状態
・ケース組み込み
・モバイルバッテリー+ケース組み込み
・物干しへの設置状態
切断したストッキングへモバイルバッテリーと機器を収納し、
物干しへ組み込んだ
消費電流
消費電流は機器の立ち上がりからdeep sleepへ遷移するまでは70mA~150mAを遷移しています。deep sleep時は実測値で約3mAでした。
2000mAhのモバイルバッテリーを用いた構成であると、deep sleep時だけの電流でも27.7日しか起動できない計算になります。そのため、半年くらい稼働する構成にするには5V→3.3Vへ変換している降圧レギュレータの変更、バッテリー容量の増加を行う必要がありそうです。
おわりに
降圧レギュレータのAMS1117-3.3DC-DC降圧コンバータモジュールはLEDが実装されていることとAMS1117-3.3の自己消費電流がデータシートでは5mA(Typ)、11mA(Max)であるため、長時間動作させるためには変更が必要になります。
次回は降圧レギュレータの変更検討について記載していきます。