【DS3231 RTC实时时钟模块与Arduino接口构建数字时钟】
DS3231 RTC實時時鐘模塊與Arduino接口構建數字時鐘
- 前言
- DS3231 RTC模塊介紹
- DS3231 模塊引腳排列
- DS3231 模塊組成
- 關于 DS3231 的常見問題
- DS3231 模塊原理圖
- 對 DS3231 進行編程和設置時間
- DS3231中設置時間的代碼
- 使用 DS3231 和 LCD 制作一個 DIY Arduino 數字時鐘
- 在 LCD 上顯示時間的代碼
- 完整代碼
前言
在當今世界,時間就是一切,而對于特定的電子產品,時間至關重要;就像我們人類一樣,他們也需要一種方法來記錄時間。那么電子產品是如何做到的呢?答案是 DS3231,一種實時時鐘,通常稱為 RTC,是一種內置于集成電路或 IC 中的計時設備。它用于許多對時間要求嚴格的應用程序和設備,例如服務器、GPS 和數據記錄器。讓我們看看是什么讓它滴答作響。
DS3231 RTC模塊介紹
DS3231 是一款 I2C 實時時鐘 (RTC),具有內置溫度補償晶體振蕩器 (TCXO) 和低成本且異常精確的晶體。當模塊的電源中斷時,設備有電池輸入并保持精確的時間。該器件的長期精度因包含晶體振蕩器而得到提高。RTC 跟蹤秒、分鐘、小時、天、日期、月和年。對于少于 31 天的月份,月末日期會自動修改,包括閏年更正。時鐘具有 AM/PM 指示,可在 24 小時或 12 小時模式下工作。包括兩個可編程的時間警報,以及一個可編程的方波輸出。I2C 雙向總線用于串行傳輸地址和數據。
DS3231 模塊引腳排列
DS3231 模塊有 6 個引腳,用于從模塊獲取數據并為電路板供電。DS3231的引腳排列如下:
當我們使用示波器探測 DS3231 模塊的 32k 引腳時,我們會從 IC 的內部振蕩器獲得 32kHz 信號。
DS3231 模塊組成
典型 DS3231 RTC 模塊板的關鍵組件是 DS3231 IC 和 AT24C32 EEPROM IC,用于存儲時間和日期數據。其他組件包括電源開啟 LED、一些電阻器、電容器、電池座和用于連接到微控制器的引腳。
當模塊的主電源停止時,DS3231 包含電池輸入并保持準確的時間。內置電源檢測電路不斷檢查 VCC 的狀態,以識別斷電并自動切換到備用電源。因此,即使斷電,您的 MCU 仍然能夠保持時間跟蹤。DS3231 RTC 模塊上有一個 CR2032 電池座。用于 20 毫米 3V 鋰紐扣電池的電池座位于電路板的底部。任何 CR2032 電池都可以使用。
充電能力:
該模塊的設計方式是,當外部供電時,它可以為安裝在模塊上的電池充電。但是使用不可充電的 CR2032 電池時必須小心,因為模塊也會為電池充電。CR2032 是不可充電的 3V 電池,但可充電電池可充電至 4.2V。要阻止模塊對 CR2032 不可充電電池充電,應拆焊 U4(220R) 電阻或 D1 (1N4148) 二極管。
關于 DS3231 的常見問題
問:DS1307 和 DS3231 有什么區別?
DS3231 和 DS1370 之間最顯著的區別在于計時精度。為了計時,DS1307 有一個外部 32kHz 晶體振蕩器,而 DS3231 有一個內部振蕩器。
問:DS3231 的精度如何?
DS3231 和 DS3234 中的溫度補償晶體振蕩器 (TCXO) 符合要求,在 0°C 至 +40°C 的溫度范圍內精度高達 ±2 ppm。
問:DS3231 使用什么電池?
DS3231 使用 CR2032 可充電電池,但如果要使用不可充電電池,則需要對模塊進行小幅修改。
DS3231 模塊原理圖
對 DS3231 進行編程和設置時間
在 DS3231 模塊中設置時間相當簡單。您需要做的就是在以下配置中將其連接到 Arduino。
完成上述連接后,您需要將 Arduino UNO 連接到您的 PC,打開 Arduino IDE,并安裝 Arduino DS3231 Time Set Library。打開 Arduino IDE 并從菜單欄中選擇 Library Manager。現在查找RTCLib和 DS3231 并獲取最新版本,如下圖所示。
DS3231中設置時間的代碼
代碼非常簡單。它將設置時間,然后將其顯示在串行監視器上。
rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));rtc 對象在這一行中根據您計算機上的時間設置時間。它將更改您系統的當前時鐘時間。
rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));您可以通過按以下順序將日期時間值傳遞給函數來手動設置此行中的時間:年、月、日、小時、分鐘和秒。我們將在下面的代碼中設置系統的時間。結果,我們注釋掉了這一行。
#include <RTClib.h> #include <Wire.h> RTC_DS3231 rtc; char t[32]; void setup() {Serial.begin(9600);Wire.begin();rtc.begin();rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));//rtc.adjust(DateTime(2019, 1, 21, 5, 0, 0)); } void loop() {DateTime now = rtc.now();sprintf(t, "%02d:%02d:%02d %02d/%02d/%02d", now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year()); Serial.print(F("Date/Time: "));Serial.println(t);delay(1000); }使用 DS3231 和 LCD 制作一個 DIY Arduino 數字時鐘
Arduino數字時鐘電路圖 :
將 RTC 模塊的 SCL 連接到 Arduino A5
將 RTC 模塊的 SDA 連接到 Arduino A4
將 VCC 連接到 5v,將 GND 連接到 GND
將 LCD 的 RS 連接到 Arduino 的引腳 7
將 LCD 的 E 連接到 Arduino 的引腳 6
將 LCD 的 D7 連接到 Arduino 的引腳 2
將 LCD 的 D6 連接到 Arduino 的引腳 3
將 LCD 的 D5 連接到 Arduino 的引腳 4
將 LCD 的 D4 連接到 Arduino 的引腳 5
將 VSS、K、RW、D0、D1、D2、D3 連接到 GND
將 VDD 和 A 連接到 5v
將 VO 連接到電位器輸出引腳(用于控制文本的對比度)
在 LCD 上顯示時間的代碼
我們在代碼中包含以下頭文件,Wire.h 用于使用 I2C 與模塊通信,LiquidCrystal.h用于在 LCD 顯示器上顯示時間,RTClib.h用于設置顯示器時間并對其進行格式化。
#include <Wire.h> #include <LiquidCrystal.h> #include <RTClib.h>代碼中的這一行指定 LCD 的哪個引腳連接到 Arduino 的哪個引腳。
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (rs, e, d4, d5, d6, d7)如果項目因連接中斷而啟動,代碼將在串行監視器中打印 RTC Module not Present。
if (! rtc.begin()){Serial.println(" RTC Module not Present");while (1);}如果 RTC 掉電,模塊中的時間出錯,代碼會自動設置模塊中的時間,并從計算機時鐘中獲取時間。因此,請確保在設置時間時將 PC 上的時鐘設置在正確的時間。
if (rtc.lostPower()){Serial.println("RTC power failure, reset the time!");rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));}這部分代碼將 LCD 上的光標設置為 0,并以 Date/Month/Year 格式打印日期。
void displayDate(){lcd.setCursor(0,0);lcd.print("Date:");lcd.print(now.day());lcd.print('/');lcd.print(now.month());lcd.print('/');lcd.print(now.year());}這部分代碼將光標設置為 1,并以 Hour:Minute:Second 格式打印時間。
void displayTime(){lcd.setCursor(0,1);lcd.print("Time:");lcd.print(now.hour());lcd.print(':');lcd.print(now.minute());lcd.print(':');lcd.print(now.second());lcd.print(" ");}上傳代碼后,您將能夠在 LCD 屏幕上看到日期和時間。
完整代碼
#include <Wire.h>#include <LiquidCrystal.h>#include <RTClib.h>DateTime now;RTC_DS3231 rtc;LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (rs, e, d4, d5, d6, d7)void displayDate(void);void displayTime(void); void setup (){Serial.begin(9600);lcd.begin(16,2);if (! rtc.begin()) {Serial.println(" RTC Module not Present");while (1);}if (rtc.lostPower()) {Serial.println("RTC power failure, reset the time!");rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));}}void loop () {now = rtc.now();displayDate();displayTime();}void displayDate(){lcd.setCursor(0,0);lcd.print("Date:");lcd.print(now.day());lcd.print('/');lcd.print(now.month());lcd.print('/');lcd.print(now.year());}void displayTime(){lcd.setCursor(0,1);lcd.print("Time:");lcd.print(now.hour());lcd.print(':');lcd.print(now.minute());lcd.print(':');lcd.print(now.second());lcd.print(" ");} To set the Time#include <RTClib.h>#include <Wire.h>RTC_DS3231 rtc;char t[32];void setup() {Serial.begin(9600);Wire.begin();rtc.begin();rtc.adjust(DateTime(F(__DATE__),F(__TIME__)));//rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); }void loop(){DateTime now = rtc.now();sprintf(t, "%02d:%02d:%02d %02d/%02d/%02d", now.hour(), now.minute(), now.second(), now.day(), now.month(), now.year()); Serial.print(F("Date/Time: "));Serial.println(t);delay(1000);}總結
以上是生活随笔為你收集整理的【DS3231 RTC实时时钟模块与Arduino接口构建数字时钟】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 标题栏颜色渐变和阴影,S
- 下一篇: 【Leetcode】【Longest P