PR 記事には広告が含まれています
スポンサーリンク
Translate

ESP32でリアルタイムクロックICのPCF2129を使う方法

スポンサーリンク

スポンサーリンク

PCF2129

3.3Vで動作

PCF2129は3.3Vでも動作する、リアルタイムクロックICです。I2CかSPIでマイコンと接続し、通信します。ArduinoのリアルタイムクロックICとしてはDS3231がとても有名ですが、仕様としては5Vでしか動作しません。3.3Vでもまぁ動作はするのですが仕様的には5V用です。このため3.3Vで動作するESP32には、DS3231よりはPCF2129の方が合っていると思います。

PCF2129にはパッケージの違いで、PCF2129TとPCF2129ATがあります。機能は同じなので、入手性の良いPCF2129ATを使っています。

回路

PCF2129のI2C接続回路

上の回路図が、I2CでESP32へ接続するための回路です。VBATにはバッテリーバックアップのための0.22Fのスパーキャパシタを使っています。バッテリーだと寿命により交換する必要があったり、サイズが大きいために基板上で面積が必要なので、交換不要で小型のスーパーキャパシタを使ってみました。

割り込み出力とCLKOUT出力には、動作の確認のためにLEDを接続しました。割り込み信号やCLKOUTがLowになるとLEDが消える仕組みです。

はんだ付け

秋月電子のピッチ変換基板に、先ほどのPCF2129の回路を実装しました。

ブレッドボードに、ESP32-DevKitCと、先ほど作ったモジュールを差し込んで、配線すれば回路が完成です。

スポンサーリンク

プログラム

既存のライブラリを改造

PCF2129にはArduinoで利用できる、とっても便利なライブラリが公開されています。

このライブラリを以下のように改造しました。

  • 時間を保持する構造体「struct tm」で時間の設定と取得ができるように変更しました
  • CLKOUTを設定できる機能を追加しました
  • 全てのレジスタの内容を表示できる機能を追加しました

こちらがテストプログラムです。

#include <Wire.h>
#include "PCF2129AT.h"

PCF2129AT rtc;

void setup()
{
  Serial.begin(115200);
  Wire.begin();
  rtc.init();
  Serial.println("PC2129AT Sample Program");

  rtc.readAllRegister();

  //Time Setting
  struct tm dt;
  dt.tm_year = 2021-1900; // year(from 1900years)
  dt.tm_mon = 5-1;        // month(0-11)
  dt.tm_mday = 12;        // day(1-)
  dt.tm_hour = 18;        // hours
  dt.tm_min = 46;         // minits
  dt.tm_sec = 0;          // seconds
  rtc.setDate(&dt);       // Set time to PCF2129

  //Alarm Setting
  dt.tm_sec = 0;          // seconds
  rtc.enableAlarmSecond(); // match second alarm
  rtc.setAlarm(&dt);       // Set alarm to PCF2129

  rtc.clearAF();          // clear all alarm flags
  rtc.enableInterruptAlarm(); // out alarm interrupt to INT pin 
  rtc.setInterruptsPIN(); // set interrupt

  rtc.setClockOut( ClkoutFreq_1Hz );  //CLKOUT 1Hz

  rtc.readAllRegister();
}

void loop ()
{
  struct tm dt; 
  rtc.getDate(&dt);          // get date from PCF2129
  Serial.print("year :");
  Serial.print(1900 + dt.tm_year, DEC);
  Serial.print("\t month :");
  Serial.print(1 + dt.tm_mon, DEC);
  Serial.print("\t date :");
  Serial.print(dt.tm_mday, DEC);
  Serial.print("\t hour :");
  Serial.print(dt.tm_hour, DEC);
  Serial.print("\t minutes :");
  Serial.print(dt.tm_min, DEC);
  Serial.print("\t second :");
  Serial.println(dt.tm_sec, DEC);

  //clear alarm flag at 10 sec
  if( dt.tm_sec == 10 )
  {
    rtc.clearAF();
  }
  delay(1000);
}

このプログラムは、

  • PCF2129に時刻の設定をします
  • 毎分0秒にアラーム割り込みが発生するように設定します
  • CLKOUTに1Hzが出力されるように設定します
  • 1秒毎にPCF2129内の時刻をシリアルモニタに表示します
  • 毎分10秒にアラーム割り込みを解除します(アラームは解除しない)

という、流れで実行されます。

プログラム全体はこちらよりダウンロードできます。

実行

プログラムを実行すると、毎分0秒になるとアラームによる割り込みが発生し、/INTピンがLowになるために/INTのLEDが消灯します。その後10秒経過すると/INTピンがハイインピーダンスになりLEDが再点灯します。

また、CLKOUTピンにつながったLEDが1Hzで点滅します。

シリアルモニターには、1秒毎にPCF2129内の時刻が表示されます。

スポンサーリンク

完成!

ESP32からPCF2129を制御し、時刻の設定や取得、アラームの設定、1Hzのクロックを得ることができるようになりました。

これを使って、VFD表示管IV-27Mをカレンダー付きの時計にしたいと思います。IV-27Mの制御に関しては、こちらをご覧ください。

2021.5.18 追加 つづきはこちら

追加終わり