Arduinoについて質問です。Aruduino UNO R4 Minimaのボードと、youmileのJK-YM-167(https://www.amazon.co.jp/dp/B09BTS9SD5?ref=fed_asin_title)というロガーモジュールを使用しており、センサからの入力をSDカードへ定期的に書き込むプログラムを作成しています。その際JK-YM-167のRTCを用いて時刻の記録を行っているのですが、うまく時刻を読み取れない現象が発生しています。考えられる原因や改善方法などご教授いただけないでしょうか。ボタン電池の電池残量が十分であることは確認済みです。仕様ライブラリ:RTClib.h現象➀setup時は取得できていても、時間経過するとおかしい時刻になる(2000/64/63等)rtc.begin()はtrue→loopの中でrtc.now()がおかしくなる。現象➁setup時から取得できていない(rtc.begin()がfalse)実施してみた対応・起動時にdelayをいれて取得までの時間に猶予を持たせる。※記載している内容が不十分であればご指摘ください。追記します。

Amazon

1件の回答

回答を書く

1232713

2026-04-22 18:15

+ フォロー

症状から見ると、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)」の三つを試してみると、原因の当たりが付けやすいと思います。

うったえる有益だ(0シェアするブックマークする

関連質問

Copyright © 2026 AQ188.com All Rights Reserved.

博識 著作権所有