広報部自由研究ーRTC(リアルタイムクロック)を使ってみる(2)

広報部です。こんばんは。

前回の続きです。

時刻合わせ

買ってきたばかりのRTCはちゃんとした時間が設定されていないので時計としては使えません。電池(CR2032)をセットした上でちゃんとした時間をセットする必要があります。

方法はいくつかあって

  1. ラズパイ等を使って書き込む
  2. ビルド時間を使う
  3. シリアルモニターから書き込む

1はラズパイがネットにつながっていてNTPで正確な時間を取れている場合、一番正確な時間を書き込めます。が、Arduinoだけでは完結せず面倒なのでここでは割愛。hwclock -wコマンドを使えば良いようです。

2はブログラムをビルドした時間をそのまま書き込む方法です。お手軽ですが、ビルド→書き込み→実行、というステップになる関係上、どうしても数秒〜数十秒ずれます。あんまりおすすめではないのでこれも割愛。

3はシリアルモニターから値を書き込む方法です。現在時刻を書き込むというよりある固定値を書き込む方法です。その時間になるのを見計らってタイミングを合わせて書き込むことになります。前回使用したDS3231RTCライブラリのサンプルに”SetSerial”というサンプルがあるのでこれを使います。

このサンプルをそのままビルド→書き込んで…

その時間になったタイミングでエンターを押す!
なんとも原始的な方法です(笑)

んで、この手順は電池さえ抜かなければ最初の1回だけでオーケーです。

LCDに表示してみる

単独で使えるようにLCDに表示してみることにします。
使うのは前回ラズパイで色々苦労した1602Aという16×2行キャラクターLCD。

サンプルの改変で作っているので色々雑ですが一応ソースコードはこんな感じ。

#include <DS3232RTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2); // I2C: 0x3F, 16
const char *weekStr[7] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
void setup(void)
{
Serial.begin(11520);
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");

lcd.init();
lcd.backlight();
}

void loop(void)
{
digitalClockLCD();
delay(1000);
}

void digitalClockLCD(void)
{
lcd.setCursor(0, 0);
lcd.print(year());
lcd.print("/");
lcdDigits(month());
lcd.print("/");
lcdDigits(day());
lcd.print(" ");
lcd.print(weekStr[weekday()-1]);

lcd.setCursor(0, 1);
lcdDigits(hour());
lcd.print(":");
lcdDigits(minute());
lcd.print(":");
lcdDigits(second());
}

void lcdDigits(int digits)
{
// utility function for digital clock display: prints preceding colon and leading 0
if(digits < 10)
lcd.print('0');
lcd.print(digits);
}

意外といい感じにできたので、応用編も考えてみたいなー。
ま、とりあえず今回はここまで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です