ラズパイを使って指定日付まであと何日あるかを計算してスピーカーからしゃべらせるということをやってみます。
例として「2020年7月24日の東京オリンピックまであと何日」かをラズパイにしゃべらせてみます。
ちなみにしゃべるという部分はAquesTalk Piを使わせてもらいました。
以下の記事を参考にインストールしておいてください。
以下で紹介するプログラムにAquesTalk Piへのパス設定などがありますので、AquesTalk Piをインストールしたフォルダ名に変更して利用してください。
datetimeを使って現在日付を取得
今回は日付を扱うのでdatetimeモジュールをインポートしておきます。
from datetime import datetime
今日の日付はdatetime.now()で取得できます。
取得されるデータはこんな感じです。
2019-07-24 19:42:26.821717
最後こまかい数値が並んでいます。上記数値だと821717の部分。これはマイクロ秒だそうです。
詳しく知りたい方。眠くなりたい方は公式リファレンスをご覧ください。(笑)
[sanko target=”_blank” href=”https://docs.python.org/ja/3/library/datetime.html” title=”datetime — 基本的な日付型および時間型” site=”Python 3.7.4 ドキュメント”]
未来の日付から今日の日付を引き算する
ここから大事な点ですが、datetimeオブジェクトは、日付同士の引き算や足し算が出来るのです。
2020年の東京オリンピックの開催日付は2020年7月24日ですので、これをdatetimeオブジェクトにするにはこうします。
datetime(2020, 7, 24)
こうすることで、日付同士の計算が簡単にできます。未来の日付から先ほどの現在日付を引くには、
delta = datetime(2020, 7, 24) – datetime.now()
のようになります。
日付同士の差分を日数に直す
上記変数deltaには、あくまでdatetimeオブジェクトの値が入っているので、これを日付に直すと差分の日数となります。
datetimeオブジェクトのdays属性を参照すると日付に直した値にできます。
delta.days
指定日付から現在日時までの差分をとって日付に直す流れをサンプルプログラムでは以下のようにしています。
# カウントダウン日時(未来の日付) end_day = datetime(2020, 7, 24) # カウントダウン日数を計算 today = datetime.now() # 今日の日付 delta = end_day - today # 日付同士の差分をとる days = delta.days + 1 # 日数になおす
上記で最後に日数に₊1しているのは、例えば今日が7月6日で指定日付が7月7日だったとすると人情的にカウントダウン日数としては、あと1日としたいところですが、コンピュータは厳密なのであと何時間何分何秒みたいな感じで計算してしまうので1日に満たないものとして扱われてしまうのです。残り日数としては0となってしまう。だから自然な感じでカウントダウン日数となるように+1しています。(わかったかな?わからなかったらこの説明が悪いのであなたは悪くありません)
指定日付までのカウントダウンをしゃべらせる(プログラム全体)
13行目
ご自身のAquesTalk Piをインストールしたディレクトリに変更してください。
16行目
未来の日付を指定します
19行目
カウントダウンのタイトルです
前日まではカウントダウンとし、当日は「今日は○○です」のようにし、指定日付が過ぎた場合は、「何日経過しました」としています。
短いプログラムなので適当に変えてみてください。
ちなみにわたしは子供が受験生なので、「入学試験まであと〇日」などとしゃべらせています。お子さんによってはプレッシャーがかかるので辞めてください(笑)
# coding: utf-8 """ 指定した日付までのカウントダウンを行う """ import sys, os from datetime import datetime # AquesTalk Piへのパス(AquesTalk Piをインストールしたディレクトリ) aques_pass = "/home/pi/aquestalkpi/" # カウントダウン日時(未来の日付) end_day = datetime(2020, 7, 24) # カウントダウン文字列 title = "東京オリンピック開催" # カウントダウン日数を計算 today = datetime.now() # 今日の日付 delta = end_day - today # 日付同士の差分をとる days = delta.days + 1 # 日数になおす # メッセージ文字列を決定 if days == 0: talk_string = "今日は" + title + "です" elif days >= 1: talk_string = title + "まで、あと" + str(days) + "日です。"; else: days = -days talk_string = title + "から" + str(days) + "日経過しました" # 1日を「ついたち」としゃべってしまうため変換 talk_string = talk_string.replace("あと1日", "あといち日") print(talk_string) # メッセージをしゃべる cmd = aques_pass + "AquesTalkPi " + talk_string + " | aplay" os.popen(cmd).readline().strip()
コメント