Hướng Dẫn Sử Dụng Module DS1307 RTC với Arduino Chi Tiết

Giới thiệu

Module TinyRTC DS1307 là một module thời gian thực (RTC - Real-Time Clock) được sử dụng phổ biến trong các ứng dụng điện tử và nhúng để theo dõi thời gian. DS1307 thường được sử dụng để cung cấp thông tin về ngày và giờ chính xác trong các hệ thống mà yêu cầu đồng bộ thời gian. 

1. Mô tả chung:

  • IC DS1307 giao tiếp I2C real-time clock chip (RTC)
  • Bộ nhớ 24C32 EEPROM I2C 32K
  • Sử dụng pin 2032 lithium
  • IC DS1307 không thể đọc, viết và lưu data khi không có pin
  • Sau khi sạc đầy, có thể sử dụng cho 1 năm
  • Kích thước: 27x28x8.4mm

2. Chức năng chính:

  • Thời gian chính xác: DS1307 giữ thông tin về ngày, giờ, phút và giây với độ chính xác tốt.
  • Ngày và tháng: Có khả năng xác định các thông tin về ngày, tháng, năm.
  • Calibration: Có thể được hiệu chỉnh để đảm bảo độ chính xác.

3. Cách sử dụng:

  • Giao tiếp I2C: Module DS1307 sử dụng giao tiếp I2C để kết nối với các vi điều khiển khác.
  • Đọc và ghi: Dữ liệu thời gian có thể được đọc và ghi thông qua các lệnh I2C.

4. Lưu ý:

  • Pin Backup Battery: DS1307 thường đi kèm với pin backup để duy trì thông tin thời gian khi nguồn cung cấp chính không có.
  • Độ chính xác: Thường đạt đến mức độ chính xác tốt, nhưng cũng có thể bị ảnh hưởng bởi nhiệt độ môi trường.

5. Ứng dụng:

  • Đồng hồ thời gian thực: DS1307 được sử dụng rộng rãi trong các ứng dụng cần giữ thông tin thời gian chính xác.
  • Logger thời gian: Trong các dự án ghi lại sự kiện theo thời gian.
  • Hệ thống đo độ chính xác thời gian: Ví dụ, trong các ứng dụng khoa học.

Khi sử dụng module DS1307, bạn cần kết hợp nó với các vi điều khiển và sử dụng thư viện I2C để truy cập và điều khiển thông tin thời gian của nó.

Hướng dẫn sử dụng với Arduino

Để sử dụng module TinyRTC DS1307 với Arduino, bạn cần thực hiện các bước sau:

1. Kết nối vật lý:

Kết nối module TinyRTC DS1307 với Arduino sử dụng giao diện I2C. Bạn có thể sử dụng chân A4 cho SDA và chân A5 cho SCL trên Arduino Uno.

  • VCC: Nối với 5V trên Arduino.
  • GND: Nối với GND trên Arduino.
  • SDA: Nối với chân A4 trên Arduino.
  • SCL: Nối với chân A5 trên Arduino.

2. Cài đặt thư viện:

Trước khi sử dụng DS1307, bạn cần cài đặt thư viện RTClib. Bạn có thể thực hiện điều này bằng cách mở Arduino IDE và điều hướng đến "Sketch" -> "Include Library" -> "Manage Libraries". Tìm kiếm "RTClib" và cài đặt thư viện được tạo bởi Adafruit.

3. Code mẫu:

Dưới đây là một đoạn mã mẫu để đọc và in ra màn hình Serial thời gian từ DS1307:

#include <Wire.h>
#include <RTClib.h>

RTC_DS1307 rtc;

void setup() {
  Serial.begin(9600);

  if (!rtc.begin()) {
    Serial.println("Không tìm thấy DS1307. Kiểm tra kết nối!");
    while (1);
  }
}

void loop() {
  DateTime now = rtc.now();

  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  delay(1000);
}

4. Chạy và kiểm tra:

  • Nạp chương trình lên Arduino.
  • Mở Serial Monitor (Tools -> Serial Monitor) để xem thời gian hiện tại được đọc từ DS1307.

Lưu ý rằng bạn cần chạy chương trình một lần để cài đặt thời gian cho DS1307 (nếu không nó đã bị mất điện). Sau khi đã cài đặt, DS1307 sẽ duy trì thời gian ngay cả khi bạn tắt nguồn Arduino.

Các hàm và chức năng trong thư viện RTClib adafruit dùng cho DS1307

Thư viện RTClib của Adafruit được sử dụng để làm việc với các mô-đun thời gian thực (RTC), trong trường hợp của bạn là DS1307. Dưới đây là một số hàm và chức năng quan trọng trong thư viện này:

  1. RTC_DS1307()
    • Hàm khởi tạo đối tượng RTC_DS1307, tạo một kết nối đến mô-đun DS1307.
RTC_DS1307 rtc;
  1. begin()
    • Hàm này được sử dụng để bắt đầu kết nối với mô-đun RTC và khởi động nó.
rtc.begin();
  1. adjust(DateTime dt)
    • Hàm này được sử dụng để cài đặt thời gian mới cho mô-đun RTC dựa trên giá trị của đối tượng DateTime.
DateTime newTime(2023, 12, 5, 12, 30, 0); // Thời gian mới
rtc.adjust(newTime);
  1. isrunning()
    • Hàm trả về true nếu mô-đun RTC đang chạy và false nếu không.
if (rtc.isrunning()) {
  Serial.println("RTC is running!");
} else {
  Serial.println("RTC is NOT running!");
  1. now()
    • Hàm này trả về thời gian hiện tại dưới dạng đối tượng DateTime. Đối tượng này có thể được sử dụng để trích xuất thông tin về ngày và giờ hiện tại.
DateTime now = rtc.now();
int year = now.year();
int month = now.month();
int day = now.day();
int hour = now.hour();
int minute = now.minute();
int second = now.second();
  1. dayOfTheWeek()
    • Hàm trả về chỉ số (0-6) của ngày trong tuần (Sunday là 0, Monday là 1, v.v.).
int dayOfWeek = now.dayOfTheWeek();
  1. temperature()
    • Hàm trả về nhiệt độ đo được từ cảm biến nhiệt độ bên trong mô-đun RTC (DS1307 không chứa cảm biến này, nhưng một số mô-đun khác có thể).
float temperature = rtc.temperature();
  1. setSquareWave()
    • Hàm này được sử dụng để cấu hình chế độ sóng vuông của mô-đun RTC.
rtc.setSquareWave(SquareWaveSQWAVE_1HZ);
  1. enable32kHzOutput()disable32kHzOutput()
    • Các hàm này được sử dụng để kích hoạt hoặc vô hiệu hóa đầu ra 32kHz của mô-đun RTC.
rtc.enable32kHzOutput();
rtc.disable32kHzOutput();
  1. readnvram(address, data, size)writenvram(address, data, size)
    • Đọc và ghi dữ liệu vào bộ nhớ eeprom trên mô-đun RTC.
byte dataToWrite[8] = {1, 2, 3, 4, 5, 6, 7, 8};
rtc.writenvram(0, dataToWrite, 8);

byte dataRead[8];
rtc.readnvram(0, dataRead, 8);

Các hàm Set, Set trong thư viện RTClib

Thư viện RTClib của Adafruit cung cấp một số hàm set và get để làm việc với thông tin thời gian. Dưới đây là một số hàm quan trọng:

Hàm Set:

  1. adjust(DateTime dt)
    • Đặt thời gian trên mô-đun RTC dựa trên giá trị của đối tượng DateTime.
    DateTime newTime(2023, 12, 5, 12, 30, 0); // Thời gian mới
    rtc.adjust(newTime);
    
  2. adjust(DateTime dt)
    • Đặt thời gian trên mô-đun RTC dựa trên giá trị của đối tượng DateTime.
    DateTime newTime(2023, 12, 5, 12, 30, 0); // Thời gian mới
    rtc.adjust(newTime);
    
  3. adjust(uint32_t t)
    • Đặt thời gian trên mô-đun RTC dựa trên giá trị thời gian Epoch (tính bằng giây từ 1970-01-01 00:00:00).
    rtc.adjust(1609459200); // 2021-01-01 00:00:00
    
  4. setHour(uint8_t h), setMinute(uint8_t m), setSecond(uint8_t s)
    • Cài đặt giờ, phút, giây riêng lẻ.
    rtc.setHour(12);
    rtc.setMinute(30);
    rtc.setSecond(0);
    

Hàm Get:

  1. now()
    • Trả về thời gian hiện tại dưới dạng đối tượng DateTime.
    DateTime currentTime = rtc.now();
    
  2. hour(), minute(), second()
    • Trả về giờ, phút, giây hiện tại.
    int currentHour = rtc.hour();
    int currentMinute = rtc.minute();
    int currentSecond = rtc.second();
    
  3. day(), month(), year()
    • Trả về ngày, tháng, năm hiện tại.
    int currentDay = rtc.day();
    int currentMonth = rtc.month();
    int currentYear = rtc.year();
    
  4. dayOfTheWeek()
    • Trả về chỉ số (0-6) của ngày trong tuần (Sunday là 0, Monday là 1, v.v.).
    int dayOfWeek = rtc.dayOfTheWeek();
    
  5. temperature()
    • Trả về nhiệt độ đo được từ cảm biến nhiệt độ bên trong mô-đun RTC.
    float temperature = rtc.temperature();
    

Các hàm này giúp bạn cài đặt và lấy thông tin thời gian từ mô-đun RTC một cách dễ dàng.

Video

Nhận xét

Mới hơn Cũ hơn