锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【DS3231 RTC实时时钟模块与Arduino接口构建数字时钟】

时间:2023-05-16 21:37:00 d5d电阻二极管n052at2324c的二极管

DS3231 RTC实时钟模块与Arduino接口构建数字时钟

    • 前言
    • DS3231 RTC模块介绍
    • DS3231 模块引脚排列
    • DS3231 模块组成
    • 关于 DS3231 的常见问题
    • DS3231 模块原理图
    • 对 DS3231 编程和设置时间
    • DS在3231中设置时间的代码
    • 使用 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 并获取最新版本,如下图所示。

DS在3231中设置时间的代码

代码很简单。它将设置时间,然后在串行监视器上显示。

rtc.adjust(DateTime(F(__DATE__),F(__TIME__))); 

rtc 对象在此行中根据您的计算机时间设置时间。它将改变您系统的当前时钟时间。

rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); 

您可以按以下顺序将日期时间值传递给函数,手动设置此行时间:年、月、日、小时、分钟和秒。我们将在下面的代码中设置系统时间。因此,我们注释了这一行。

#include  #include 
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 
#include 
#include 

代码中的这一行指定 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 


#include 


#include 


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 


#include 


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);


}


锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章