Raspberry Pi Zeroで目覚ましライト作るよ!その②
↑の続きでーす。
いよいよ目的の時間にピカピカさせる部分を作りますよー。
あ、有料指定ですけど例によってほぼ無料で読めますのでどーぞー☆
しくみ
いくつか仕組みは考えられますが、今回は簡単に、目標となる時間(アラームが鳴る=この場合光る)時間を4桁の数字でファイルに保存しておき、その時間になったら目覚まし表示ルーチンを実行する、というプログラムにしようと思います。
図にすると
こんなかんじですね。
こういう時間をチェックする仕組みとして
A: ずっとその時間になるまでループして待機。(時間が来たら実行)
B: 時間になるまで待機するプログラム(はぐるぐるループしてる)から、目覚まし表示部分のプログラムを呼び出して実行
C: 1分に一度プログラムを呼び出す仕掛けを用意して、呼び出されたプログラムが「今がその時間か?」をチェック、もしそうなら目覚まし表示部を実行
など、いろんなパターンがあり得ます(どれが正解ということはないです)
今回は C のパターンで作ってみることにしましょう。
実は、このCパターンの「1分に一度プログラムを呼び出す」という部分はすでにLinuxの基本機能として実装されているので、その機能をつかっちゃうことができるからなのです。
その機能とは、以前もちょろっと使いました cron というやつですね。
cron設定
cronってば何者かについてはググっていただくとして、簡単に設定について。
cronの設定は
$ crontab -e
で編集できます。
初めて実行すると、どのエディタつかいたい? って聞いてきます。
おこのみでー(1のnanoちゃんが簡単なのでデフォルトは1ですが、私は2が好み)
エディタが立ち上がったら、
* * * * * /usr/bin/flock -n /tmp/alarm.lock python /home/pi/alarm_chk.py
という行を追加します。
こんなかんじで。
/home/pi/alarm_chk.py
に、アラーム時間かどうかをチェック(して、光プログラムを実行する)pythonのスクリプト(プログラム)を置くつもりです。
そして、今回のキモは
/usr/bin/flock -n /tmp/alarm.lock
です。これは何かと言えば、/tmp/alarm.lock という「ロックファイル」を作って後ろのプログラムを実行、実行が終わったらロックファイルを消す。という仕組み。もしこのファイルが存在していたら、プログラムは実行されません。つまり、多重起動を禁止しているわけです。
テスト(時計表示)
では、このcronで呼び出されるプログラムを作ってみましょう。crontabの内容を書き換えるのも面倒なのでw テストも alarm_chk.py というファイル名で作って、その内容をどんどん書き換えていく方向でやってみます。
サンプルの hello-world.py はこのような内容。
pi@alarmpi:~/Pimoroni/scrollphathd/examples $ cat hello-world.py
#!/usr/bin/env python
import signal
import time
import scrollphathd
print("""
Scroll pHAT HD: Hello World
Scrolls "Hello World" across the screen
using the default 5x7 pixel large font.
Press Ctrl+C to exit!
""")
# Uncomment the below if your display is upside down
# (e.g. if you're using it in a Pimoroni Scroll Bot)
#scrollphathd.rotate(degrees=180)
# Write the "Hello World!" string in the buffer and
# set a more eye-friendly default brightness
scrollphathd.write_string(" Hello World!", brightness=0.5)
# Auto scroll using a while + time mechanism (no thread)
while True:
# Show the buffer
scrollphathd.show()
# Scroll the buffer content
scrollphathd.scroll()
# Wait for 0.1s
time.sleep(0.1)
こちらをちょっと(だいぶ?)改造してみましょう。
サンプル超改造①
#!/usr/bin/env python
import signal
import time
import scrollphathd
import datetime
now = datetime.datetime.now()
nowTimeString=str(now.hour).zfill(2)+str(now.minute).zfill(2)
scrollphathd.write_string( nowTimeString , brightness=0.1)
i=0
while True:
i=i+1
scrollphathd.show()
scrollphathd.scroll()
time.sleep(0.1)
if i>80: break
scrollphathd.clear()
これを alarm_chk.py という名前で保存して実行すると
こんな表示が←にスクロールする時計が、一分に一回自動ででてくるようになりました(∩´∀`)∩☆
なんだかこれだけでも十分時計になる気がしますが、目標はあくまで目覚ましなので、もうちょっと進めましょうw
ファイルからアラームタイムを読み込む
続いて、目覚ましが起動する時間を
/home/pi/alm_time.txt
に書き込みます。
$ echo 0700 > alm_time.txt
とでもしましょうか。この呪文を唱えると、alm_time.txt ファイルの内容は
0700
という文字列だけのファイルになります。
ほらね☆
この時間と、現在の時間を比べるプログラムを作ります。
timetest.py
# -*- coding: utf-8 -*-
import datetime
alm_time_file = "/home/pi/alm_time.txt"
now = datetime.datetime.now()
# アラームのターゲット時間を読む
with open(alm_time_file) as f:
s = f.read()
print("Target Time > "+ s.rstrip())
# 時間を0000形式の文字列にする
nowTimeString=str(now.hour).zfill(2)+str(now.minute).zfill(2)
print(" Now Time > " + nowTimeString)
if( s.rstrip() == nowTimeString):
print("It's NOW!!")
else:
print("Wrong!!")
こんなかんじでいいかな~
実行してみます。
Target Timeに目標時間(ファイルの内容)が出て、NowTimeが現在時間。食い違っていればWrongと怒られます。
ターゲットの時間を今の時間に書き換えて、再度実行したら、「It’s NOW!!」とでます。
無事、動作しているようです。
合体!!
ここまでできたら、いままで出来たところを合体ですわ♡
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import datetime
import signal
import time
import scrollphathd
alm_time_file = "/home/pi/alm_time.txt"
now = datetime.datetime.now()
with open(alm_time_file) as f:
s = f.read()
print("Target Time > "+ s.rstrip())
nowTimeString=str(now.hour).zfill(2)+str(now.minute).zfill(2)
scrollphathd.write_string( nowTimeString +" ", brightness=0.1)
if( s.rstrip() == nowTimeString):
print("It's NOW!!")
scrollphathd.write_string("Good Morning!! "+nowTimeString+" ", brightness=0.5)
i=0
while True:
i=i+1
scrollphathd.show()
scrollphathd.scroll()
time.sleep(0.1)
if i>108: break
scrollphathd.clear()
else:
print("Wrong!!")
i=0
while True:
i=i+1
scrollphathd.show()
scrollphathd.scroll()
time.sleep(0.1)
if i>80: break
scrollphathd.clear()
一分に一回実行される想定です。
もしターゲット時間と違っていたら
こんなかんじで時刻だけが(暗めに)表示され、
ターゲット時間と整合していたら、明るめの表示で
このようにGoodMorning!!と表示さるはずです。(結構まぶしいw スクロールしてしまってGが端っこしかみえてないですw)
うむうむ。さっくりできちゃいましたねー☆(∩´∀`)∩☆
さらにGoodMorning!!の表示を明るめに調整したらお目覚めにいいかな?
やってみたらけっこう簡単ですね!
後はこれに、プラズマ表示とかいろいろさらに合体させてもっと完成度をあげていきましょう☆
というわけで今回はここまで!
この先の有料オマケで完成版の解説付きソースや技術的補足を載せておきます☆
ここから先は
¥ 100
Amazonギフトカード5,000円分が当たる
よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費にさせていただきます!感謝!,,Ծ‸Ծ,,