🛡️ 【セキュリティ強化版】超低消費電力・高信頼性な窓防犯 IoT システム構築ガイド:電源断・破壊・誤検知を徹底排除!

【DIY】ホームセーフティ実践

「無線型 IoT で完璧な防犯をしたい!」「でも、バッテリーが切れたら? センサーを壊されたら?」

この記事では、窓からの侵入検知に特化し、従来の誤検知対策に加え、システムの弱点である電源断や破壊行為にも対応した超高信頼性の自作 IoT システムの設計を解説します。ESP32 $\text{ディープスリープを活用した電源監視と、物理的防御を組み込んだ完全版スケッチを公開します。


🎯 IoT 防犯システムの 5 つの設計目標(セキュリティ強化)

  1. 超低消費電力設計: IQ​ を μA 級に抑え、電池寿命を最大化する。
  2. 高信頼性センサー: ツインミラー PIR で熱源・虫の誤検知を防ぐ。
  3. 電源監視: バッテリー残量を監視し、システム断前に低電圧アラートを発報する。
  4. 破壊対策: 物理的防御検知ロジックにより、センサー破壊・無効化に対応する。
  5. 賢いソフトウェアロジック: 2 センサーの時間差 1.0 秒以内を判定し、確実な通過のみを「侵入」と確定する。

I. 🛠️ 必要な部品リストと電源監視戦略

1. 主要部品リスト(低電圧監視機能を追加)

カテゴリ部品名数量選定のポイント
制御/通信ESP32 DevKit1ADC(アナログ・デジタル変換)ピンを使用し、電圧監視を可能とする。
センシングツインミラー (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 システムは、自作ならではの多層的な防御機構により、非常に高い信頼性と堅牢性を実現します。

タイトルとURLをコピーしました