こんにちは!自宅のセキュリティを強化したい、あるいは電子工作で実用的なものを作りたい、そうお考えではありませんか?
今回は、高性能なWi-FiモジュールESP32を使い、窓が開いたことを検知してブザーを鳴らし、さらにメールでスマホに通知する「窓の開閉監視装置」を自作する方法を徹底解説します。
ボタン電池(CR2032)は使わず、より長時間の運用が可能な乾電池3本(4.5V)と降圧回路を使った安定電源方式を採用します。必要な部品選びから、プログラミング、配線まで、この記事で全てマスターしましょう!
1. 装置の仕組みと動作の流れ
今回作る装置は、以下の3つの役割を果たす部品で構成されています。
- 検知役:マグネットセンサー
- 窓枠と窓にそれぞれ取り付け、磁石が離れる(窓が開く)とそれを電気信号としてESP32に送ります。
- 頭脳役:ESP32
- センサーからの信号を受け取り、ブザーを鳴らす、Wi-Fiに接続する、メールを送信するという全ての判断と制御を行います。
- 警告役:ブザー&メール
- 窓が開いた瞬間、ブザーが鳴り続け、同時にインターネット経由で設定したメールアドレスに通知が飛びます。
このシステムは、窓が閉まればブザーが自動で止まる、実用的な設計です。
2. 必要な部品リスト
CR2032ではなく、乾電池3本(4.5V)を3.3Vに変換するための部品を追加します。
部品名 | 役割 | 備考 |
ESP32 DevKitC / ESP32-WROOM | 装置の頭脳。Wi-Fi通信機能が必須。 | |
単三/単四乾電池 x 3本 | メイン電源。合計4.5V。 | アルカリ電池推奨。 |
乾電池ケース(3本用) | 電池の接続と保持。 | スイッチ付きだと便利。 |
DC-DC降圧コンバーター | 4.5VをESP32が動く3.3Vに安定変換。 | 例: MP1584モジュールなど、高効率なもの。 |
リードスイッチ型マグネットセンサー | 窓の開閉検知スイッチ。 | 磁石と本体のセット。 |
電子ブザー (アクティブブザー) | 警報音を鳴らすスピーカー。 | アクティブ型は制御が簡単。 |
NPNトランジスタ (例: 2SC1815) | ブザー駆動用のスイッチ。 | ESP32の弱い信号で大電流のブザーをONにするために必須。 |
抵抗 | トランジスタのベース電流制御用(1kΩ) | |
ジャンパーワイヤー | ブレッドボードでの配線用。 | |
ブレッドボード | 試作・実験用。 |
💡電源に関する補足:なぜ降圧回路が必要か?
乾電池3本の電圧は4.5Vです。ESP32は通常3.3Vで動作するため、間にDC-DC降圧コンバーター(レギュレーター)を挟むことで、電圧を安全に3.3Vに下げ、かつ安定して供給する必要があります。これにより、電池の残量が減っても最後まで安定動作しやすくなります。
3. ブレッドボード配線のポイント
ブザーをESP32のピンに直接繋いではいけません。壊れる原因となるため、必ずトランジスタを挟んでスイッチとして使います。
配線の手順(電源部から)
- 電源の準備:乾電池ケースのプラス(+)を降圧コンバーターのVINへ。ケースのマイナス(−)をコンバーターのGNDへ繋ぎます。
- 電圧変換:降圧コンバーターの出力電圧が3.3Vになっていることをテスターなどで確認します。(可変タイプの場合)
- ESP32への給電:コンバーターのVOUTをESP32の3V3ピンに接続します。コンバーターのGNDをESP32のGNDピンに接続します。
配線の手順(センサーとブザー)
接続元部品 | ピン | 接続先 | 役割 |
マグネットセンサー | 信号線 | ESP32 (GPIO 27) | 窓の開閉信号入力 |
ブザー (アクティブ) | プラス(+) | ESP32 (3V3) | ブザーの電源(3.3V) |
ブザー (アクティブ) | マイナス(−) | NPNトランジスタのコレクタ(C) | トランジスタに電流を流す |
トランジスタ (ベース B) | 1kΩ抵抗を介してESP32 (GPIO 26) | ブザーをON/OFFする信号入力 | |
トランジスタ (エミッタ E) | ESP32 (GND) | 電流をGNDに流す |
【センサーの仕組み】 マグネットセンサーの信号ピンは、ESP32のINPUT_PULLUP(内部プルアップ)で使うのが一般的です。
- 窓が閉まっている(磁石が近い):信号ピンがGNDに繋がり、LOWが出力されます。
- 窓が開いている(磁石が離れた):信号ピンが開放され、HIGHが出力されます。(このとき警報を出す)
4. プログラム作成(Arduino IDE)
警報とメール通知を実現するプログラムの骨格です。
事前準備:メール送信ライブラリのインストール
メール送信には「ESP32 Mail Client」ライブラリを使用します。
- Arduino IDEの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」を開きます。
- 検索窓で「ESP32 Mail Client」と検索し、インストールします。
- Gmailを使用する場合、通常のパスワードではなく 「アプリ パスワード」 を設定する必要があります。Googleアカウントのセキュリティ設定から事前に取得しておいてください。
スケッチコード
メールの認証情報やピン番号は、ご自身の環境に合わせて必ず書き換えてください。
C++
#include <WiFi.h>
#include "ESP_Mail_Client.h" // メール送信ライブラリ
// --- (1) Wi-Fi設定 ---
#define WIFI_SSID "あなたのWi-Fi名"
#define WIFI_PASSWORD "あなたのパスワード"
// --- (2) ピン設定 ---
const int SENSOR_PIN = 27; // マグネットセンサーの入力ピン
const int BUZZER_PIN = 26; // ブザー制御用の出力ピン
// --- (3) メール設定 ---
#define SMTP_HOST "smtp.gmail.com"
#define SMTP_PORT 465
#define SENDER_EMAIL "あなたの送信元Gmailアドレス"
#define SENDER_PASSWORD "Gmailのアプリパスワードをここに入力"
#define RECIPIENT_EMAIL "あなたの通知先メールアドレス"
// --- (4) 状態変数 ---
bool is_alerting = false; // 現在、警報状態かどうか
SMTPSession smtp; // メールセッションオブジェクト
// ----------------------------------------------------
// setup():起動時に一度だけ実行
// ----------------------------------------------------
void setup() {
Serial.begin(115200);
pinMode(SENSOR_PIN, INPUT_PULLUP); // プルアップ入力設定
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW); // ブザーOFFから開始
// Wi-Fi接続処理
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
}
// ----------------------------------------------------
// loop():繰り返し実行
// ----------------------------------------------------
void loop() {
int sensor_state = digitalRead(SENSOR_PIN); // センサーの状態を読む
// 1. 窓が開いた(HIGH) AND まだ警報状態ではない場合
// INPUT_PULLUP設定なので、磁石が離れるとHIGHになる
if (sensor_state == HIGH && !is_alerting) {
Serial.println(">>> 窓が開きました!警報開始。");
// 警報をONにする (ブザーが鳴り続ける)
digitalWrite(BUZZER_PIN, HIGH);
is_alerting = true;
// メール送信処理(メールは検知時に一度のみ送信)
sendAlertEmail();
}
// 2. 窓が閉まった(LOW) AND 現在警報状態である場合
if (sensor_state == LOW && is_alerting) {
Serial.println(">>> 窓が閉じました。警報停止。");
digitalWrite(BUZZER_PIN, LOW); // ブザーOFF
is_alerting = false;
}
delay(100); // センサーチェック間隔
}
// ----------------------------------------------------
// sendAlertEmail():メール送信専用関数
// ----------------------------------------------------
void sendAlertEmail() {
if (smtp.connect(SMTP_HOST, SMTP_PORT) == false) {
Serial.println("メール: SMTP接続エラー");
return;
}
// 認証情報の構成
Session_Config config;
config.server.host_name = SMTP_HOST;
config.server.port = SMTP_PORT;
config.login.email = SENDER_EMAIL;
config.login.password = SENDER_PASSWORD; // アプリパスワード
// メッセージ内容
SMTP_Message message;
message.sender.name = "窓監視システム (ESP32)";
message.sender.email = SENDER_EMAIL;
message.subject = "【🚨警報🚨】窓の開閉を検知しました!";
message.addRecipient("ユーザー", RECIPIENT_EMAIL);
String mail_body = "時刻: " + String(millis() / 1000) + "秒\n";
mail_body += "窓が開きました。すぐに確認してください。\n";
message.text.content = mail_body;
// 送信実行
if (!MailClient.sendMail(&smtp, &config, &message)) {
Serial.println("メール送信エラー: " + smtp.errorReason());
} else {
Serial.println("メール送信成功!");
}
}
5. まとめと次のステップ
今回は、電池駆動を考慮した電源回路と、実用的な防犯機能をESP32で実現しました。
- 乾電池3本+降圧回路で安定した3.3V電源を確保。
- トランジスタでブザーを安全に駆動。
- マグネットセンサーのON/OFFでブザーとメールを制御。
【さらに改善するには?】
このシステムは窓が開いている間、Wi-Fi接続とブザーの駆動で電力を消費し続けます。より長時間運用するためには、以下の改善が考えられます。
- ブザーの鳴動時間制限:ブザーを10秒間だけ鳴らした後、OFFにする処理を追加する。
- Deep Sleepの活用:窓が閉まっている間はESP32をDeep Sleep(超省電力モード)に入れ、センサーの割り込み(窓が開いたとき)でのみ起動するようにする。(ただし、この場合、プログラムのロジックが大幅に複雑になります。)
自作の監視システムで、ぜひ安全な生活を手に入れてください!