Raspberry Pi でアラーム時計を作る(備忘録)

作業場にアラームがないため、休憩時間・お昼休み・就業時間が分からず、ぶっ続けで作業してしまったりするので、アラーム時計を設置。

準備

KSYで買うとわずかに安い感じなので、Raspberry Pi 3 Model Bを購入。

設定時刻にランダムなmp3をかけて、時間報告させたい。

あと、アラームだけだと寂しいので、適当なSW繋げて遊ぶことにする。
f:id:Weintraub:20181031202035j:plain:w360
基板のプルアップ抵抗は不要やったんや・・・。

設定

検索すると山のように出てきます。改めて作業を書いてもアレですので、参考にさせて頂いたURLと概要だけ備忘録として記載。

音声合成の設定

音声データはメイにして、Windows機でダウンロードしRaspberry Piにコピー。スクリプトは記載をそのままコピペ。
Raspberry piで日本語音声合成(Open JTalk)を試してみる。

mp3はmpg321をインストール。
オーディオ出力はイヤフォンジャックからの出力そのままなので特に設定する事無く、音声・mp3再生しました。

秒単位のcron設定

mp3再生後、10秒後に音声出したい
cronを秒単位で指定する方法

cron tabに10:30、12:00、15:00、16:50(謎の残業届提出)、18:00を設定。
最初にmp3再生→10秒後に音声で時刻と内容を発声。
こんな感じ。
#============10:30===============
30 10 * * 1-5 ../pi/Music/PlayRandomMP3.sh
30 10 * * 1-5 sleep 10; ../pi/jsay_mei.sh 十時三十分になりました。休憩をとってください。
#============12:00===============
0 12 * * 1-5 ../pi/Music/PlayRandomMP3.sh
0 12 * * 1-5 sleep 10; ../pi/jsay_mei.sh 十二時になりました。一時間のお昼休憩をとってください。
#============15:00===============
0 15 * * 1-5 ../pi/Music/PlayRandomMP3.sh
0 15 * * 1-5 sleep 10; ../pi/jsay_mei.sh 三時になりました。休憩をとってください。
#============16:50===============
55 16 * * 1-5 ../pi/jsay_mei.sh 残業をする人は、残業届けを出してください。
#============18:00 Mon,Wed-Thu=============
0 18 * * 1,3,4 ../pi/Music/PlayRandomMP3.sh
0 18 * * 1,3,4 sleep 10; ../pi/jsay_mei.sh 十八時になりました。本日の営業は終了しました。

cronのログ表示

最初PATHが違っててmp3再生されず・・・。そもそも定時に動作したのか知るためにログをモニタする。
RaspberryPi cronが効かない → ログ表示設定して解決

mp3ランダム再生

当初は同じ曲を再生していたけど、なんとなくさみしいのでランダム再生
フォルダ内のランダムな曲を再生する

ただ、コピペしたけどなぜか再生されないので、mp3だけ探してシャッフルに変更。なぜか成功。
こんな感じ。
find . -name '*.mp3' | shuf -n 1 |xargs -d "\n" mpg321

ひとまず定時報知時計は完成。金曜日18:00だけ昔の金曜ロードショーOPのfriday night fantasyをかけるようにしたけど長いと不評。

外付けスイッチ

まずは電源OFF/起動ボタンの設定。コピペして、SWをBCM3に変更。テストで長押ししたら問答無用でシャットダウンでびっくり。同じボタンで起動。
ラズパイでシャットダウンボタンを付ける(ついでに起動ボタン)

ずっとSWをポーリングするの何か気になるので割り込みでSW読んでみる。
Raspberry PiでGPIOポートの入力変化割り込みを実装してみる(Pythonで)

てっきり、割り込み設定して、コールバック関数の定義して、DAEMONさんにお願いしたらSW割り込みでコールバック関数呼ばれるのかなって思ったらプログラムが抜けちゃう(?)からかDAEMONさんが「これはあきまへん」ってお怒り。

GPIO.add_event_detect設定して、イベントをぐるぐるループ。電源OFFボタンはイベント発生後2秒スリープしてONで、sudo shutdown -h nowをsubprocess.callで実行。

残りのSWは
BCM6:現在時刻→時間はdate+%H、分はdate+%Mで取得
BCM7:今年がスタートしてからの日数→年はdate+%Y、経過日数はdate+%jで取得
BCM8:今年の残り日数→365からdate+%jを引く。閏年は・・・まあ気にする人あまりいないから無視で。
に設定。
Pythonにdatetimeってコマンドあるの・・・知らなかったです)

check_output()でutf-8が返るって書いてあるページあったけど、なぜか自分の環境だと設定が悪いのかバイナリ?しか返ってこなかったので、decode('utf-8') して、strip()で改行削除して、subprocess.call()に入れるコマンドまるごと結合。

こんな感じ。
say = "/home/pi/jsay_mei.sh "+"現在の時刻は"+str(p_hour)+"時"+str(p_min)+"分です"
subprocess.call(say,shell=True)

あってるのかさっぱり分からないけど動いたので良しとしました。

そして、SW分作成して保存。

DAEMONさんに登録

ラズパイでシャットダウンボタンを付ける(ついでに起動ボタン)
の中にある
サービスファイルを作成を参照。

プログラムが間違っていると、DAEMONさんが「これはあきまへん」って言うので、プログラムを修正してDAEMONさんのステータス見るとまだ「あきまへん」って言ってさっぱり分からなかったけど、DAEMONさんを無効にしたり有効にしたりリロードしたら「まあええで」って言ってくれたので、一度サービス入れると指定のプログラムを都度読みに行かない仕組みなのかなと思ったり。(よく分かりません)

LinuxとかPythonが分からず、ほぼコピペなのに超時間かかっている。慣れてるひとなら30分もかからないと思いました。