1. はじめに
我が家は、外の門扉に郵便受けポストがあり、ポスト投函された物の確認は、玄関から外に出る必要がある。受け取りが待ち遠しい時は、何度も門扉まで行ったり来たりで無駄が多い。
もちろん、「配達完了メール通知サービス」などを利用すれば、メールが知らせてくれるのだが、そのサービスが使えないことも多々ある。
そこで、郵便ポストに仕掛けをして、ポスト投函されたらLineに通知するIotデバイスを作成した。
2. Line通知方法
外の門扉の郵便ポストだが、ギリギリ屋内のWiFiにつながる距離であるため、以前作成したこちらの記事『ドアホンが鳴ったらLINEに通知する』と同様の方法で実現する。ただし、今回はESP32-C3-WROOM-02(ESP32-C3)を使うことにした (ESP32-S3より省電力だろうと勝手に解釈)。

ESP32-C3を、↓こちらの実装ボードに載せて使う。

この実装ボードの良いところは、使う目的によって、使わない部分の基板を切り捨てることができるように設計されているところ。今回は、3V電源を直接入力するため、基板下側のUSBコネクタと3.3V電源レギュレータは不要なため、切り離し可能(面倒なので基板切断はせず、今回はパーツの実装を省略しただけ)
省電力化のため基板上の電源LEDは今回は実装しない。
3. ポスト投函を検知する

今回は↑こちらの振動センサーSW-18010Pを使用した。
(稚拙な絵で申し訳ないが、)下のイラストで示すように、ポストの扉の付け根あたりに振動センサーを取り付け、その信号をESP32のGPIOで受け取り、ポストされた
と検知したらLineに通知するという流れである。
ポストの扉(蓋)は結構な強さのバネで閉じた状態を維持しており、指でグイッと内側に押し込まないと扉が開かずポスト内に物が入れられない。よって、大きな振動が発生するはずだ。
4. 振動センサーSW-18010P の下調べ
Arduino UNOを使い、SW-18010Pの性能を調べる。
振動させる向や強さで、スイッチONやOFFになるタイミングとスイッチONの持続時間などを調べる。
検証に使用したコード(クリックで開く)
const int SW_pin = 7; //D7
void setup() {
Serial.begin(115200);
pinMode(SW_pin, INPUT_PULLUP);
Serial.println("Waiting for 10s...");
delay(10 * 1000); //wait 10s
Serial.println("Ready!");
}
void loop() {
static bool first = true;
static int on_count = 0;
static int sw_status = -1;
static unsigned long last_time = 0;
int isOn = (digitalRead(SW_pin) == LOW);
if (sw_status == isOn) return;
on_count += 1;
sw_status = isOn;
auto now = millis();
auto duration = first ? 0 : now - last_time;
last_time = now;
first = false;
char buff[128];
sprintf(buff, "[%d] SW status change to %s (%lu)", on_count, (isOn ? " On" : "Off"), duration);
Serial.println(buff);
}
このセンサーは、平常時OFF、振動を加えるとON-OFFを繰り返す動作となった。どの方向でも平常時はOFFなので、スイッチとして扱いやすい。
振動を検知する方向としては、下の図で示すところのX軸方向やY軸方向の振動に対し敏感で、Z軸方向の振動に対しては、鈍い傾向であった。
5. バッテリー駆動させる
屋外のポストに設置するため、バッテリー駆動させる前提である。
データシートによるとESP32-C3-WROOM-02の稼働電圧は、3.0V〜3.6Vとなってる。実際に3.0Vで問題なく稼働しWebReplにも反応する。
データシートによると、DeepSleep
中の待機電流は5μAとのこと。
後ほど完成した装置で実際の消費電流を計測するとする。
6. 配線図

-
GPIO0 - スライドSW - GND (デバッグ用:DeepSleep抑止)
-
GPIO1 - LED - GND
-
EN - 振動センサ - GND
-
3V3 - 単1乾電池x2本直列 - GND
-
TX, RX, GND : USBシリアル (デバッグ用:回路図上は省略)
当初、DeepSleepからの復帰にはGPIO4を使い、GPIO4をLOWにしたら、復帰するように考えていたが、下記のコードでは復帰しなかった。ネットで色々調べたが、事例はあるが回避策が分からず諦めた。
import machine
import esp32
wake = machine.Pin(4, machine.Pin.IN)
esp32.wake_on_ext1((wake,), esp32.WAKEUP_ALL_LOW)
machine.deepsleep()
代わりにENをLOWに落として、再起動するようにした。ソフトウェア的には違いが無い。
おそらくC言語(ArduinoやESP-IDF)でプログラムすれば動作するのではないかと思うが、試していない。MicroPythonの実装上の不備と想定する。
7. Pythonコード
今回もMicroPythonを使う。
boot.py
でWiFiに接続している前提で、main.py
が呼ばれたら、それはポスト投函
によるDeepSleepからの復帰であるため、Lineに通知して再びDeepSleepするだけだ。
from machine import Pin, RTC, Timer, reset, PWM, deepsleep
import time
import ntptime
import urequests as requests
import ujson as json
rtc = RTC()
ntptime.host='ntp.nict.jp'
ntptime.settime()
WEEKDAY = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
UTC_OFFSET = 9 * 60 * 60 # JST +09:00
# GPIO0 : SW
sw = Pin(0, Pin.IN, Pin.PULL_UP)
#sw.value() # 0: on, 1: off
#GPIO1 : LED
led_pin = Pin(1, Pin.OUT)
#led_pin.value(1)
led = PWM(led_pin, freq=1000, duty_u16=32768)
led.duty(50)
# notify to Line
def send_message(message):
t = time.localtime(time.time() + UTC_OFFSET)
timestamp = ('{0}.{1}.{2}[{6}]{3}:{4:02}:{5:02}').format(t[0], t[1], t[2], t[3], t[4], t[5], WEEKDAY[t[6]])
headers = {
'Content-Type' : 'application/x-www-form-urlencoded',
'Authorization': 'Bearer XXXXXXXXXXXXXXXXXX',
}
data = 'message={}%0D%0Aat%20{}'.format(message, timestamp)
response = requests.post('https://notify-api.line.me/api/notify', headers=headers, data=data).json()
if response['status'] != 200: print(response)
send_message('Notify for Posted.')
if not sw.value(): deepsleep()
起動状態を示すLEDだが、GPIO1に接続したLEDが眩しかったので、PWM制御に変更して暗めにした(少しでも電池の消費を抑えるため)。DeepSleepに移行するとすべてが停止してLEDも消えるため、LEDの点灯時間はほんの数秒だ。
8. 机上検証
通常時(WiFi接続時)とDeepSleep時の電流値を測定して、乾電池での稼働日数を計算したいのだが、手持ちの安いデジタルテスタだと、内部抵抗が大き過ぎるのか、乾電池では起動しなくなる。・・・別途考えるとする。
まずは、しばらく今のままで運用してみてます。
以上
9. 乾電池寿命? (2023.9.2追記)
運用開始して数日は、新聞等の投函で毎日通知が来ていましたが、ある日から通知が来なくなりました。外して原因を調べたところ、乾電池の電圧が2.8Vまで下がっていました。
ESP32-C3-WROOM-02のデータシートによると、Power supply voltage
は3.0V〜3.6Vとなっているので、2.8Vでは起動しませんね。
そこで、3.3V昇圧回路を入れて、運用することにします。秋月電子製の3.3V出力昇圧DCDCコンバーター昇圧回路を使いました。
これを使っても、単三電池x2本直列では、安定した起動ができませんでした。3.3Vは出ますが、おそらく電流不足だと思います。そこで、単一電池x2本直列で運用します。
また、しばらくこれで運用してみてます。
以上