Giao tiếp module thời gian thực DS1307 với Arduino

0
5018
Hiển thị thời gian thực trên LCD dùng Arduino và DS1307

Trong bài viết này, chúng ta sẽ tìm hiểu về đồng hồ thời gian thực (RTC – Real Time Clock) và cách giao tiếp Arduino với module thời gian thực DS1307.

Đồng hồ thời gian thực hay RTC (Real Time Clock) là một thiết bị định thời gian, thường được chế tạo dưới dạng IC. IC RTC chạy bằng pin và theo dõi thời gian hiện tại ngay cả khi không có điện.

IC đồng hồ thời gian thực có mặt trong máy tính, máy chủ (server), các hệ thống nhúng và trên thực tế, chúng được sử dụng ở bất cứ đâu, những nơi cần thông tin thời gian chính xác.

Tại sao chúng ta cần đồng hồ thời gian thực (RTC)?

Mặc dù Arduino và hầu hết tất cả các bộ vi điều khiển đều có bộ định thời (timer) và bộ định thời gian (hàm millis () trong trường hợp Arduino) nhưng chúng phụ thuộc vào nguồn điện, tức là chúng chỉ hoạt động khi có nguồn cung cấp. Sau khi tắt nguồn (theo cách thủ công hoặc do mất điện), tất cả bộ định giờ được reset về 0.

Mặc dù việc định thời gian bằng bộ định thời tích hợp sẵn được chấp nhận cho các ứng dụng đơn giản, nhưng một số trường hợp khác chúng ta cần một giải pháp thay thế trong các ứng dụng như bộ ghi dữ liệu, đồng hồ, báo thức, v.v.. trong đó bộ đếm thời gian chạy độc lập bất kể nguồn điện bên ngoài hoặc nếu bộ vi điều khiển (hoặc Arduino) được lập trình lại.

Khi nói đến việc sử dụng IC thời gian thực. Hầu hết tất cả các IC RTC đều là các thiết bị dòng điện thấp chạy trong nhiều năm trên một pin lithium duy nhất (thường là CR2032). Một trong những IC RTC phổ biến và được sử dụng phổ biến nhất là DS1307.

Giới thiệu IC thời gian thực DS1307

IC thời gian thực (RTC) DS1307 có chức năng cung cấp thông tin thời gian hiện tại (thời gian thực): giờ, phút, giây, thứ, ngày tháng, năm một cách chính xác ngay cả khi thiết bị đã bị tắt (ngắt điện ngoài). Giao tiếp với vi điều khiển thông qua chuẩn I2C, và đóng vai trò là slave khi kết nối đến bus I2C này. Có thể đếm thời gian theo định dạng 24 giờ hoặc 12 giờ với chỉ thị AM/PM. Ngoài ra bên trong chíp có bộ dò phát hiện mất nguồn và tự động chuyển sang sử dụng nguồn pin dự phòng. Một số tính năng nổi bật của IC RTC DS1307 được đề cập dưới đây.

  • Lưu trữ và cung cấp các thông tin thời gian thực: ngày, tháng, năm, giờ, phút, giây,…
  • Khả năng thiết lập ngày đến năm 2100.
  • Tiêu thụ điện năng thấp: dòng tiêu thụ dưới 500nA khi hoạt động bằng pin.
  • Tự động chuyển sang nguồn pin trong trường hợp mất điện.
  • Đồng hồ 24 giờ hoặc 12 giờ với chỉ báo AM/PM.
  • Sử dụng chuẩn giao tiếp I2C.

Download datasheet DS1307 tại đây.

RTC DS1307 có sẵn dưới dạng module, bao gồm tất cả các thành phần cần thiết như pin, đầu nối, điện trở kéo lên và tinh thể thạch anh. Một module như vậy được sử dụng trong bài hướng dẫn này và được hiển thị bên dưới.

Module thời gian thực RTC DS1307

Sơ đồ chân DS1307

Hình ảnh sau đây cho thấy hình dạng và sơ đồ chân của IC RTC DS1307. Để giảm công suất tiêu thụ, số lượng chân trên IC phải giảm. Do đó, DS1307 RTC sử dụng Giao tiếp I2C.

Xem thêm bài viết: Giới thiệu chuẩn giao tiếp I2C

Chân Tên Chức năng
1 X1 Đây là các chân kết nối với thạch anh tần số 32.768 KHz để kích hoạt bộ dao động nội. 
2 X2
3 VBAT Chân này được kết với cực dương pin Lithium 3V để cấp nguồn nuôi dự phòng 
4 GND Chân nối đất
5 SDA Chân dữ liệu nối tiếp (Serial Data). Đây là chân dữ liệu vào/ra của giao thức I2C. Chân này cần đưa lên nguồn 5V thông qua điện trở 10kΩ
6 SCL Chân đầu vào xung đồng hồ nối tiếp (Serial Clock). Đây là chân ngõ vào xung nhịp của giao thức I2C. Chân này cũng phải được kéo đến 5V thông qua một điện trở 10kΩ.
7 SQW/OUT Ngõ xuất ra xung vuông, tần số có thể lập trình để thay đổi từ 1Hz, 4Khz, 8Khz, 32Khz. Nếu không được sử dụng, chân này có thể được thả nổi.
8 VCC Chân cấp nguồn chính, khoảng 5VDC. Nếu VCC không có mà VBAT có thì DS1307 vẫn hoạt động bình thường nhưng không ghi và đọc được dữ liệu.

Giao tiếp Arduino với DS1307

Linh kiện cần thiết

STT Tên linh kiện Số lượng
1 Arduino Uno 1
2 Module RTC DS1307 1
3 LCD 16×2 1
4 Breadboard 1
5 Dây cắm breadboard  
6 Nguồn cấp điện  

Chúng ta đã tìm hiểu một chút về IC thời gian thực DS1307. Bây giờ, chúng ta sẽ tiến hành với giao tiếp Arduino với IC thời gian thực. Như đã đề cập trước đó, module DS1307 RTC sử dụng giao tiếp I2C.

Trong mạch giao tiếp này, vi điều khiển Arduino luôn hoạt động như Master và DS1307 hoạt động như Slave. Master trong giao tiếp I2C, tức là Arduino trong trường hợp này, chịu trách nhiệm về tín hiệu đồng hồ, truy cập bus, các tín hiệu start và stop.

Sơ đồ nguyên lý

Hình ảnh sau đây cho thấy sơ đồ mạch giao tiếp giữa IC thời gian thực DS1307 và Arduino. Mạch này cho thấy các kết nối cơ bản liên quan đến module DS1307 (một board mạch chứa IC DS1307 cùng với thạch anh, pin, điện trở kéo lên, ..).

Hiển thị thời gian thực lên LCD dùng DS1307 và Arduino

Để hiểu rõ hơn về module DS1307 RTC, hình ảnh sau đây sẽ giúp bạn vì nó chứa mạch của module thời gian thực DS1307 điển hình.

Hoạt động của mạch

Một ứng dụng đơn giản trong đó Arduino UNO được giao tiếp với module thời gian thực DS1307 để hiển thị ngày giờ lên màn hình LCD. Trong ứng dụng này, chúng ta sẽ lập trình cho DS1307 RTC với ngày giờ hiện tại và xem liệu nó có thực sự giữ dữ liệu đó hay không ngay cả khi nguồn cung cấp cho Arduino bị loại bỏ.

Một thư viện đặc biệt được gọi là “RTClib” được sử dụng trong chương trình. Các bạn có thể tải xuống từ liên kết này. Đảm bảo rằng thư viện được tải xuống trước và được thêm vào cơ sở dữ liệu thư viện Arduino.

Để nạp dữ liệu và thời gian vào IC DS1307 RTC, chúng ta sẽ sử dụng một tính năng có sẵn trong thư viện RTClib, nơi Arduino sẽ tải ngày và giờ từ máy tính lên ngay khi chương trình được nạp vào.

Chương trình

// Chương trình hiển thị thời gian thực trên LCD dùng module RTC DS1307

#include <Wire.h>

#include <LiquidCrystal.h>

#include “RTClib.h”

RTC_DS1307 rtc;

LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (rs, e, d4, d5, d6, d7)

char daysOfTheWeek[7][12] = {“Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”};

void setup ()

{

  Serial.begin(9600);

  lcd.begin(16, 2);

  if (! rtc.begin())

  {

    lcd.print(“Khong the tim thay RTC”);

    while (1);

  }

  if (! rtc.isrunning())

  {

    lcd.print(“RTC khong hoat dong!”);

  }

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

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

}

void loop ()

{

    DateTime now = rtc.now();

    lcd.setCursor(0, 1);

    lcd.print(now.hour());

    lcd.print(‘:’);

    lcd.print(now.minute());

    lcd.print(‘:’);

    lcd.print(now.second());

    lcd.print(”   “);

    lcd.setCursor(0, 0);

    lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);

    lcd.print(” ,”);

    lcd.print(now.day());

    lcd.print(‘/’);

    lcd.print(now.month());

    lcd.print(‘/’);

    lcd.print(now.year());

}

Ứng dụng

Với sự trợ giúp của giao tiếp đồng hồ thời gian thực và Arduino, chúng ta có thể thực hiện một số ứng dụng liên quan đến ghi dữ liệu, báo thức, đồng hồ, v.v.
Vì module RTC DS1307 được hỗ trợ cấp nguồn bằng pin nên nó sẽ tiếp tục duy trì thời gian ngay cả trong trường hợp mất điện.

BÌNH LUẬN

Vui lòng nhập bình luận của bạn
Vui lòng nhập tên của bạn ở đây