PCF2129から出力される1Hzのクロックに同期して、時刻を取得するプログラムを作ります。前回はPCF2129に時刻のセットと、時刻の取得ができるようになりました。詳しくはこちら。
回路図
回路図はこのようになっています。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番ピンにつながっているので、このピン(
当初は、ピン変化割り込みであるattachInterrupt()を使おうと思いっていたのですが、この割り込みの処理内ではEEPROMの読み出しができなかったので、この割り込みを使わずに、タスクを使用することにしました。
結果
PCF2129のLEDに同期して、時刻が取得され表示されるようになりました。
さて、次回はVFD表示管IV-27Mのプログラムに、この機能を追加し、時計にしていきたいと思います。
コメント