
micro:bitとScratchを使って目覚まし時計を作ってみます。
現在の時間とアラームを鳴らす時間を入力して、音楽を鳴らすようにしてみます。
動画版もご利用ください
使い方
1.起動すると「NOW」と表示されます。現在の時間を入力するモードになっている場合に表示されます。
2.現在の時間を入力します。
Aボタンを押すと時間を入力できます。
Bボタンを押しと分を入力できます。
例えば、今が13時20分の場合は次のように入力します。
Aボタンを14回押します(0から始まるので14回です。)
Bボタンを21回押します。(0から始まるので21回です。)
ちなみに、ボタンを1回押すごとに0H→1H→2H→3H・・・、0M→1M→2M→3M・・・と押した回数と時間、分がわかるように表示されます。
3.現在の時間入力が終わったらA+Bボタンを押します。
「ALARM」と表示されて、アラーム時間を入力するモードに変わります。
4.アラームを鳴らしたい時間を入力します。
入力方法は「2.現在の時間を入力します」と同じ方法です。
5.アラーム時間の入力が終わったらmicro:bitのロゴマークをタッチします。

6.アラームまでのカウントダウンが始まります。
「START」と表示され、次にアラームが鳴るまでの残り時間がミリ秒で表示されます。
プログラムの解説
プログラムの中身を処理順に解説していきましょう。
初期化処理

まずは、このプログラムで使う変数を初期化します。
初期化というのは、プログラムの中で利用する変数をリセットする処理のことです。
新しいプログラミング言語では必要ないことが多いのですが、念のため初期化をする習慣にしておく方が良いでしょう。
変数「時間」:現在の時間を登録する変数を初期化します。
Aボタンを押すと1ずつ増える変数です。
1回目は0にしたいので、初期化で-1に設定しておきます。
変数「分」:現在の分を登録する変数を初期化します。
「時間」と同じ理由で-1にしておきます。
変数「アラート時間」:アラートが鳴る時間を登録する変数を初期化します。
「時間」と同じ理由で-1にしておきます。
変数「アラート分」:アラートが鳴る分を登録する変数を初期化します。
「時間」と同じ理由で-1にしておきます。
変数「入力モード」:現在時間を入力するモードか、アラーム時間を入力するモードか管理する変数です。
変数「今の時間ミリ秒」:現在の時間をミリ秒に変換して登録する変数を初期化します。
変数「ALARMの時間ミリ秒」:アラームが鳴る時間をミリ秒に変換して登録する変数を初期化します。
変数「ALARMまでのミリ秒」:現在時間からアラームが鳴るまでの時間をミリ秒で登録する変数を初期化します。
変数「今の時間(時間)」:現在の時間の時間の部分をミリ秒に変換した値を入れる変数です。
変数「今の時間(分)」:現在の時間の分の部分をミリ秒に変換した値を入れる変数です。
変数「ALARMの時間(時間)」:アラームのなる時間の時間の部分をミリ秒に変換した値を入れる変数です。
変数「ALARMの時間(分)」:アラームのなる時間の分の部分をミリ秒に変換した値を入れる変数です。
「NOW」を表示します。
「最初だけ」ブロックの中ならどこで実行してもOKです。
モード切替

現在の時間を入力するモードから、アラーム時間を入力するモードに切り替えるための処理です。
A,Bボタンを同時に押した場合にモードの切り替えを行います。
モードは変数「入力モード」の値が0または1かで判断します。
0の場合は現在の時間入力モード。
1の場合はアラームの時間入力モードとしています。
入力モードを切り替えたことがわかるように、「ALARM」と表示するようにします。
Aボタンを押したときの処理

Aボタンを押したときに時間を増やす処理をしています。

大きく、2つの塊があります。
「もし 入力モード = 0 なら」と「でなければ」の塊です。
入力モード=0の場合は現在の時間の時間部分を入力します。
現在時間の入力

「もし 時間 = 23 なら」のブロックはすでに23時までに入力をされていたら0時に戻す処理をしています。
一瞬ですが、時間を-1にしています。
次の処理で、すぐに1増やすので0になります。

Aボタンが押された場合に1増やしています。
続けて「時間」と「H」を表示して、入力された時間がわかるようにしています。
アラーム時間の入力
モードの値によって、アラーム時間の入力か、現在時間の入力かを切り分けています。
処理の中身は現在時間の入力と同じです。

Bボタンを押したときの処理

Bボタンを押したときは分を増やす処理をしています。
大きく2つのブロックがあり、現在時間の分を入力するモードとアラーム時間の分を入力するモードです。
処理の仕様はAボタンを押したときと同じです。
分なので59まで入力されていた場合に0分に戻す処理をしています。
(Aボタンと同じように-1にしています)
アラームまでのカウントダウンを始める

入力された現在時間とアラーム時間からアラームまでの時間を計算してカウントダウンを始めます。
最後に音楽を鳴らします。

カウントダウンの開始はロゴマーク
がタッチされたときにしました。

まずは、カウントダウンが始まったことを知らせるために「START」と表示します。
現在時間をミリ秒計算する

現在の時間をミリ秒に計算しなおしています。
micoro:bitには時計機能がないため、アラームを鳴らすまでの時間を自分で計算しなければなりません。
0時0分を0ミリ秒として、現在が何ミリ秒の時点にあるのかを計算します。
まず、時間の部分に3600000ミリ秒を掛け算します。
1時間は3600000ミリ秒です。
次に、分の部分に60000ミリ秒を掛け算します。
1分は60000ミリ秒です。
ミリ秒に置き換えた時間と分を足し算します。
これで現在時間をミリ秒にすることができました。
アラーム時間をミリ秒計算する

アラーム時間をミリ秒に計算しなおしています。
処理内容は現在時間と同じです。
アラームが鳴るまでのミリ秒数を計算する

アラームが鳴るまでのミリ秒数を計算して、カウントダウンをしていけばよいです。

基本的な計算は「アラームまでの時間 ー 現在時間」になります。
先ほど計算したミリ秒をつかうので「ALARMまでのミリ秒 ー 今の時間ミリ秒」の計算です。
しかし、少しややこしい計算が必要になることがあります。
それは日付跨ぎをしている場合です。
例えば、現在が23時0分でアラームを鳴らしたいのが1時0分だった場合です。
現在時間とアラーム時間を比べたら、現在時間の方が大きな数字になるので引き算をするとマイナスの値になります。

そこで、まず現在の時間から24時までのミリ秒を求めます。
そこに、0時からアラームまでのミリ秒を足します。
これでアラームまでのミリ秒が求められます。
アラーム時間まで待って音楽を鳴らす

あとはALARMまでのミリ秒だけ処理を停止して、最後に音楽を鳴らせば完了です。


コメント