取得したデータに、日付や時刻情報を付加しておくと便利です。この日付や時刻情報を低電力かつ高精度提供してくれるモジュール: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