M5StickCで作るクロック&カレンダー
内蔵RTCを使用して、クロックとカレンダー、ついでに1分タイマーを作ります時刻合わせはUIを作るのが面倒なので、起動時にNTPから現在時刻を取得します。
表示の切り替えは、IMU(加速度センサー)でM5StickCの姿勢を計測して行います。
RTC(BM8563)
RTCはI2C(SDA-G21、SCLーG22)で接続している。M5ライブラリを使用する場合にはWire1に割り当てられる、M5.begin()内で定義されるようで、Wire1の定義は不要
RTC(BM8563)のレジスタ
アドレス | BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT70 |
---|---|---|---|---|---|---|---|---|
00h | TEST1 | x | STOP | x | TESTC | x | x | x |
01h | x | x | x | TI_TP | Alerm | TIMER | Alerm割込 | TIMER割込 |
02h | VL | 秒 10の位 0~5 | 秒 1の位 0~9 | |||||
03h | x | 分 10の位 0~5 | 分 1の位 0~9 | |||||
04h | x | x | 時 10の位 0~2 | 時 1の位 0~9 | ||||
05h | x | x | 日 10の位 0~2 | 日 1の位 0~9 | ||||
06h | x | x | x | x | x | 曜日 0~6 | ||
07h | 世紀 | x | x | 月 0~1 | 月 1の位 0~9 | |||
08h | 年 10の位 0~2 | 年 1の位 0~9 |
TI_TP:1にするとPowerOnで設定がリセット
IMU(加速度センサー)
XYZ軸の加速度と角速度を検知する6軸の加速度センサー MPU6886 を内蔵しており I2C(SDA-G21、SCLーG22)で接続している起動時にはスリープモードになっているので
動作モードを設定しないと動きません。
使わない時は止まっているので邪魔にならない仕様です。
|
0x68に動作モードを設定 ※加速度と角速度を使用する場合 0 で良い。 0x1Bと0x1Cに計測レンジを設定 符号付き16Bitから加速度(g)への変換は センサー値 ÷ (32767÷計測レンジ) Ex.計測レンジが±2gの場合 センサー値÷16384 符号付き16Bitから角速度(dps)への変換は センサー値 ÷ (326787÷計測レンジ) Ex.計測レンジが±250dpsの場合 センサー値÷131 |
加速度からXY平面の傾きを求める
▼の式で求められます、単位はラジアンです。Deg単位に変換する場合は π÷180 を掛ければよいです。
ArduinoIDEでは π÷180 が変換係数 RAD_TO_DEG で定義されていますので、コレをかけるだけです。
万年カレンダー
カレンダ―の表示に必要なのは、その月が何日あるのかと、1日が何曜日なのかの2点ですその月が何日あるかは、2月以外は固定ですし、2月は閏年か平年かで判定できます。
閏年の条件
・ 4で割り切れる年は閏年
・ただし、100で割り切れる年は平年
・ただし、400で割り切れる年は閏年
Y年M月D日の曜日
基準日を設定して、基準日からの経過日数を7で割った余りで求められます。
ツェラーの公式に当てはめれば
int yy = (month <= 2) ? year -1 : year ;
int mm = (month <= 2) ? month + 12 : month ;
int C = yy / 100 ;
int Y = yy % 100 ;
int wd = (5*C + Y + Y/4 + C/4 + (26*mm + 26)/10+day-1) % 7 ;
で求めることが出来ます。
wdは0~6の値をとり、それぞれに日曜~土曜に対応します。
スケッチ
YuruPuro/M5StickC-CLOCK-and-CALENDER