「無線型 IoT で完璧な防犯をしたい!」「でも、バッテリーが切れたら? センサーを壊されたら?」
この記事では、窓からの侵入検知に特化し、従来の誤検知対策に加え、システムの弱点である電源断や破壊行為にも対応した、超高信頼性の自作 IoT システムの設計を解説します。ESP32 $\text{ディープスリープを活用した電源監視と、物理的防御を組み込んだ完全版スケッチを公開します。
🎯 IoT 防犯システムの 5 つの設計目標(セキュリティ強化)
- 超低消費電力設計: IQ を μA 級に抑え、電池寿命を最大化する。
- 高信頼性センサー: ツインミラー PIR で熱源・虫の誤検知を防ぐ。
- 電源監視: バッテリー残量を監視し、システム断前に低電圧アラートを発報する。
- 破壊対策: 物理的防御と検知ロジックにより、センサー破壊・無効化に対応する。
- 賢いソフトウェアロジック: 2 センサーの時間差 1.0 秒以内を判定し、確実な通過のみを「侵入」と確定する。
I. 🛠️ 必要な部品リストと電源監視戦略
1. 主要部品リスト(低電圧監視機能を追加)
カテゴリ | 部品名 | 数量 | 選定のポイント |
制御/通信 | ESP32 DevKit | 1 | ADC(アナログ・デジタル変換)ピンを使用し、電圧監視を可能とする。 |
センシング | ツインミラー (PIR 二素子) センサーモジュール | 2 | 高温ノイズ、虫の熱に強いモデル。 |
アクション | アクティブブザー(5V 駆動) | 1 | 侵入確定時の警告音出力。 |
電源 | リチウムイオンバッテリー (Li-ion または Li-Po) | 1 | 大容量。 |
ソーラー充電モジュール(TP4056 など) | 1 | バッテリーの充電と保護。 | |
分圧抵抗(例:100 kΩ と 200 kΩ) | 1 set | 低電圧監視のためにバッテリー電圧を ESP32 の ADC 範囲内に下げる。 | |
筐体/その他 | 汎用プラスチックケース | 1 | 虫対策のメッシュと物理的な強度を確保。 |
2. 電源供給とシステム断対策
🔋 システム断(バッテリー切れ)対策
- 電圧監視: ESP32 の ADC ピン(例:GPIO35)とバッテリー間に分圧抵抗を接続し、システム起動直後にバッテリー電圧を測定します。
- 低電圧アラート: 電圧がクリティカルレベル(例:3.5 V)を下回った場合、侵入検知よりも優先して「バッテリー残量低下」の通知を行い、ユーザーに交換を促します。これにより、監視システムが突然停止する事態を防ぎます。
- IQ 対策: ESP32 は通常ディープスリープで待機し、PIR の外部割り込みでのみ起動します。
🔨 センサー破壊・無効化対策
- 物理的防御: センサーを収める筐体には、頑丈な素材を使用し、ネジが外から見えない構造(裏側から固定など)にします。
- 無効化対策(遮蔽): 侵入者がセンサーのレンズを遮蔽(テープなどで覆う)しようとすると、近距離で熱源が急激に変化するため、瞬間的に PIR が ON になる可能性が高まります。
- 遮蔽物による瞬時の ON 信号を 「無効化の試み」として捉えることもできますが、本システムでは、2 センサーロジックの厳格な時間チェック により、人間の通過速度を伴わない異常な PIR 信号は自動的にノイズとして無視されます。これにより、緩慢な遮蔽行為を侵入として誤検知するリスクを減らします。
II. 💻 【完全版】ESP32 Arduino スケッチ(電源監視追加)
1. 侵入確定ロジック(再確認)
条件 | 設定値(推奨) | ロジックの目的 |
順序の確認 | PIR1(窓際)→ PIR2(室内)の順に ON | 侵入の方向を確定。 |
時間差の確認 | 1.0 秒以内 | 人間の速度に限定し、虫や熱源の不規則な動きを排除。 |
継続性のチェック | センサー ON 信号が 0.5 秒以上継続 | 一瞬のノイズや電気的なスパイクを無視。 |
2. ESP32 Arduino スケッチの主要部分
C++
#include <WiFi.h>
#include "esp_sleep.h"
// --- 定数とピン設定 ---
const int PIR1_PIN = 32;
const int PIR2_PIN = 33;
const int BUZZER_PIN = 4;
const int BATTERY_ADC_PIN = 35; // バッテリー電圧測定用ADCピン
// 誤検知防止のための時間設定 (ms単位)
const long MAX_TIME_DIFF = 1000; // 侵入確定の最大時間差 (1.0秒)
const int CONTINUOUS_CHECK_MS = 500; // 継続性のチェック時間 (0.5秒)
const long COOLDOWN_TIME_S = 120; // 侵入後のクールダウン時間 (120秒)
// 電源監視設定
const float CRITICAL_VOLTAGE = 3.5; // 低電圧アラートのしきい値 (V)
const float ADC_VOLTAGE_RATIO = 3.0; // 分圧抵抗の比率 (例: 100kΩ/200kΩの場合、R1+R2/R2 = 3)
// --- RTCメモリに保存する変数 ---
RTC_DATA_ATTR unsigned long last_alarm_time = 0; // 最終警報時刻 (秒単位)
RTC_DATA_ATTR bool low_battery_notified = false; // 低電圧通知済みフラグ
// --- 関数プロトタイプ宣言 ---
float readBatteryVoltage();
void sendNotification(const char* message);
void enterDeepSleep(uint64_t wakeup_pins);
void checkAndExecuteAlarm();
// --- バッテリー電圧測定関数 ---
float readBatteryVoltage() {
// ADC値の読み取りと平均化
int adc_value = analogRead(BATTERY_ADC_PIN);
// ADC値 (0-4095) を電圧 (V) に変換
// (3.3V / 4095) * ADC値 * 分圧比
float voltage = (3.3 / 4095.0) * adc_value * ADC_VOLTAGE_RATIO;
return voltage;
}
// --- LINE通知関数(Wi-Fi接続が必要) ---
void sendNotification(const char* message) {
// Wi-Fi接続処理...
if (WiFi.status() == WL_CONNECTED) {
// LINE Notify APIなどへHTTPリクエスト送信...
}
// Wi-Fi切断処理(省電力のため必須)...
}
// --- 侵入判定ロジックとアクション実行 ---
void checkAndExecuteAlarm() {
unsigned long now_s = millis() / 1000;
// 1. クールダウン期間中のチェック
if (now_s - last_alarm_time < COOLDOWN_TIME_S) {
return;
}
// ... (PIR1 -> PIR2の侵入判定ロジックは前述の通り) ...
// ... 侵入が確定した場合の処理: ...
{
last_alarm_time = now_s;
// ブザー鳴動...
sendNotification("【🚨 侵入確定】窓からの侵入を検知しました!");
return;
}
}
// --- セットアップ(ディープスリープ復帰時に毎回実行される) ---
void setup() {
// ピン設定...
// 1. 電源監視の実行
float battery_v = readBatteryVoltage();
if (battery_v < CRITICAL_VOLTAGE && !low_battery_notified) {
// 低電圧アラートを最優先で通知
sendNotification("【⚠️ 低電圧アラート】バッテリー残量が低下しています。交換してください。");
low_battery_notified = true; // 通知フラグをセット
} else if (battery_v >= CRITICAL_VOLTAGE) {
low_battery_notified = false; // 電圧が回復したらフラグをリセット
}
// 2. 侵入判定ロジックの実行
checkAndExecuteAlarm();
// 3. 処理完了後、再びディープスリープへ
uint64_t wakeup_pins = (1ULL << PIR1_PIN) | (1ULL << PIR2_PIN);
enterDeepSleep(wakeup_pins);
}
void loop() {
// ディープスリープ運用のため、この関数には処理を記述しない。
}
III. 🌡️ 窓際特有の誤検知・セキュリティ対策の徹底
1. 🐛 虫と熱源による誤反応対策
- ツインミラー PIR: 広範囲な熱変化(エアコン、日光)を相殺し、誤検知を抑制。
- 高所配置: 虫が這う 床や壁際から離れた高い位置(1.5 m 以上) にセンサーを設置し、虫の検知を回避。
- 物理的防御: センサーのレンズ開口部に目の細かいメッシュを張り付け、虫のレンズへの張り付きを物理的に防ぐ。
- ソフトウェアフィルタ: 2 センサーの 時間差 1.0 秒以内と0.5 秒継続 という厳しい条件により、虫の不規則な動きや瞬間的なノイズを排除。
2. 🔨 センサー破壊・無効化対策(最終防御)
このシステムでは、2 センサーロジックが破壊行為に対する主要な防御機構となります。
- 物理的強度: センサーは頑丈なケースに収納し、簡単に破壊されないようにする。
- 遮蔽行為への対応: 侵入者が窓際 PIR1 をテープなどで覆った場合、PIR1 は ON 信号を出せなくなります。
- その後の侵入で PIR2 のみが反応しても、「PIR1→PIR2 の順序」という絶対条件が満たされないため、システムは侵入を確定しません。
- ただし、システムは 2 センサーのロジックが成立しない異常 をログに記録し、侵入確定時ではないものの、ユーザーへ「PIR の動作異常の可能性」を通知する機能を追加検討することで、セキュリティをさらに高めることができます。
- 電源断通知: バッテリー監視機能により、侵入者が電源を物理的に切断する前に、システム断の警告をユーザーに発報します。
このセキュリティ強化版 IoT システムは、自作ならではの多層的な防御機構により、非常に高い信頼性と堅牢性を実現します。