Hướng dẫn sử dụng Module thời gian thực RTC DS3231 với Arduino

Hướng dẫn sử dụng Module thời gian thực RTC DS3231 với Arduino

Bài viết hôm nay sẽ giới thiệu một dự án thú vị, hướng dẫn sử dụng module RTC DS3231 để tạo một đồng hồ thời gian thực. Chúng ta sẽ hiển thị thông tin về ngày, giờ, phút và giây trên đồng hồ. Bài viết cũng sẽ giúp bạn hiểu thêm về cấu tạo và nguyên lý hoạt động của RTC DS3231 Arduino. Để tiết kiệm thời gian, chúng ta sẽ bắt đầu ngay với nội dung bài viết.

Để tạo động lực cho Team Arduino KIT ra nhiều bài viết chất lượng hơn, các bạn có thể ủng hộ mình bằng cách Donate qua MoMo, Ngân hàng, Paypal…Nhấn vào link bên dưới nhé.

Các linh kiện cần thiết cho dự án

TÊN LINH KIỆN SỐ LƯỢNG NƠI BÁN
Arduino Uno R3 1 Shopee | Cytron
Module thời gian thực RTC DS3231 1 Shopee | Cytron
Breadboard 1 Shopee | Cytron
Dây cắm (Đực – Cái) 10 – 20 Shopee | Cytron

Tổng quan về phần cứng

Chip RTC DS3231

Module RTC có chip là DS3231 của Maxim, là một chip RTC chi phí thấp và cực kỳ chính xác. Chip này xử lý các chức năng như đếm thời gian để theo dõi thời gian thực và giao tiếp với vi điều khiển thông qua giao tiếp I2C.

DS3231 cung cấp thông tin như giây, phút, giờ, ngày, thứ, tháng và năm. Đối với các tháng có ít hơn 31 ngày, nó tự động điều chỉnh ngày cuối cùng của tháng, bao gồm cả điều chỉnh cho năm nhuận (đến năm 2100).

Module hỗ trợ định dạng hiển thị giờ 12 giờ hoặc 24 giờ và có chỉ báo AM/PM. Nó cũng có hai báo thức trong ngày có thể được lập trình.

Chân INT/SQW trên DS3231 có thể cung cấp tín hiệu ngắt (do điều kiện cảnh báo) hoặc tạo ra sóng vuông đẹp với tần số 1Hz, 4kHz, 8kHz hoặc 32kHz.

Ngoài ra, DS3231 cung cấp một đồng hồ tham chiếu chính xác (được bù nhiệt độ) và ổn định trên chân 32K.

Xem ngay: Hiển thị thời gian thực (RTC DS1307) lên LCD16x2 bằng giao tiếp I2C trong môi trường Arduino

Bộ Dao Động Tinh Thể Thạch Anh (TCXO)

Bộ Dao Động Tinh Thể Thạch Anh (Temperature Compensated Crystal Oscillator (TCXO)) là một thành phần quan trọng trong chip DS3231 RTC. Đây là một loại dao động tinh thể (crystal oscillator) được thiết kế để duy trì độ chính xác của đồng hồ thời gian thực (RTC) trong điều kiện biến đổi nhiệt độ.

TCXO trong RTC DS3231 được sử dụng để điều chỉnh tần số của dao động tinh thể dựa trên thay đổi nhiệt độ. Điều này giúp giảm sai số thời gian gây ra bởi sự biến đổi nhiệt độ trong môi trường hoạt động của chip.

Thay vì sử dụng một tinh thể không điều chỉnh thông thường, TCXO sử dụng một mạch điều khiển nhiệt độ (temperature control circuit) để duy trì tần số dao động ổn định trong một khoảng nhiệt độ rộng. Điều này giúp đảm bảo rằng RTC DS3231 vẫn đồng bộ với thời gian thực một cách chính xác ngay cả khi môi trường nhiệt độ thay đổi.

TCXO trong DS3231 cung cấp độ chính xác cao và ổn định trong việc đo và duy trì thời gian. Điều này rất quan trọng trong các ứng dụng yêu cầu đồng bộ thời gian chính xác như đồng hồ điện tử, bộ ghi dữ liệu thời gian và hệ thống đo lường thời gian.

Battery Backup

Battery Backup (còn được gọi là nguồn dự phòng), nó cho phép duy trì hoạt động của RTC và bảo vệ dữ liệu thời gian khi nguồn cấp chính bị mất điện.

RTC DS3231 có một chân VBAT được kết nối với nguồn pin dự phòng. Khi nguồn cấp chính bị mất, nguồn pin dự phòng sẽ tự động kích hoạt và cung cấp năng lượng cho RTC. Thông qua nguồn pin dự phòng, chip DS3231 vẫn tiếp tục theo dõi thời gian thực và duy trì bộ đếm thời gian chính xác.

Battery Backup giúp ngăn chặn mất dữ liệu thời gian quan trọng trong trường hợp nguồn cấp chính bị gián đoạn hoặc mất điện tạm thời. Khi nguồn điện được khôi phục, RTC sẽ tiếp tục hoạt động từ nguồn cấp chính và dữ liệu thời gian sẽ được duy trì mà không bị mất. Dưới đây là một ví dụ:

220mAh/3µA = 73333.34 giờ = 3055.56 ngày = 8.37 năm

EEPROM 24C32

Module DS3231 RTC bổ sung chip AT24C32 EEPROM (không bay hơi) với dung lượng 32 byte (4K x 8 bit) và khả năng ghi được 1.000.000 chu kỳ. Mặc dù không liên quan trực tiếp đến chức năng RTC, chip EEPROM này có thể hữu ích để lưu trữ dữ liệu hoặc ghi bất kỳ dữ liệu nào khác mà không thay đổi.

24C32 EEPROM sử dụng giao tiếp I2C và chia sẻ cùng bus I2C với DS3231 Arduino. Nếu bạn sử dụng nhiều thiết bị trên cùng một bus I2C, bạn có thể cần thiết lập một địa chỉ I2C riêng biệt cho EEPROM để tránh xung đột với các thiết bị I2C khác.

Để thực hiện điều này, module có ba chân hàn (A0, A1 và A2) ở mặt sau. Bằng cách nối một dây nhảy với một điểm hàn, bạn có thể thiết lập địa chỉ. Theo tài liệu của 24C32, ba bit này được đặt ở cuối địa chỉ I2C bảy bit, ngay trước bit Đọc/Ghi.

Với ba đầu vào địa chỉ có thể là CAO hoặc THẤP, ta có thể tạo tám địa chỉ khác nhau (2^3). Theo mặc định, cả ba đầu vào địa chỉ được kéo CAO bằng cách sử dụng pull-up tích hợp, đặt địa chỉ I2C mặc định của 24C32 là 1010111 Binary hoặc 0x57 Hex.

Bằng cách rút ngắn các jumper hàn, ta có thể kéo các đầu vào địa chỉ xuống THẤP, cho phép đặt địa chỉ I2C theo bảng dưới đây:

A2 A1 A0 Địa chỉ I2C (Binary) Địa chỉ I2C (Hex)
0 0 0 1010111 0x57
0 0 1 1010110 0x56
0 1 0 1010101 0x55
0 1 1 1010100 0x54
1 0 0 1010011 0x53
1 0 1 1010010 0x52
1 1 0 1010001 0x51

Xem ngay: Đồng hồ thời gian thực (Read Time Clock – DS1307) sử dụng Arduino

Giao tiếp I2C

Module này hỗ trợ giao tiếp I2C đơn giản và sử dụng hai địa chỉ. Địa chỉ I2C cố định cho chip DS3231S RTC là 0x68, trong khi địa chỉ I2C mặc định cho EEPROM là 0x57 (phạm vi địa chỉ từ 0x50 đến 0x57).

Các tín hiệu I2C SDA và SCL, cùng với VCC và GND, được chia ra mỗi bên của module để cho phép kết nối với các module khác.

Để đảm bảo giao tiếp ổn định, cả hai đường SDA và SCL đều có điện trở kéo lên 4,7K.

Thông số kỹ thuật

Operating Voltage 2.3 to 5.5V (3.3 or 5V typical)
Current Consumption < 300µA (typ.)
Accuracy (0-40°C) ± 2ppm
Battery CR2032 (3V Coin)

Datasheet

Sơ đồ chân Module RTC DS3231

32K: chân xuất ra đồng hồ tham chiếu chính xác (bù nhiệt độ) và ổn định.

INT/SQW: chân cung cấp tín hiệu ngắt (do điều kiện cảnh báo) hoặc đầu ra sóng vuông ở tần số 1Hz, 4kHz, 8kHz hoặc 32kHz.

SCL: là chân xung nhịp đồng hồ.

SDA: là chân dữ liệu.

VCC: là chân nguồn dương. Các bạn có thể cấp nguồn điện 3,3 đến 5V.

GND: là chân nối đất.

Sơ đồ đấu nối Module thời gian thực RTC DS3231 với Arduino

SCL SDA
Arduino Uno A5 A4
Arduino Nano A5 A4
Arduino Mega 21 20
Leonardo/Micro 3 2

Cài đặt thư viện uRTCLib

Khởi động IDE Arduino, chọn “Sketch” (Menu chính) -> “Include Library” -> “Manage Libraries…”.

Trong phần “Library Manager”, nhập vào ô tìm kiếm “uRTCLib”.

Khi thư viện “uRTCLib” hiển thị, chọn phiên bản mới nhất và nhấp vào nút “Install” để tiến hành cài đặt.

Code hiển thị đồng hồ thời gian thực

#include "Arduino.h"
#include "uRTCLib.h"

// uRTCLib rtc;
uRTCLib rtc(0x68);

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup() {
  Serial.begin(9600);
  delay(3000); // wait for console opening

  URTCLIB_WIRE.begin();

  // Comment out below line once you set the date & time.
  // Following line sets the RTC with an explicit date & time
  // for example to set January 13 2022 at 12:56 you would call:
   rtc.set(0, 56, 12, 5, 13, 1, 22);
  // rtc.set(second, minute, hour, dayOfWeek, dayOfMonth, month, year)
  // set day of week (1=Sunday, 7=Saturday)
}

void loop() {
  rtc.refresh();

  Serial.print("Current Date & Time: ");
  Serial.print(rtc.year());
  Serial.print('/');
  Serial.print(rtc.month());
  Serial.print('/');
  Serial.print(rtc.day());

  Serial.print(" (");
  Serial.print(daysOfTheWeek[rtc.dayOfWeek()-1]);
  Serial.print(") ");

  Serial.print(rtc.hour());
  Serial.print(':');
  Serial.print(rtc.minute());
  Serial.print(':');
  Serial.println(rtc.second());

  Serial.print("Temperature: ");
  Serial.print(rtc.temp()  / 100);
  Serial.print("\xC2\xB0");   //shows degrees character
  Serial.println("C");

  Serial.println();
  delay(1000);
}

Sau khi cấu hình xong, tiến hành nạp Code và xem thành quả nào.

Giải thích Code

#include "Arduino.h"
#include "uRTCLib.h"

Khai báo thư viện Arduino và thư viện uRTCLib để sử dụng các chức năng và đối tượng của đồng hồ thời gian thực RTC DS3231.

// uRTCLib rtc;
uRTCLib rtc(0x68);

Khai báo một đối tượng RTC với địa chỉ I2C là 0x68. Đây là địa chỉ I2C mặc định của module RTC DS3231.

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

daysOfTheWeek là một mảng chứa tên các ngày trong tuần.

void setup() {
  Serial.begin(9600);
  delay(3000); // wait for console opening

  URTCLIB_WIRE.begin();

  // Comment out below line once you set the date & time.
  // Following line sets the RTC with an explicit date & time
  // for example to set January 13 2022 at 12:56 you would call:
   rtc.set(0, 56, 12, 5, 13, 1, 22);
  // rtc.set(second, minute, hour, dayOfWeek, dayOfMonth, month, year)
  // set day of week (1=Sunday, 7=Saturday)
}

Hàm setup() được gọi một lần khi Arduino khởi động. Trong hàm này, ta khởi tạo việc giao tiếp I2C thông qua URTCLIB_WIRE.begin() và đặt ngày giờ của RTC bằng cách sử dụng hàm rtc.set().

void loop() {
  rtc.refresh();

  Serial.print("Current Date & Time: ");
  Serial.print(rtc.year());
  Serial.print('/');
  Serial.print(rtc.month());
  Serial.print('/');
  Serial.print(rtc.day());

  Serial.print(" (");
  Serial.print(daysOfTheWeek[rtc.dayOfWeek()-1]);
  Serial.print(") ");

  Serial.print(rtc.hour());
  Serial.print(':');
  Serial.print(rtc.minute());
  Serial.print(':');
  Serial.println(rtc.second());

  Serial.print("Temperature: ");
  Serial.print(rtc.temp()  / 100);
  Serial.print("\xC2\xB0");   //shows degrees character
  Serial.println("C");

  Serial.println();
  delay(1000);
}

Hàm loop() được thực hiện lặp lại code bên trong nó. Trong hàm này, ta thực hiện các bước sau:

  • Cập nhật lại thời gian hiện tại từ RTC bằng hàm rtc.refresh().
  • In ra Serial Monitor ngày, giờ, phút, giây và thứ của RTC.
  • In ra Serial Monitor nhiệt độ hiện tại của RTC.
  • Delay 1 giây trước khi lặp lại.

Bài viết liên quan

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments