症状から見ると、RTCそのものより「UNO R4とJK-YM-167上のDS1307とのI2C通信が不安定になっている」可能性が高いです。
理由と確認ポイントを順に書きます。
・JK-YM-167のRTCはDS1307系なので、スケッチ側のインスタンスが
RTC_DS1307 rtc;
になっているかをまず確認してください(DS3231や別クラスにしていると読めても値がおかしくなります)。
・「2000/64/63」のような有り得ない日付は、DS1307のレジスタが壊れたというより、I2Cで読んだ生データが化けていて、それをRTClibが無理やり日付として解釈した時によく出るパターンです。
この場合は
- シールドのSDA/SCLまわりのハンダ不良や差し込み不良
- I2Cのプルアップ抵抗が弱い、配線が長すぎる
- ライブラリやボード定義との相性でI2Cクロックが速すぎる
などが典型原因です。
・対策としては、まずRTCだけに絞った「最小構成」で切り分けてください。
1) Adafruit RTClibのサンプル(ds1307の例)をUNO R4 Minima用にそのまま書き込み
2) センサやSDカードのコードは一旦すべて外す
それでも
- 起動時からrtc.begin()がfalseになる
- しばらく動かすと日付が崩れる
なら、ほぼハード側かライブラリ相性です。
・Wireの初期化も明示しておくと安心です。
setup内で
Wire.begin();
Wire.setClock(100000); // 100kHzに固定
if (!rtc.begin()) { … }
という順番にして、DS1307が対応している標準モードの速度に固定して試してみてください。
・I2Cスキャナのスケッチ(ネット上に多数あります)をUNO R4に書き込んで動かし、アドレス0x68が
- 毎回必ず表示されるか
- 現象が出た後も見えているか
を確認すると切り分けがかなり楽になります。スキャナで0x68が消えるようなら、シールドのハンダやヘッダの接触不良の可能性が高いです。
・ここまでやっても安定しない場合は
- RTClibを最新版に更新する
- それでも不安定なら、UNO R4で動作確認例が多いDS3231モジュールに交換する
- あるいはUNO R4内蔵RTCを使う
といった方向も検討の価値があります。
まずは「RTCだけの最小スケッチ」「I2Cスキャナ」「Wire.setClock(100000)」の三つを試してみると、原因の当たりが付けやすいと思います。