一つ目は変数の定義間違い。
byte d_day[2];
は
int d_day[2];
が正しいです。
9月13日に表示が1月0日と表示されたのは、このバグのせいです。
積算日で送られてくる信号が 256日になったために1バイトを超えてしまい、積算日が 0日となってしまいました。
二つ目は4年に一度しか起こらないバグです。
送られてきた信号のデコード時にうるう年の処理を入れ忘れておりました。
日付が切り替わるときは処理してたんですが・・・。
変数定義の
const byte month_day[] から const を削除。
日付と月のデコードを年が決まってからに変更。うるう年の処理を追加。
// 年の算出
c_year = 0;
for (i = 0; i < 9; i++){
c_year = c_year << 1;
c_year += get_code();
}
d_year[no] = (c_year >> 4) * 10 + (c_year & B1111);
code = get_code(); // ポジションマーカー
d_month[no] = 0;
do{
d_day[no] -= month_day[d_month[no]];
d_month[no]++;
//----- ここにうるう年の処理を追加 -----
if (d_month[no] == 2 && (d_year[no] % 4 == 0)){
month_day[2] = 29;
} else {
month_day[2] = 28;
}
//--------------------------------------
} while( d_day[no] > month_day[d_month[no]]);
Google Drive にスケッチをアップしました。
ソースはこちら。「Radio_Clock_bugfix2.zip」
「電波時計」を選んで「Radio_Clock_bugfix2.zip」をクリック。
上の矢印をクリックするとダウンロードできます