资讯详情

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

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 的常见问题

DS3231 和 DS1370 最明显的区别在于计时精度。DS1307 有一个外部 32kHz 而晶体振荡器 DS3231 有一个内部振荡器。

DS3231 和 DS3234 晶体振荡器中的温度补偿 (TCXO) 符合要求,在 0°C 至 40°C 温度范围内的精度高达 ±2 ppm。

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


}


标签: d5d电阻二极管n052at2324c的二极管

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

锐单商城 - 一站式电子元器件采购平台