Arduinoにリアルタイムクロックモジュール とLCDを繋いで小さな時計を作成する

リアルタイムクロックモジュール（RTC）と、LCDを繋いで時刻を表示します。
どちらもI2C接続する場合はArduinoとピン間を直接接続せず、I2Cバス経由で接続します。

# 準備
過去の[記事１](https://qiita.com/seigot/items/e031d2ea91054b83e086)、[記事２](https://qiita.com/seigot/items/544f908f79640ff80ed6)、で準備したものを再利用します。

・[Arduino UNO R3 互換品](https://www.amazon.co.jp/スイッチサイエンス-SSCI-GettingStartedArduinoKit-Arduinoをはじめようキット/dp/B0025Y6C5G/ref=sr_1_4?s=toys&ie=UTF8&qid=1548518133&sr=1-4&keywords=Arduino+正規品)
・[HiLetgo® 2個セットDC 5V HD44780 1602 LCD ディスプレイモジュール 16×2キャラクタ LCDブルーブラックライト](https://www.amazon.co.jp/gp/product/B010GXB9NM/ref=ppx_yo_dt_b_asin_title_o04__o00_s00?ie=UTF8&psc=1)
・[HiLetgo® 5個セット5V 1602LCD IIC/I2C/TWI/SPIシリアルインターフェイスモジュールポートarduinoに対応](https://www.amazon.co.jp/gp/product/B010Q175VY/ref=ppx_yo_dt_b_asin_title_o00__o00_s00?ie=UTF8&psc=1)
・[RTC DS3231 AT24C32 時計モジュール](https://www.amazon.co.jp/gp/product/B011DT3E36/ref=ppx_yo_dt_b_asin_title_o09__o00_s00?ie=UTF8&psc=1)
・[電池 LIR2032](https://www.amazon.co.jp/gp/product/B074MTLLFT/ref=ppx_yo_dt_b_asin_title_o09__o00_s00?ie=UTF8&psc=1)
・ブレットボード
・ジャンパワイヤ （オス-メス）×8個

# 回路図
下記の通り接続します。
LCDとシリアルインタフェースの接続は過去の[記事２](https://qiita.com/seigot/items/544f908f79640ff80ed6)をご参照下さい。
![0012.png](https://qiita-image-store.s3.amazonaws.com/0/344880/0880b419-a10a-52b4-5a96-a27ac1757cf2.png)

# コード
setup関数: RTC/LCDの初期化を行います
PrintRTCInfoToLCD関数: RTCの情報をLCDに出力します
GetIntegerFromRTC関数: RTCの情報から日、月、年をint型で取得します。
loop関数: 1秒置きに処理を繰り返します

```
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#include <string.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
DS3231  rtc(SDA, SCL);

void setup() {
  lcd.init();                      // initialize the lcd 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Hello, world!");
  lcd.setCursor(0,1);
  lcd.print("Arduino LCM IIC 2004");

  // Setup Serial connection
  Serial.begin(115200);
  // Initialize the rtc object
  rtc.begin();

  delay (3000);
  String BLANK = "                ";
  lcd.setCursor(0,0);
  lcd.print( BLANK );
  lcd.setCursor(0,1);
  lcd.print( BLANK );

  // set the date and time.
  //rtc.setDOW(SUNDAY);     // Set Day-of-Week
  //rtc.setTime(13, 20, 0);     // Set the time to HH:MM:SS (24hr format)
  //rtc.setDate(10, 2, 2019);   // Set the date (DD, MM, YYYY)
}

void PrintRTCInfoToLCD() {
  
  String strDOW = rtc.getDOWStr();
  String strDate = rtc.getDateStr();
  String strTime = rtc.getTimeStr();
  int iTemp = rtc.getTemp();

  lcd.setCursor(0,0);
  lcd.print( strDate );

  lcd.setCursor(0,1);
  lcd.print( strTime );

  lcd.setCursor(9,1);
  lcd.print( strDOW );  
}

void GetIntegerFromRTC() {

  String strDate = rtc.getDateStr();
  int len = strDate.length() + 1;
  char tmpstr[len];
  char *tp;
  char cDay[3], cMonth[3], cYear[5];
  int  iDay, iMonth, iYear;

  strDate.toCharArray(tmpstr, len);
  Serial.println(tmpstr);

  // get day
  tp = strtok(tmpstr, ".");
  strcpy(cDay, tp);
  iDay = atoi(cDay);

  // get month
  tp = strtok(NULL, ".");
  strcpy(cMonth, tp);
  iMonth = atoi(cMonth);

  // get year
  tp = strtok(NULL, ".");
  strcpy(cYear, tp);
  iYear = atoi(cYear);

  Serial.println("----");
  Serial.print("Day   :");Serial.println(iDay);
  Serial.print("Month :");Serial.println(iMonth);
  Serial.print("Year  :");Serial.println(iYear);
  Serial.println("----");
}

void loop() {

  PrintRTCInfoToLCD();
  GetIntegerFromRTC();

  delay (1000);
}
```


# テスト
１秒置きに時刻を更新することができました。

![014.png](https://qiita-image-store.s3.amazonaws.com/0/344880/2e837633-3f36-c406-1ad1-b39f5eeba878.png)



<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">play lcd with rtc <a href="https://t.co/LZtbXqEenH">pic.twitter.com/LZtbXqEenH</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1094573272572735488?ref_src=twsrc%5Etfw">2019年2月10日</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

日、月、年もint型で取得することができました。
![0013.png](https://qiita-image-store.s3.amazonaws.com/0/344880/1e71c4f0-8e37-2f2e-6497-eecbc822487a.png)

# 参考
・[How to Present DS3231's Temp Signal as a float onto LCD](http://forum.arduino.cc/index.php?topic=517270.msg3524817)
・[RTC DS3231 AT24C32 時計モジュールをArduinoに繋げて動かす](https://qiita.com/seigot/items/e031d2ea91054b83e086)
・[ArduinoにLCDを繋いで文字を表示する](https://qiita.com/seigot/items/544f908f79640ff80ed6)
・[組み込みエンジニアでなくても週末にArduinoを使って遊ぶ](https://qiita.com/seigot/items/958d3f2817a4bdac8754)