🦟
【Python】スマホを触ったら部屋にモスキート音を流すようにしてスマホ中毒から抜け出しましょう!【RasberryPi4】
システムの概要
タイトルそのままですが、
スマホが使用中かどうかラズパイで監視して、スマホを使用していたらモスキート音を流す
というシステムを作っていきます。
実装目標
そこで、下記のような機能の実装を目標とします。
- スマホ裏にQRコードを張り付けておき、それをラズパイ側に登録する。
- ラズパイにつないだカメラを使って、スマホのQRが認識できるか定期的にチェックする。
- もしカメラでQRコードが認識できなければモスキート音を流す。
- 再びQRコードがカメラで認識できるようになったらモスキート音を止める。
用意するもの
- Raspberry Pi(今回は4Bを使いました)
- ラズパイに接続できるカメラ
- スピーカー
実装手順
1. 開発環境の準備
Remote SSHの設定を行う
まずは開発環境を整えます。
ラズパイにモニターやキーボードなどを繋いでそのまま開発することもできるのですが、
どうも重かったり書きにくかったりで微妙でした。
そこでラズパイにSSH経由で接続し、ラズパイ上のファイルをローカルのVS Codeから直接編集・実行するRemote - SSHを使うことにしました。

設定方法は省略しますが、VS Codeの拡張機能で簡単にできます。
仮想環境と必要ライブラリのインストール
Python環境を整理するため、仮想環境を作ります。
今回は apt と pip の両方のライブラリを使用します。
- apt: OS全体にインストールするハードウェア依存モジュール用
- pip: Python環境専用で仮想環境内にインストール
# 仮想環境の作成(aptライブラリも使える)
python3 -m venv --system-site-packages venv
# aptライブラリのインストール
sudo apt install python3-opencv python3-picamera2
# pipライブラリのインストール
pip install requests pyzbar pygame jpholiday python-dotenv bleak
2. カメラでQRコードを読み取る
カメラ映像を5秒ごとにチェックし、QRコードが正しいか確認します。
QRコードが見えない場合はモスキート音を再生し、見えるようになれば停止します。
"""
Constants
"""
QRCODE_TEXT = "nekochan_on_the_roomba"
MOS_SOUND_NAME = "sounds/mos39.mp3"
interval = random.randint(90, 900)
async def main():
"""
初期設定
"""
# カメラ
picam2 = Picamera2()
picam2.start()
# アラーム音
pygame.mixer.pre_init(frequency=44100, size=-16, channels=2, buffer=4096)
pygame.mixer.init()
mos = pygame.mixer.Sound(MOS_SOUND_NAME)
channel_mos = pygame.mixer.Channel(0)
alarm = pygame.mixer.Sound(ALARM_SOUND_NAME)
channel_alarm = pygame.mixer.Channel(1)
"""
監視処理
"""
interval = 5
# スマホ使用回数
smartphone_count = 0
# スマホ無しで過ごした時間(s)
detox_time = 0
while True:
frame = picam2.capture_array()
codes = decode(frame)
print('----------------------------')
print(today)
print('interval: ', interval)
print('detox_time: ', detox_time)
print('smartphone_count: ', smartphone_count)
print('----------------------------')
time.sleep(interval)
# 正しいQRコードがある
if codes:
text = codes[0].data.decode("utf-8")
if text == QRCODE_TEXT:
print("Correct QR!!!!")
channel_mos.stop()
detox_time += interval
interval = random.randint(90, 900)
# 正しくないQRコードがある or 何もない
else:
print("NO QR CODE!!")
smartphone_count += 1
interval = 5
if not channel_mos.get_busy():
channel_mos.play(mos)
cv2.destroyAllWindows()
asyncio.run(main())
モスキート音はこちらのものを使いました。
おわりに
今回は「カメラでQRコードを監視してモスキート音を流す」という、非常にシンプルなシステムを作成しました。
モスキート音だけでなく、SwitchBotやスマートプラグの操作も追加すると、より強力にスマホ依存を防止するシステムが作れそうです。
Discussion