// // リアルタイムRTC8564BNのテストRTC8564 // 動作:RTCの値をI2Cで読んで、液晶とシリアルに流す // 接続:RTCの /INT 信号を digitalの6PINに接続 // 設定:RTCは定周期タイマ割り込み1秒に設定しておく(別のプログラムが必要) // #include #include #include LiquidCrystal lcd(12, 11, 5, 4, 3, 2); char dtString[20]="yyyy/mm/dd hh:mm:ss"; // テンプレート用文字列で初期化 byte RtcADR = 0XA2 >> 1; void setup() { pinMode(6, INPUT); // RTCの /INT信号を接続 digitalWrite(6, HIGH); // オープンドレインなのでプルアップ pinMode(13, OUTPUT); // 動作表示LED Serial.begin(9600); lcd.begin(16, 2); Rtc.begin(); // AdjustRtcTime(); // 時刻合わせが必要な場合に使う // RTCが完全リセットされた場合、ライブラリは2001/1/1 9:00:00を設定する SetRtcTimer(); // 定周期タイマーの設定 } void loop() { int n; waitTimer(); // RTCの /INT信号を待つ Rtc.available(); // 時刻を取得 convString(); // RTCの時刻(BCD)を文字列に変換してdtStringに格納 Serial.println(dtString); // シリアルに書き出し lcd.setCursor(0, 0); // 液晶に書き出し for( n=5; n <= 18; n++){ // 入りきらないので年は省略 lcd.print(dtString[n]); } } void convString(){ // RTCの2バイトのBCDを文字に変換し時刻の文字列を作る byte x; dtString[0]='2'; dtString[1]='0'; x = Rtc.years(); dtString[2] = upper2chr(x); dtString[3] = lower2chr(x); x = Rtc.months(); dtString[5] = upper2chr(x); dtString[6] = lower2chr(x); x = Rtc.days(); dtString[8] = upper2chr(x); dtString[9] = lower2chr(x); x = Rtc.hours(); dtString[11] = upper2chr(x); dtString[12] = lower2chr(x); x = Rtc.minutes(); dtString[14] = upper2chr(x); dtString[15] = lower2chr(x); x = Rtc.seconds(); dtString[17] = upper2chr(x); dtString[18] = lower2chr(x); } char upper2chr(byte x){ // 上位をAsciiコードに変換 return (x >> 4) + 0x30; } char lower2chr(byte x){ // 下位をAsciiコードに変換 return (x & 0x0f) + 0x30; } void waitTimer(){ // RTCの /INT信号を待つ while(digitalRead(6) == HIGH){ // HIGHなのでLOWになるまで待つ } while(digitalRead(6) == LOW){ // 再びHIGHになるまで待つ digitalWrite(13, HIGH); // LED ON } digitalWrite(13, LOW); // LED OFF } void AdjustRtcTime(){ // 時計の時刻合わせに使用。数値は修正要 byte date_and_time[7]; date_and_time[0] = 0x00; // 0秒 date_and_time[1] = 0x31; // 5分 date_and_time[2] = 0x10; // 20時 date_and_time[3] = 0x05; // 2日 date_and_time[4] = 0x04; // X曜日 date_and_time[5] = 0x08; // 8月 date_and_time[6] = 0x12; // 12年 Rtc.sync(date_and_time); } void SetRtcTimer(){ // 定周期タイマー割り込みの設定 Wire.beginTransmission(RtcADR); Wire.write(0x0e); // タイマー停止 Wire.write(0x00); Wire.endTransmission(); Wire.beginTransmission(RtcADR); Wire.write(0x01); // コントロールレジスタ-2の設定 Wire.write(0x11); // TI/TP=on, TIE=on Wire.endTransmission(); Wire.beginTransmission(RtcADR); Wire.write(0x0f); // タイマー設定値 Wire.write(0x01); // 1回毎 Wire.endTransmission(); Wire.beginTransmission(RtcADR); Wire.write(0x0e); // タイマースタート Wire.write(0x82); // TEビットon, カウンタソースクロックは1秒を設定 Wire.endTransmission(); }