取得したデータに、日付や時刻情報を付加しておくと便利です。この日付や時刻情報を低電力かつ高精度提供してくれるモジュール:RTC を紹介します。

#include <Wire.h>
//RTC realTimeClock
void rtc_init()
{
//delay_ms(700);
Wire.begin(); // begin master
int ans;
Wire.beginTransmission(RTC_ADRS);
Wire.write(0x00); // control0のアドレス
Wire.write(0x0); // test=0
Wire.write(0x0); //AIE=TIE=0 タイマー、アラーム割り込み停止
ans=Wire.endTransmission();
}
//日付・時刻設定
void rtc_date_set(byte dt[])
{
int i;
Wire.beginTransmission(RTC_ADRS) ;
Wire.write((byte)0x0);
Wire.write((byte)0x0);
Wire.write((byte)0x11);//reg1
for(i=0;i<7;i++){
Wire.write(dt[i]);//秒、分、時、日、曜、月、年(00-99)
}
Wire.endTransmission();
}
//日付・時刻読み出し
void rtc_date_read(byte cdt[])
{
int i;
//Serial.print("get date:");
Wire.beginTransmission(RTC_ADRS); //
Wire.write(0x02); // 秒のアドレス
Wire.endTransmission();
//Serial.print("request date:");
Wire.requestFrom(RTC_ADRS, 7);
i=0;
while(Wire.available()) {
cdt[i] = Wire.read() & mask[i]; // receive a byte as character
//Serial.print(cdt[i],HEX); // print date
//Serial.print(",");
i++;
}
Wire.endTransmission();
}
void rtc_getstatus(byte st[]){
//get status:
Wire.beginTransmission(RTC_ADRS);
Wire.write(0x01); //ctrl reg
Wire.endTransmission();
Wire.requestFrom(RTC_ADRS,2) ;
st[0] = Wire.read() ; // Reg 01H を受信する
st[1] = Wire.read() ; // Reg 02H を受信する
Wire.endTransmission();
}
//秒、分、時、日、曜、月、年(00-99)
byte dt[7]={0x0,0x45,0x16,0x13,0x1,0x2,0x14};
byte cdt[7];
byte mask[7]={0x7F,0x7f,0x3F,0X3F,0x7,0x1F,0xff};
int i;
int RTC_ADRS=0x51;
void setup()
{
delay(100);//wait rtc
Serial.begin(9600);
rtc_init();
rtc_date_set(dt);
lcd_begin();
}
void loop()
{
char buff[10];
rtc_date_read(cdt);
//年月日
sprintf(buff,"%2x %2x %2x",cdt[2],cdt[1],cdt[0]);
lcd_setCursor(0,0);
lcd_print(buff);
//時分秒
sprintf(buff,"%2x %2x %2x",cdt[6],cdt[5],cdt[3]);
lcd_setCursor(0,1);
lcd_print(buff);
//シリアルモニタ出力
for(i=0;i<7;i++){
Serial.print(cdt[i],HEX);
if(i==2) Serial.print(":");
else Serial.print(" ");
}
Serial.println();
delay(1000);
}
0 45 16:13 1 2 14 1 45 16:13 1 2 14 2 45 16:13 1 2 14 3 45 16:13 1 2 14 4 45 16:13 1 2 14 5 45 16:13 1 2 14
