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

ESP32でリアルタイムクロックPCF2129のクロックに同期して時刻を取得する方法

スポンサーリンク

PCF2129から出力される1Hzのクロックに同期して、時刻を取得するプログラムを作ります。前回はPCF2129に時刻のセットと、時刻の取得ができるようになりました。詳しくはこちら。

スポンサーリンク

回路図

PCF2129とESP32の接続回路

回路図はこのようになっています。PCF2129のCLKOUTをESP32のIO17に接続しました。

スポンサーリンク

プログラム

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

PCF2129AT rtc;
const int Clock1HzPin = 17;

//task handles
TaskHandle_t taskHandle[10];
enum task { dispTimeTask };

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

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

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

  //Time display task
  pinMode( Clock1HzPin , INPUT_PULLUP );
  xTaskCreatePinnedToCore(dispTime, "dispTime", 4096, NULL, 1, &taskHandle[dispTimeTask], 1 );
}

void loop ()
{
}

//task
void dispTime(void* arg)
{
  int oldPinStatus = digitalRead(Clock1HzPin);
  int newPinStatus;
  struct tm dt;
  while (1)
  {
    newPinStatus = digitalRead(Clock1HzPin);
    if( oldPinStatus == 0 && newPinStatus == 1 )  //rising edge
    {
      oldPinStatus = newPinStatus;
    }
    if ( oldPinStatus == 1 && newPinStatus == 0)  //folling edge
    {
      Serial.print("Pin:");
      Serial.print(digitalRead(Clock1HzPin));
      rtc.getDate(&dt);          // get date from PCF2129
      Serial.print("\t 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);

      oldPinStatus = newPinStatus;
    }
    delay(10);
  }
}

28行目でPCF2129のCLKOUTから1Hzが出力されるようにしておきます。CLOKOUTは17番ピンにつながっているので、このピン(Clock1HzPin)を調べることで状態がわかります。

Clock1HzPinの状態の監視は、タスク(dispTime())を利用しています。タスクを10ms周期で動作させ、Clock1HzPinを監視します。

dispTime()タスクでは、Clock1HzPinの状態が、HIGHからLOWに立ち下がった時に、PCF2129から時刻を読み込み、結果をシリアルへ出力するという処理をしています。

当初は、ピン変化割り込みであるattachInterrupt()を使おうと思いっていたのですが、この割り込みの処理内ではEEPROMの読み出しができなかったので、この割り込みを使わずに、タスクを使用することにしました。

スポンサーリンク

結果

PCF2129のLEDに同期して、時刻が取得され表示されるようになりました。

さて、次回はVFD表示管IV-27Mのプログラムに、この機能を追加し、時計にしていきたいと思います。