NTPサーバから時刻情報を取得し、現在時刻を表示するアナログ風の時計です。アラーム時にLINEへ通知することが出来ます。
M5Stack CORE / CORE2 に対応し、時計画面は計5パターンから選べます。
目次
特長
- M5Scack CORE (GRAY、BLACK)ならびに CORE2 に対応
- インターネット上のNTPサーバから時刻を自動取得
- アナログ風の時計(5種類から選べる)を表示
- 年月日も表示
- アラーム(12時間制)の設定が可能
- アラーム時にLINEへ通知する機能
5種類から選べるアナログ風の時計
時計画面(文字盤)は、上図および下図の5種類から選ぶことが出来ます。M5Stack CORE / CORE2 のLCD面上の左ボタンを押すと、時計画面が切り替わります。
操作方法
- 左ボタンで時計画面の切り替え
- 中央ボタンでアラームの入り/切り設定
- 右ボタンで、アラーム時刻の設定モードに(時計の木枠が赤色に変化します)
- 設定モードでは、左右のボタンで長針と短針を早送りし、中央ボタンで確定(操作せずに30秒が経過すると元に戻ります。)
下図は、左から順に、(1)起動時、(2)インターネット時刻取得後、(3)アラーム設定画面、(4)アラーム待機画面です。
サンプル・プログラム
使用したプログラムは、下記に保存しました。
サンプルプログラム:
https://github.com/bokunimowakaru/m5/blob/master/core/ex15_clock/ex15_clock.ino
ダウンロード:
https://bokunimo.net/git/m5/archive/refs/heads/master.zip
ファイル場所:
(M5Stack GREY/BLACK 用):
m5-master → core → ex15_clock → ex15_clock.ino
(M5Stack CORE2 用):
m5-master → core2 → ex15_clock → ex15_clock.ino
Wi-Fi設定、LINE設定、他の処理の追加
プログラムを書き込む前に、ex15_clock.ino内に Wi-FiとLINEの設定を行ってください。LINEを使わない場合は、notify関数内のHTTPとhttpから始まるコマンド行を全て消してください。
#define SSID "1234ABCD" // 無線LANアクセスポイントのSSID
#define PASS "password" // パスワード
#define LINE_TOKEN "your_token" // LINE Notify トークン
アラーム時に実行したい他の処理があれば、このnotify関数内に記述してください。
void notify(){
HTTPClient http;
http.setConnectTimeout(15000);
http.begin("https://notify-api.line.me/api/notify");
http.addHeader("Content-Type","application/x-www-form-urlencoded");
http.addHeader("Authorization","Bearer " + String(LINE_TOKEN));
http.POST("message=アラーム(" + alrm_S + ")が鳴りました。");
http.end();
}
回転する針の描画
回転する針によって、背景や過去の針、年月日表示などを再描画する仕組みについて説明します。
針を回転させる場合、過去の針を消す必要があるので、針の背景部の処理が必要です。しかし、短針、長針、秒針のすべてが回転して(斜めに)重なり合います。例えば、全ての画面を、一度、消してから、新たな画面を書き直すと動きがスムーズでなくなります。針だけを消すとしても、重なり合った針を消すには、その下にある針を考慮する必要があるので、全ての針を消してから再描画することになり、針の消えている時間が長くなってしまい、針の点滅が目立ちます。
点滅を控える方法としては、描画用のバッファに書き込んでからバッファを転送する方法が一般的です。しかし、バッファにM5Stack用の関数で描画することが出来ない課題があります。
そこで、今回は針以外の背景のみをバッファに保持し、針を消去するときにバッファ内の値を書き込む方法で、針の点滅を抑えるようにしました。時計盤の文字列については、文字列の背景をバッファに保存します。
背景画像のバッファには、内蔵RAM(M5Stack CORE2の場合はPSRAM)を使用しました。
12時間制アラーム設定
現在では24時間制が多くなりましたが、アナログ風の時計は12時間制であることから、12時間制にこだわってみました。
- アナログ時計が12時間制なのでアラームも12時間制にする
- 12時間制なので昼か夜を設定することはできない(次に来る時刻がアラーム時刻)
- アラーム時刻の12時間後にアラームは不要なので、アラーム駆動後、自動でOFFする(毎回、設定ONする必要がある)
- アラーム設定時刻は1:00~12:59で表示する
主な利用シーンとしては、午前10時に掃除をしようとか、午後2時に出かけようとか、午後3時から会議だという一度限りの予定時に、簡単な操作で、都度、アラームを設定する用途に向いています。
一般的な12時間制の表示方法
一般的なアナログ時計の文字盤の頂点には12を表示し、また一般的なデジタル時計の12時間制表示では、正午と深夜0時から1時間を12:00~12:59 と表示します。
この場合、時計の時刻の表示範囲は、1:00~12:59となります。
一方、NHKなどで使用する12時間制では0:00~11:59です。
このように時間を示すはずの「時計」の表示は、国内での適切な時刻の読み方(午後12:15とは言わない)とは異なります。
24時間制 | 12時間制の時計 | 12時間制(NHKなど) |
0:00~0:59 | 12:00~12:59 AM | 0:00~0:59 |
1:00~11:59 | 1:00~11:59 AM | 1:00~11:59 |
12:00~12:59 | 12:00~12:59 PM | 0:00~0:59 |
13:00~23:59 | 1:00~11:59 PM | 1:00~11:59 |
参考文献:
1, Wikipedia, 12-hour clock, https://en.wikipedia.org/wiki/12-hour_clock
In Japanese usage, midnight is written as 午前0時 (0:00 a.m.) and noon is written as 午後0時 (0:00 p.m.), making the hours numbered sequentially from 0 to 11 in both halves of the day.
2, NHKことばのハンドブック, 「午後0:XX」は「12:XX」とは言わない
12時間制アラーム時刻の表示方法
本プログラムのアラーム時刻は、一般的な時計の表示方法に合わせています。HOUR_SYS12 を0にすると、NHKなどで使用する時刻表示となります(文字盤の12の変更は見送りました)。
#define HOUR_SYS12 12 // 0にすると12:00を00:00で表示
では、なぜ私は時計の12時間制に反してまで変更できるようにしたのでしょうか?
時計の頂点が12:00であることから、正午からの1時間は12時台と呼ぶことも多いですが、「午後12:15」と呼ぶと、正午を起点とした12時間15分後、すなわち深夜の0:15(12:15 AM)であると誤解する可能性があります(日常では少ないですが、プログラムとしては大いにあり得る)。
さらに、国際社会化やインターネットの普及により、24時間制での表現が広まってきたため、0:00を起点とする習慣も増えてきています(ただし、12時間制としては日本独自なので、国際社会の中では反している)。
正午からの1時間の伝え方(余談)
- 昼の12:00は、数字ではなく「正午」や「Noon」を用いる。
- 日本語の「午前」や「午後」を使う場合は、0:00~11:59までなので、「午後12:15」は誤り。「午後0:15」(12時間制)もしくは「昼の12:15」(24時間制)が正しい。
- 「AM」や「PM」を使用する場合は、1:00~12:59までなので、「0:15 PM」は誤り。「12:15 PM」と書く。
- 日本語で「12時から1時まで休憩」と言われた場合、「12時」は12時間制ではなく24時間制と解釈できるので、休憩終了時刻の1時は午前1時を示す。したがって、13時間の休憩が出来る。ただし、日本人は文面そのものよりも文面の意図を優先するので、午後1時までに仕事に戻る。プロトコルには反するが、適切な行動が出来る。
追記:また日本のルールに合わない表示が誕生しました。日本では「午前12:30」という表現は使用しなかったと思います。
下記の「午後 12:08」も、厳密には不適切かもしれませんが、普段、使っている言葉であり、ほぼ通じるので問題ない表現だと思います。
by bokunimo.net
「M5StackでLINEにアラーム通知するIoT時計」への2件の返信
すごいです
[…] アラーム機能(https://bokunimo.net/blog/esp/2773/) […]