2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【電子工作】ポストに投函されると通知が送られてくる仕組みを作ってみた【ESP32】

2
Last updated at Posted at 2026-04-21

はじめに

皆さんは、自宅のポストをどのくらいの頻度でチェックしていますか?
私の場合は確認する習慣があまりなく、Amazon等で注文した際に覗く程度でした。
そのため、不意の届け物や不在連絡票に気づくのが遅れてしまうことが何度かありました。

そこで、最近勉強中の電子工作を活用し 「ポストに郵便物が投函された瞬間にスマートフォンへ通知を送る装置」 を作成しました。
比較的安価なパーツで構成でき、かつバッテリー持ちも考慮した設計にできたので、その過程をまとめます。
同じ悩みを持つ方の参考になれば幸いです。

用意したもの

  • ESP32:マイコン。Wifiモジュールを内蔵しているため今回はこちらを採用。
  • マグネットスイッチ:ドア防犯用などのリードスイッチ。磁石が離れると回路が開閉するもの。
  • 電池ボックス:1.2V〜1.5V × 3本で約4.5Vを確保。
  • ユニバーサル基盤:各パーツを固定・配線するために使用。
  • ジャンパーワイヤー:配線用のワイヤー
  • 防水ケース(タッパー):湿気や埃から守るケース。100均で購入。

各部品を複数個入りで購入してしまったのですが、今回の装置1つ作るのにだいたい1800円 くらいかかりました。
タッパー以外はすべてAmazonで購入したのですが、おそらく割高なので賢く揃えればもっとコストは抑えられると思います。

処理の流れ

139328.png

Discord Webhookの準備

通知先には、設定が簡単なDiscord を採用しました。

サーバー設定 ➔ 連携サービス ➔ ウェブフックから「ウェブフックURL」を取得しておきます。
image.png

image.png

プログラムの実装

電源が入ったタイミングで自宅のWifi経由でDiscordに通知メッセージを飛ばすようなプログラムを作成します。
通知を飛ばした後はDeep Sleep という機能を使って待機状態にします。
マグネットスイッチの磁石が離れた(ポストの蓋が開いた)瞬間に睡眠中のESP32を叩き起こし、通知を送ってまた寝かせるという構造にしました。

#include <driver/rtc_io.h>
#include <WiFi.h>
#include <HTTPClient.h>

// --- 設定項目 ---
const char* ssid     = "自宅WifiのSSIDを指定";
const char* password = "自宅Wifiのパスワードを指定";
const char* discord_webhook_url = "準備したwebhookURLを指定";

// センサーを接続するピン
#define SENSOR_PIN GPIO_NUM_4 

void setup() {
  delay(1000); // 起動安定待ち

  // 1. Wi-Fiに接続
  WiFi.begin(ssid, password);
  int retry_count = 0;
  while (WiFi.status() != WL_CONNECTED && retry_count < 30) {
    delay(500);
    retry_count++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    // 2. wifi接続に成功した場合、Discordに通知を送信
    sendDiscordNotification("📬 ポストに郵便物が届きました!");
  }

  // 3. 次回、磁石が「離れた(HIGHになった)」時に起きるように設定
  esp_sleep_enable_ext0_wakeup(SENSOR_PIN, 1); 

  // GPIO 4のプルアップをスリープ中も維持する設定
  rtc_gpio_pullup_en(GPIO_NUM_4); 
  rtc_gpio_pulldown_dis(GPIO_NUM_4); // プルダウンは念のためオフ
  
  // 連続して通知を送信してしまうのを防ぐため、少し待機
  delay(2000); 

  // 4. Deep Sleep開始
  esp_deep_sleep_start();
}

void loop() {
  // 処理なし
}

// Discordへの通知送信メソッド
void sendDiscordNotification(String message) {
  HTTPClient http;
  http.begin(discord_webhook_url);
  http.addHeader("Content-Type", "application/json");
  String jsonPayload = "{\"content\": \"" + message + "\"}";
  int httpResponseCode = http.POST(jsonPayload);
  http.end();
}

配線

配線は非常にシンプル構成です。

  • 電池ボックス(+) ⇒ ESP32の 5Vピン
  • 電池ボックス(ー) ⇒ ESP32の GNDピン
  • マグネットスイッチ ⇒ 片方を 4ピン 、もう片方をGNDピン に接続

無題のスプレッドシート (4).png

上記のような形で、ユニバーサル基盤を経由して各部品をESP32に接続しました。

稼働確認

電池ボックスのスイッチをオンにした状態で、マグネットスイッチの磁石を離してみます。
すると、想定通りDiscord上に通知が送られてきました。
スマホ上でDiscordアプリの通知設定をオンにしてくことで、すぐに気が付けるようになりました!
image.png

おわりに

今回の製作を通して、単に「コードを書いて動かす」だけでなく、実用化のための省電力設計や設置場所の工夫など、IoTデバイス特有の難しさと面白さを学ぶことができました。
実際に通知が飛んでくると、かなりの達成感があり感動しました。
これで我が家もより住みよくなったことでしょう。
ぜひ皆さんも身近な悩みを電子工作で解決してみてください!

【おまけ】制作時につまずいたポイント

①モバイルバッテリーのオートパワーオフ問題

当初は手軽にモバイルバッテリーで動かそうとしましたが、ESP32がDeep Sleepに入ると消費電流が少なすぎて、バッテリー側が「充電完了」と判断して給電を停止してしまいました。
対策として、自動停止機能のない乾電池3本による直接駆動に変更しました。

② スリープと共にピン状態がリセットされる問題

通常の pinMode(pin, INPUT_PULLUP) はスリープに入ると無効化されてしまいます。そのため、磁石が離れても電圧が上がらず、ESP32が起きられない問題が発生しました。
対策として、rtc_gpio_pullup_en() を使用して、RTC領域(眠っている間も生きている回路)のプルアップを明示的に有効にすることで解決しました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?