🦟

【Python】スマホを触ったら部屋にモスキート音を流すようにしてスマホ中毒から抜け出しましょう!【RasberryPi4】

に公開

システムの概要

タイトルそのままですが、

スマホが使用中かどうかラズパイで監視して、スマホを使用していたらモスキート音を流す

というシステムを作っていきます。

実装目標

そこで、下記のような機能の実装を目標とします。

  1. スマホ裏にQRコードを張り付けておき、それをラズパイ側に登録する。
  2. ラズパイにつないだカメラを使って、スマホのQRが認識できるか定期的にチェックする。
  3. もしカメラでQRコードが認識できなければモスキート音を流す。
  4. 再びQRコードがカメラで認識できるようになったらモスキート音を止める。

用意するもの

  • Raspberry Pi(今回は4Bを使いました)
  • ラズパイに接続できるカメラ
  • スピーカー

実装手順

1. 開発環境の準備

Remote SSHの設定を行う

まずは開発環境を整えます。
ラズパイにモニターやキーボードなどを繋いでそのまま開発することもできるのですが、
どうも重かったり書きにくかったりで微妙でした。

そこでラズパイにSSH経由で接続し、ラズパイ上のファイルをローカルのVS Codeから直接編集・実行するRemote - SSHを使うことにしました。

設定方法は省略しますが、VS Codeの拡張機能で簡単にできます。

仮想環境と必要ライブラリのインストール

Python環境を整理するため、仮想環境を作ります。
今回は aptpip の両方のライブラリを使用します。

  • 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())


モスキート音はこちらのものを使いました。
https://smar-tone.com/sound/574.html

おわりに

今回は「カメラでQRコードを監視してモスキート音を流す」という、非常にシンプルなシステムを作成しました。
モスキート音だけでなく、SwitchBotやスマートプラグの操作も追加すると、より強力にスマホ依存を防止するシステムが作れそうです。

Discussion