運用 DS3231 及 I2C 介面 玩即時時鐘RTC 於 Arduino Uno

前言:本想找一個簡單的 DS3231 的Arduino範例,怎知搜尋出來(2011年)後其範例檔案錯誤多多,導致花了一些時間去整理,並留下此篇記錄...

動機:可否在 Arduino Uno 開發板上做一個 Real-Time Clock(RTC)?!

準備環境
1.Arduino Uno(需連接USB數據線)
2.DS3231 AT24C32 高精度時鐘RTC IIC模組
3.Windows筆電
4.Arduino IDE(需先安裝)

實作步驟
1.接線方式為:Arduino Uno SCL→A5、SDA→A4、Vcc→5V、GND→GND。如下圖

2.先至網站 http://hacks.ayars.org/2011/04/ds3231-real-time-clock.html 下載 DS3231.zip,並解壓縮至 C:\Users\XXX\Documents\Arduino\libraries 目錄內 (XXX=電腦登入帳號)

3.由於 上述2. 提供的範例錯誤頗多或是年代久遠,於是,到 參攷 2. 的網站去更新程式及範例並複製至 上述2. 的目錄中

4.搜尋其中的範例並測試後,改寫了其中的範例 DS3231_test.ino (利用高精度I2C即時時鐘RTC及溫補晶振TCXO來顯示日期時間溫度),如下(請自行修改程式 第#23~29行,將目前日期/時間代入)
/*
DS3231_test.ino
Eric Ayars
4/11
modified by Davis at 2018/1/3
Test/demo of read routines for a DS3231 RTC.
Turn on the serial monitor after loading this to check if things are
working as they should.
*/
#include <DS3231.h>
#include <Wire.h>
DS3231 Clock;
bool Century = false;
bool h12;
bool PM;
// set current datetime
byte Year = 18; // = thisyear - 2000
byte Month = 1;
byte Day = 3;
byte DoW = 3; // Day of Week
byte Hour = 9;
byte Minute = 8;
byte Second = 50;
//bool ADy, A12h, Apm;
void setup() {
Clock.setClockMode(false); // set to 24h
//Clock.setClockMode(true); // set to 12h
Clock.setYear(Year);
Clock.setMonth(Month);
Clock.setDate(Day);
Clock.setDoW(DoW);
Clock.setHour(Hour);
Clock.setMinute(Minute);
Clock.setSecond(Second);
// Start the I2C interface
Wire.begin();
// Start the serial interface
Serial.begin(9600);
}
void loop() {
// send what's going on to the serial monitor.
// Start with the year
Serial.print("2");
if (Century) { // Won't need this for 89 years.
Serial.print("1");
} else {
Serial.print("0");
}
Serial.print(Clock.getYear(), DEC);
Serial.print('-');
// then the month
Serial.print(Clock.getMonth(Century), DEC);
Serial.print('-');
// then the day
Serial.print(Clock.getDate(), DEC);
Serial.print(' ');
// // and the day of the week
// Serial.print(Clock.getDoW(), DEC);
// Serial.print(' ');
// Finally the hour, minute, and second
addzero(Clock.getHour(h12, PM));
Serial.print(Clock.getHour(h12, PM), DEC);
Serial.print(':');
addzero(Clock.getMinute());
Serial.print(Clock.getMinute(), DEC);
Serial.print(':');
addzero(Clock.getSecond());
Serial.print(Clock.getSecond(), DEC);
// // Add AM/PM indicator
// if (h12) {
// if (PM) {
// Serial.print(" PM ");
// } else {
// Serial.print(" AM ");
// }
// } else {
// Serial.print(" 24h ");
// }
// Display the temperature
Serial.print(" T=");
Serial.print(Clock.getTemperature(), 2);
// // Tell whether the time is (likely to be) valid
// if (Clock.oscillatorCheck()) {
// Serial.print(" O+");
// } else {
// Serial.print(" O-");
// }
// // Indicate whether an alarm went off
// if (Clock.checkIfAlarm(1)) {
// Serial.print(" A1!");
// }
// if (Clock.checkIfAlarm(2)) {
// Serial.print(" A2!");
// }
// New line on display
Serial.print('\n');
// // Display Alarm 1 information
// Serial.print("Alarm 1: ");
// Clock.getA1Time(ADay, AHour, AMinute, ASecond, ABits, ADy, A12h, Apm);
// Serial.print(ADay, DEC);
// if (ADy) {
// Serial.print(" DoW");
// } else {
// Serial.print(" Date");
// }
// Serial.print(' ');
// Serial.print(AHour, DEC);
// Serial.print(' ');
// Serial.print(AMinute, DEC);
// Serial.print(' ');
// Serial.print(ASecond, DEC);
// Serial.print(' ');
// if (A12h) {
// if (Apm) {
// Serial.print('pm ');
// } else {
// Serial.print('am ');
// }
// }
// if (Clock.checkAlarmEnabled(1)) {
// Serial.print("enabled");
// }
// Serial.print('\n');
// // Display Alarm 2 information
// Serial.print("Alarm 2: ");
// Clock.getA2Time(ADay, AHour, AMinute, ABits, ADy, A12h, Apm);
// Serial.print(ADay, DEC);
// if (ADy) {
// Serial.print(" DoW");
// } else {
// Serial.print(" Date");
// }
// Serial.print(' ');
// Serial.print(AHour, DEC);
// Serial.print(' ');
// Serial.print(AMinute, DEC);
// Serial.print(' ');
// if (A12h) {
// if (Apm) {
// Serial.print('pm');
// } else {
// Serial.print('am');
// }
// }
// if (Clock.checkAlarmEnabled(2)) {
// Serial.print("enabled");
// }
// // display alarm bits
// Serial.print('\nAlarm bits: ');
// Serial.print(ABits, BIN);
//
// Serial.print('\n');
// Serial.print('\n');
delay(1000);
}
void addzero(byte n) {
if (n < 10) {
Serial.print('0');
}
}
view raw DS3231_test.ino hosted with ❤ by GitHub


執行畫面,如下圖


參攷
1.DS3231 Real-Time Clock, http://hacks.ayars.org/2011/04/ds3231-real-time-clock.html
2.NorthernWidget/DS3231, https://github.com/NorthernWidget/DS3231

留言