戻る

VelxioでDS1307を使ったI2C RTC時計

はじめに

Arduinoプロジェクトにリアルタイムクロックを追加したいけれど、ハードウェアが手元にないと思ったことはありませんか?Velxioを使えば、ブラウザ上でI2C RTC(DS1307)をシミュレートできます。このチュートリアルでは、仮想のDS1307から現在の日時を取得し、シリアルモニタに表示するシンプルなI2Cリーダーを構築します。外部ライブラリは不要で、内蔵のWireライブラリのみを使用します。

Velxioシミュレータキャンバス上のi2c-rtc-readの回路図

回路の解説

この例は非常にシンプルです。DS1307は仮想のArduino Unoボードに既に統合されているため、外部コンポーネントや配線を追加する必要はありません。I2Cバス(SDAはA4、SCLはA5)は、アドレス0x68のDS1307に内部接続されています。唯一のコンポーネントはArduino Uno自体です。

カテゴリ別にパーツをブラウズするVelxioコンポーネントピッカーモーダル

まず、Velxioエディタを開き、コンポーネントピッカーからArduino Unoを選択します。DS1307はシミュレーション環境に組み込まれているため、別途追加する必要はありません。回路はすぐに使用できます。

コードの解説

コードをステップごとに詳しく見ていきましょう。

インクルードと定義

#include <Wire.h>

#define DS1307_ADDR 0x68

I2C通信用にWireライブラリをインクルードし、DS1307のI2Cアドレスを0x68と定義します。

BCDから10進数への変換

byte bcdToDec(byte val) {
  return ((val >> 4) * 10) + (val & 0x0F);
}

DS1307は時刻値をBCD(2進化10進数)形式で保存します。このヘルパー関数はBCDバイトを通常の10進数に変換します。

セットアップ

void setup() {
  Wire.begin();
  Serial.begin(9600);

  Serial.println("===========================");
  Serial.println("  DS1307 RTC Reader (I2C)");
  Serial.println("===========================");
  Serial.println();
}

I2Cバスとシリアル通信を9600ボーで初期化し、ヘッダーを表示します。

ループ

void loop() {
  // Set register pointer to 0 (seconds)
  Wire.beginTransmission(DS1307_ADDR);
  Wire.write(0x00);
  Wire.endTransmission();

  // Request 7 bytes: sec, min, hr, dow, date, month, year
  Wire.requestFrom(DS1307_ADDR, 7);

  if (Wire.available() >= 7) {
    byte sec   = bcdToDec(Wire.read() & 0x7F);
    byte min   = bcdToDec(Wire.read());
    byte hr    = bcdToDec(Wire.read() & 0x3F);
    byte dow   = bcdToDec(Wire.read());
    byte date  = bcdToDec(Wire.read());
    byte month = bcdToDec(Wire.read());
    byte year  = bcdToDec(Wire.read());

    // Print formatted time
    Serial.print("Time: ");
    if (hr < 10) Serial.print("0");
    Serial.print(hr);
    Serial.print(":");
    if (min < 10) Serial.print("0");
    Serial.print(min);
    Serial.print(":");
    if (sec < 10) Serial.print("0");
    Serial.print(sec);

    Serial.print("  Date: ");
    if (date < 10) Serial.print("0");
    Serial.print(date);
    Serial.print("/");
    if (month < 10) Serial.print("0");
    Serial.print(month);
    Serial.print("/20");
    if (year < 10) Serial.print("0");
    Serial.println(year);
  } else {
    Serial.println("Error: Could not read RTC");
  }

  delay(1000);
}

ループでは、まず1バイトの0x00を送信してDS1307のレジスタポインタを0(秒レジスタ)に設定します。次に、RTCから7バイトを要求します。DS1307は秒、分、時、曜日、日、月、年をBCDで返します。秒の最上位ビット(ビット7はクロック停止フラグ)と時の上位2ビット(ビット6-7はモード/AM-PM)をマスクします。変換後、先頭ゼロを付けて時刻と日付を表示します。7バイト未満しか利用できない場合はエラーを表示します。最後に1秒待機します。

主要な概念

よくある落とし穴とデバッグのヒント

コンパイルと実行コントロールがあるVelxioエディタツールバー

推奨拡張機能

実際に試してみよう

実際の動作を確認してみませんか?Velxioでライブサンプルを開き、Runボタンを押してください。シリアルモニタで毎秒更新される時刻が表示されます。

VelxioでI2C RTCリーダーを起動

シミュレーションビューポートの上のVelxioキャンバスツールバー

それでは、シミュレーションをお楽しみください!


共有:
David Montero

執筆者

David Montero

Creator of Velxio, the open-source circuit and Arduino simulator.

GitHub velxio.dev

関連記事


前の記事
Arduinoを使ったI2C EEPROMの読み書き:完全ガイド
次の記事
ArduinoでI2Cスキャナー:バス上のすべてのデバイスを見つける