Step 3: Interfacing LCD
In the schematic diagram LCD is interfaced using only 3 pins.I had used 3 pin interface board to connect LCD to arduino.This interface board has shift register.Generally we interface LCD using atleast 6 pins.This is an old method.The new method to connect LCD is using 3 pin interface board.If you don’t have this interface board,you can make it on your own.Click on below link to know how to create it.
Lời kết
Bài viết khá dài nên mình sẽ tạm dừng ở đây, trong bài viết tiếp theo mình sẽ hướng dẫn các bạn cách hiển thị thời gian thực DS1307 lên màn hình LCD16X2 các bạn đón xem nhé.
Tham gia cộng đồng Arduino KIT Để nhận được nhiều kiến thức bổ ích, các bạn Đăng ký để nhận thông báo khi có bài viết mới nhé. Tham gia Cộng đồng Arduino KIT để cùng nhau thảo luận và chia sẽ kiến thức về lập trình Arduino. Nếu các bạn thấy bài viết bổ ích nhớ Like và Share cho mọi người cùng học nhé. |
Chúc các bạn thành công.
Trân trọng.
Giải thích code
Trong bài viết Đồng hồ thời gian thực (Read Time Clock – DS1307) sử dụng Arduino mình đã giải thích rất chi tiết cách hoạt động của hàm các bạn xem lại bài viết để có thể hiểu hơn nhé.
Nguồn: arduinokit.vn
Đồng hồ thời gian thực (Read Time Clock – DS1307) sử dụng Arduino
Đồng hồ thời gian thực hay còn gọi với cái tên là Read Time Clock sử dụng Module DS1307. Được sử dụng rất phổ biến trong các ứng dụng của Arduino.
Để có thể làm việc với module này chúng ta cần sử dụng một chuẩn giao tiếp cũng khá quen thuộc là I2C Bus.
Để các bạn có thể hiểu rõ hơn chúng ta đi ngay vào bài viết nhé.
Xem thêm: Hướng dẫn sử dụng Module thời gian thực RTC DS3231 với Arduino
Lời kết
Tham gia cộng đồng Arduino KIT Để nhận được nhiều kiến thức bổ ích, các bạn Đăng ký để nhận thông báo khi có bài viết mới nhé. Tham gia Cộng đồng Arduino KIT để cùng nhau thảo luận và chia sẽ kiến thức về lập trình Arduino. Nếu các bạn thấy bài viết bổ ích nhớ Like và Share cho mọi người cùng học nhé. |
Chúc các bạn thành công.
Trân trọng.
Đã được đăng vào 11/12/2019 @ 12:00
Sơ đồ đấu nối
Arduino UNO | Module RTC DS1307 |
GND | GND |
5V | GND |
A4 | SDA |
A5 | SCL |
Các linh kiện cần thiết cho dự án:
Tên linh kiện | Số lượng | Shopee |
Arduino Uno R3 | Mua ngay | |
Cáp nạp | Mua ngay | |
RTC DS1307 | Mua ngay | |
Dây cắm (Đực – Cái) | Mua ngay |
Bạn sẽ học được gì
- Có kiến thức cơ bản về Robotics
- Chế tạo Robot dò đường thông minh
- Đánh thức nhà khoa học bên trong bạn
- Tìm hiểu thêm về Robotics, các thuật toán Robot tự động
- Kiến thức nền tảng để chế tạo các máy móc tự động phục vụ đời sống sinh hoạt, lao động sản xuất
- Kiến thức để chế tạo sản phẩm, tham gia các cuộc thi khoa học công nghệ trong nước và quốc tế
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ài viết hôm trước mình đã hướng dẫn các bạn cách sử dụng Module thời gian thực RTC DS1307 và cách hiển thị ký tự lên màn hình LCD 16×2 bằng giao tiếp I2C.
Tiếp tục trong chuỗi bài viết về LCD hôm nay mình sẽ hướng dẫn các bạn làm thế nào để hiển thị thời gian lên LCD16x2.
Để hiểu hơn về bài viết hôm nay các bạn đọc lại bài viết bên dưới rồi chúng ta tiếp tục nha.
Code mẫu
#include
#include#include “RTClib.h” RTC_DS1307 rtc; LiquidCrystal_I2C lcd(0x3F,16,2); char daysOfTheWeek[7][12] = {“Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”}; void setup () { Serial.begin(9600); lcd.init(); lcd.backlight(); if (! rtc.begin()) { lcd.print(“Couldn’t find RTC”); while (1); } if (! rtc.isrunning()) { lcd.print(“RTC is NOT running!”); } rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));//auto update from computer time //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));// to set the time manualy } void loop () { DateTime now = rtc.now(); lcd.setCursor(4, 1); if(now.hour()<=9) { lcd.print(“0”); lcd.print(now.hour()); } else { lcd.print(now.hour()); } lcd.print(‘:’); if(now.minute()<=9) { lcd.print(“0”); lcd.print(now.minute()); } else { lcd.print(now.minute()); } lcd.print(‘:’); if(now.second()<=9) { lcd.print(“0″); lcd.print(now.second()); } else { lcd.print(now.second()); } lcd.print(” “); lcd.setCursor(1, 0); lcd.print(daysOfTheWeek[now.dayOfTheWeek()]); lcd.print(“,”); if(now.day()<=9) { lcd.print(“0”); lcd.print(now.day()); } else { lcd.print(now.day()); } lcd.print(‘/’); if(now.month()<=9) { lcd.print(“0”); lcd.print(now.month()); } else { lcd.print(now.month()); } lcd.print(‘/’); if(now.year()<=9) { lcd.print(“0”); lcd.print(now.year()); } else { lcd.print(now.year()); } }
Step 5: Displaying in LCD
Upload this code to display in LCD and i have also attached the program code for download.
Program Code
#include
#include
#include
LiquidCrystal_SR lcd(6,5,9);
// Pin 6 – Data Enable/ SER, Pin 5 – Clock/SCL, Pin 9 -SCK
#define Display_Clock_Every_N_Seconds 10
#define Display_ShortHelp_Every_N_Seconds 60
String tz;
int hours = 0;
int minutes = 0;
int seconds = 0;
int dates = 0;
int months = 0;
int years = 0;
int ap = 0;
void setup()
Serial.begin(9600);
lcd.begin(16,2);
pinMode(A3, OUTPUT);
digitalWrite(A3, HIGH);
pinMode(A2, OUTPUT);
digitalWrite(A2, LOW);
void loop()
RTC.readClock();
ap = RTC.isPM();
if(ap == 1)
tz = “PM”;
else
tz =”AM”;
lcd.home();
hours = RTC.getHours();
minutes = RTC.getMinutes();
seconds = RTC.getSeconds();
dates = RTC.getDate();
months = RTC.getMonth();
years = RTC.getYear();
lcd.print(hours);
lcd.print(“:”);
lcd.print(minutes);
lcd.print(“:”);
lcd.print(seconds);
lcd.print(” “);
lcd.print(tz);
lcd.setCursor(0, 1);
lcd.print(dates);
lcd.print(“:”);
lcd.print(months);
lcd.print(“:”);
lcd.print(years);
delay(250);
lcd.clear();
lcd.home();
lcd.print(hours);
lcd.print(” “);
lcd.print(minutes);
lcd.print(” “);
lcd.print(seconds);
lcd.print(” “);
lcd.print(tz);
lcd.setCursor(0, 1);
lcd.print(dates);
lcd.print(” “);
lcd.print(months);
lcd.print(” “);
lcd.print(years);
delay(250);
lcd.clear();
Tư vấn: 0979.466.469 / 0938.128.290 Email: [email protected]
Xây dựng Đồng hồ thời gian thực bằng Arduino và Mô-đun RTC DS1307 Ghi chú về Mô-đun RTC DS1307
Trong bài viết này, chúng ta sẽ xây dựng Đồng hồ thời gian thực Arduino sử dụng Mô-đun RTC DS1307 và mô-đun LCD 16 × 2 để hiển thị. Trước hết, chúng ta hãy xem cách giao diện Module RTC với Arduino. Có nhiều loại mô-đun RTC khác nhau có sẵn trên thị trường. Chúng tôi đang sử dụng mô-đun RTC phổ biến nhất có tên là IC DS1307, một mô-đun LCD và Arduino Uno cho hướng dẫn này. Giao tiếp một mô-đun RTC với Arduino khá đơn giản. Bạn chỉ cần thực hiện 2 kết nối giữa mô-đun RTC và Arduino. Vì vậy, chúng ta hãy bắt đầu kinh doanh!
Mô-đun Đồng hồ thời gian thực về cơ bản là một thiết bị theo dõi thời gian cung cấp ngày và giờ hiện tại. Mô-đun RTC đi kèm với IC DS3231 có chức năng đặt báo động.
Ở đây chúng tôi đang sử dụng một mô-đun RTC với chip đồng hồ DS1307 dựa trên giao thức I2C (Two Wire Protocol). Mô-đun cung cấp thông tin chi tiết như giây, phút, giờ, ngày trong tuần, ngày trong tháng, tháng và năm bao gồm cả hiệu chỉnh cho năm nhuận. Nó có thể hoạt động ở định dạng 12 giờ hoặc 24 giờ. Mức tiêu thụ hiện tại của mô-đun này là dải nano ampe. Ngay cả pin 3V cũng có thể cung cấp năng lượng cho nó trong 10 năm để duy trì đồng hồ chính xác mà không cần bất kỳ nguồn điện bên ngoài nào. DS1307 có vùng nhớ 64 byte, trong đó 8 byte đầu tiên được dành riêng làm vùng thanh ghi RTC và 56 byte còn lại được phân bổ làm RAM cho mục đích chung. Các chi tiết về ngày và giờ hiện tại được lưu trữ trong khu vực đăng ký của nó dưới dạng Số thập phân được mã hóa nhị phân. Mô-đun giao tiếp với vi điều khiển bằng giao thức truyền thông nối tiếp được gọi là I2C.Bus I2C về mặt vật lý bao gồm 2 dây hoạt động. Các dây, được gọi là SDA và SCL, đều là hai chiều. SDA là dòng Dữ liệu nối tiếp và SCL là dòng Serial CLock. Mọi thiết bị kết nối với bus đều có địa chỉ thiết bị duy nhất của nó, bất kể đó là MCU hay mô-đun RTC. Mỗi chip này có thể hoạt động như một bộ thu hoặc phát, tùy thuộc vào chức năng.
DS1307 sẽ hoạt động như nô lệ trong mạng truyền thông và bộ điều khiển chỉ có thể truy cập phụ kiện bằng cách khởi tạo điều kiện khởi động cùng với địa chỉ thiết bị. Sau đó, chúng ta cần gửi số đăng ký để truy cập giá trị bên trong. Giao diện với Arduino là I2C đơn giản với các chân SDA và SCL được kết nối với các chân I2C tương ứng của arduino. Ở phía phần mềm, chúng tôi đang sử dụng một thư viện arduino có tên là “Wire” để giao tiếp I2C. Thư viện này cho phép bạn giao tiếp với các thiết bị I2C / TWI.
Tôi hy vọng bạn đã hiểu cho đến nay! Hãy đến với sơ đồ mạch! Vì vậy, dưới đây là sơ đồ mạch để kết nối mô-đun RTC với Arduino.
#include
#include
#define DS1307_ADDRESS 0x68
LiquidCrystal lcd(13,12,11,10,9,8);
boolean MODE = false;
byte Dec_To_BCD(byte dec){
return( (dec/10*16) + (dec%10) );
byte BCD_To_Dec(byte BCD){
return( (BCD/16*10) + (BCD%16) );
void Mode12(){
MODE=true;
void Mode24(){
MODE=false;
void setTime(byte SEC, byte MIN, byte HOUR, byte DOW, byte DOM, byte MONTH, byte YEAR)
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0);
Wire.write(Dec_To_BCD(SEC));
Wire.write(Dec_To_BCD(MIN));
Wire.write(Dec_To_BCD(HOUR));
Wire.write(Dec_To_BCD(DOW));
Wire.write(Dec_To_BCD(DOM));
Wire.write(Dec_To_BCD(MONTH));
Wire.write(Dec_To_BCD(YEAR));
Wire.endTransmission();
void getTime(byte *SEC, byte *MIN, byte *HOUR)
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
*SEC = BCD_To_Dec(Wire.read()&0x7f);
*MIN = BCD_To_Dec(Wire.read());
*HOUR = BCD_To_Dec(Wire.read()&0x3f);
void getDate(byte *DOM, byte *MONTH, byte *YEAR)
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(4);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
*DOM = BCD_To_Dec(Wire.read());
*MONTH = BCD_To_Dec(Wire.read());
*YEAR = BCD_To_Dec(Wire.read());
byte getWeek()
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(3);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
return(BCD_To_Dec(Wire.read()));
String getTimeStr()
String ALL;
byte SEC, MIN, HOUR,AM_PM;
getTime(&SEC, &MIN, &HOUR);
if(!MODE)
if (HOUR<10)
ALL=String(‘0’)+String(HOUR, DEC)+String(‘:’);
else
ALL=String(HOUR, DEC)+String(‘:’);
if (MIN<10)
ALL+=String(‘0’);ALL+=String(MIN, DEC);
ALL+=String(‘:’);
if (SEC<10)
ALL+=String(‘0’);ALL+=String(SEC, DEC);
else
AM_PM=HOUR;
if(HOUR>12)
HOUR-=12;
if (HOUR<10)
ALL=String(‘0’)+String(HOUR, DEC)+String(‘:’);
else
ALL=String(HOUR, DEC)+String(‘:’);
if (MIN<10)
ALL+=String(‘0’);ALL+=String(MIN, DEC);
ALL+=String(‘:’);
if (SEC<10)
ALL+=String(‘0’);ALL+=String(SEC, DEC);
ALL+=String(‘ ‘);
if(AM_PM>12)ALL+=String(“PM”);
else ALL+=String(“AM”);
return(ALL);
String getDateStr()
String ALL;
byte DOM, MONTH, YEAR;
getDate(&DOM, &MONTH,&YEAR);
if (DOM<10)
ALL+=String(‘0’);ALL+=String(DOM, DEC);
ALL+=String(‘/’);
if (MONTH<10)
ALL+=String(‘0’);ALL+=String(MONTH, DEC);
ALL+=String(‘/’);ALL+=String(YEAR, DEC);
ALL+=String(‘ ‘);
return(ALL);
String getWeekStr()
String ALL;
switch(getWeek())
case 1:ALL+=String(“Sunday”);break;
case 2:ALL+=String(“Monday”);break;
case 3:ALL+=String(“Tuesday”);break;
case 4:ALL+=String(“Wednesday”);break;
case 5:ALL+=String(“Thursday”);break;
case 6:ALL+=String(“Friday”);break;
case 7:ALL+=String(“Saturday”);break;
return(ALL);
void setup()
lcd.begin(16,2);
Wire.begin();
setTime(10,33,13,12,11,10,17);
void loop()
///// 24hr MODE /////
lcd.clear();
lcd.setCursor(0,0);
Mode24();
lcd.print(getTimeStr());lcd.print(‘ ‘);
lcd.setCursor(0,1);
lcd.print(getDateStr());lcd.print(‘ ‘);
lcd.print(getWeekStr());
delay(5000);
///// 12hr MODE /////
lcd.clear();
lcd.setCursor(0,0);
Mode12();
lcd.print(getTimeStr());lcd.print(‘ ‘);
lcd.setCursor(0,1);
lcd.print(getDateStr());lcd.print(‘ ‘);
lcd.print(getWeekStr());
delay(5000);
Chúng tôi bắt đầu đưa thư viện LiquidCrystal vào chương trình. Trong dòng tiếp theo, chúng tôi tạo một phương thức khởi tạo của Liduidcrysal với tên lcd và chúng tôi chuyển các số pin kỹ thuật số làm tham số. Định dạng thực tế giống như SoftwareSerial lcd (RS, EN, D4, D5, D6, D7); Bạn sẽ biết thêm chi tiết về giao diện LCD trong bài viết “Giao diện LCD với Arduino”.
Ở đây chúng tôi đang tập trung chủ yếu vào giao diện mô-đun RTC. Như đã đề cập trước đó, một thư viện có tên “Wire” được sử dụng ở đây cho giao tiếp I2C. Hàm Wire.begin () sẽ khởi tạo thư viện dây. Vì nó được sử dụng để khởi tạo thư viện, nó chỉ cần được gọi khi bắt đầu. Wire.beginTransmission () là hàm được sử dụng để gửi địa chỉ thiết bị. Sau đó với Wire.write (), chúng ta sẽ gửi số thanh ghi có giá trị mà chúng ta cần truy cập.
Hàm Wire.endTransmission () sẽ kết thúc quá trình truyền. Hàm Wire.requestFrom () được sử dụng bởi master để yêu cầu byte từ mô-đun. Wire.read () sẽ đọc một byte được truyền từ thiết bị phụ đến Arduino sau một cuộc gọi tới requestFrom ().
Trong DS1307, các byte được lưu trữ dưới dạng số thập phân được mã hóa nhị phân. Vì vậy, trước khi ghi các giá trị vào các thanh ghi, chúng ta cần chuyển nó thành BCD (Số thập phân được mã hóa nhị phân). Giống như khôn ngoan, sau khi đọc các giá trị từ vùng đăng ký, nó nên được chuyển đổi thành số thập phân. Dec_To_BCD () và BCD_To_Dec () là các hàm được sử dụng cho việc này.
Trước khi đọc các giá trị từ mô-đun RTC, chúng ta phải đặt ngày và giờ cùng một lúc. Hàm được sử dụng cho việc này là hàm setTime (). Chúng ta nên chuyển các chi tiết thời gian thực tế làm thông số. Định dạng thực tế giống như setTime (giây, phút, giờ, xuống, dom, tháng, năm); .
Ở đây chúng tôi đang sử dụng DS1307 ở chế độ 24 giờ. Và sau đó chuyển nó thành chế độ 12 giờ ở phía phần mềm. Vì vậy, chi tiết thời gian phải ở chế độ 24 giờ trong khi truyền các đối số cho hàm setTime (). Sau khi tải lên chương trình cùng một lúc, bạn nên tải lại mã bằng cách nhận xét hàm setTime (). Nếu không, hàm setTime () sẽ làm hỏng thời gian hiện tại trong khi bạn đặt lại Arduino.
getTime (), getDate (), getWeek () là các hàm được sử dụng để truy cập bảy thanh ghi dữ liệu trong DS1307. Hàm getTime () sẽ cung cấp chi tiết giờ phút và giây. getDate () cho biết ngày, tháng và năm. Và getWeek () sẽ trả về ngày trong tuần. Chúng cung cấp dữ liệu dưới dạng số thập phân. Vì vậy, chúng ta nên chuyển đổi nó sang định dạng thời gian và dưới dạng chuỗi có thể sử dụng. getTimeStr () là hàm sẽ trả về thời gian hiện tại dưới dạng một chuỗi đơn. Giống như khôn ngoan, getDateStr () sẽ trả về ngày hiện tại và getWeekStr () sẽ trả về ngày trong tuần dưới dạng chuỗi.
Bạn có thể hiển thị thời gian hiện tại trên màn hình LCD bằng cách chỉ cần gọi hàm getTimeStr () bên trong lcd.print (). Ví dụ: lcd.print (getTimeStr ()); .
Mode12 () và Mode24 () là các chức năng chuyển đổi chế độ hiển thị thời gian. Nếu bạn muốn hiển thị thời gian hiện tại ở chế độ 12 giờ, bạn nên gọi hàm Mode12 () trước khi sử dụng getTimeStr (). Nếu bạn có bất kỳ nghi ngờ nào, vui lòng hỏi trong phần bình luận.
Code: M-7006-030 Còn hàng
Code: 7004-022 Còn hàng
Code: M-7006-015 Còn hàng
Code: 7006-031 Còn hàng
Hotline: 0979 466 469
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.
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 |
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. | |
X2 | ||
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 | |
GND | Chân nối đất | |
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Ω | |
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Ω. | |
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. | |
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 |
Arduino Uno | ||
Module RTC DS1307 | ||
LCD 16×2 | ||
Breadboard | ||
Dây cắm breadboard | ||
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ể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
#include
#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.
Step 1: Components Required
Microcontroller
- Arduino Nano
LCD
- 16 x 2 LCD
LCD interfacing board
- Three pin LCD interface Board
RTC Module
- DS 1307 I2C RTC
Wires
- Female to Female jumper wire ——-9
Introduction: Interfacing DS1307 I2C RTC With Arduino
In this tutorial i am going to show how to easily make a digital clock using DS1307 RTC module.RTC is Real Time Clock.Real time clock is used to keep record off time and to display time.It is used in many digital electronics devices like computers, electronics watches, date loggers and situation where you need to keep track of time.The advantage of real time clock is that it keeps record of time if the power is also not available.RTC has a CMOS battery.This CMOS battery is used to keep record of time when the power not available.This RTC will keep record of time for years without power since it uses very less power.
Code mẫu RTC DS1307
#include
#include#include “RTClib.h” RTC_DS1307 rtc; LiquidCrystal_I2C lcd(0x3F,16,2); char daysOfTheWeek[7][12] = {“Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”}; void setup () { Serial.begin(9600); lcd.init(); lcd.backlight(); if (! rtc.begin()) { lcd.print(“Couldn’t find RTC”); while (1); } if (! rtc.isrunning()) { lcd.print(“RTC is NOT running!”); } rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));//auto update from computer time //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));// to set the time manualy } void loop () { DateTime now = rtc.now(); lcd.setCursor(4, 1); if(now.hour()<=9) { lcd.print(“0”); lcd.print(now.hour()); } else { lcd.print(now.hour()); } lcd.print(‘:’); if(now.minute()<=9) { lcd.print(“0”); lcd.print(now.minute()); } else { lcd.print(now.minute()); } lcd.print(‘:’); if(now.second()<=9) { lcd.print(“0″); lcd.print(now.second()); } else { lcd.print(now.second()); } lcd.print(” “); lcd.setCursor(1, 0); lcd.print(daysOfTheWeek[now.dayOfTheWeek()]); lcd.print(“,”); if(now.day()<=9) { lcd.print(“0”); lcd.print(now.day()); } else { lcd.print(now.day()); } lcd.print(‘/’); if(now.month()<=9) { lcd.print(“0”); lcd.print(now.month()); } else { lcd.print(now.month()); } lcd.print(‘/’); if(now.year()<=9) { lcd.print(“0”); lcd.print(now.year()); } else { lcd.print(now.year()); } }
Step 4: Setting the Time and Date in RTC
Upload the below code to set time and date.Uploading this code will load the time and date to RTC from your computer.After uploading the code open serial monitor to see the time and date.
NOTE
Don’t use latest version of arduino IDE for programming.If you use latest arduino IDE, you cannot set time and date in RTC.You also need to add some libraries if you use latest IDE.I found problem with the latest arduino IDE.I strongly recommend to use arduino 1.6.1 IDE version.If you use this version you no need to add libraries because all the libraries were inbuilt in this version.I have also attached the libraries for latest arduino IDE users.
Program Code
#include
#include “RTClib.h”
RTC_DS1307 RTC;
void setup ()
Serial.begin(9600);
Wire.begin();
RTC.begin(); // load the time from your computer.
if (! RTC.isrunning())
Serial.println(“RTC is NOT running!”);// This will reflect the time that your sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
void loop ()
DateTime now = RTC.now();
Serial.print(now.month(), DEC);
Serial.print(‘/’);
Serial.print(now.day(), DEC);
Serial.print(‘/’);
Serial.print(now.year(), 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);
Hiển thị thời gian thực lên LCD16x2 sử dụng module RTC DS1307
Màn hình LCD 16×2 | Arduino UNO R3 |
GND | GND |
VCC | 5V |
SDA | A4/SDA |
SCL | A5/SCL |
Module RTC DS1307 | |
GND | GND |
VCC | 5V |
SDA | A4/SDA |
SCL | A5/SCL |
Linh kiện cần thiết cho dự án
Tên linh kiện | Số lượng |
Arduino Uno R3 | |
Module RTC DS1307 | |
Màn hình LCD 16×2 | |
Module I2C LCD 16×2 | |
Dây cắm |
Thư viện
- Thư viện hỗ trợ sử dụng module RTC DS1307: Tải ngay.
- Thư viện hỗ trợ sử dụng màn hình LCD I2C: Tải 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ài viết hôm trước mình đã hướng dẫn các bạn cách sử dụng Module thời gian thực DS1307 và cách hiển thị ký tự lên màn hình LCD 16×2 bằng giao tiếp I2C.
Tiếp tục trong chuỗi bài viết về LCD hôm nay mình sẽ hướng dẫn các bạn làm thế nào để hiển thị thời gian lên LCD16x2.
Để hiểu hơn về bài viết hôm nay các bạn đọc lại bài viết bên dưới rồi chúng ta tiếp tục nha.
- Đọc thêm: Tổng quan LCD 16×2 và giao tiếp I2C LCD sử dụng Arduino
- Đọc thêm: Đồng hồ thời gian thực (Read Time Clock – DS1307) sử dụng Arduino
Hiển thị thời gian thực lên LCD16x2 sử dụng module RTC DS1307
Màn hình LCD 16×2 | Arduino UNO R3 |
GND | GND |
VCC | 5V |
SDA | A4/SDA |
SCL | A5/SCL |
Module RTC DS1307 | |
GND | GND |
VCC | 5V |
SDA | A4/SDA |
SCL | A5/SCL |
Linh kiện cần thiết cho dự án
Tên linh kiện | Số lượng |
Arduino Uno R3 | |
Module RTC DS1307 | |
Màn hình LCD 16×2 | |
Module I2C LCD 16×2 | |
Dây cắm |
Thư viện
- Thư viện hỗ trợ sử dụng module RTC DS1307: Tải ngay.
- Thư viện hỗ trợ sử dụng màn hình LCD I2C: Tải ngay.
Giải thích code
RTC_DS1307 rtc; char daysOfTheWeek[7][12] = {“Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”};
Ban đầu chúng ta tạo một đối tượng của thư viện RTClib là rtc và xác định mảng ký tự daysOfTheWeek để lưu trữ thông tin ngày trong tuần.
Hàm rtc.begin() và rtc.isrunning()
Hàm rtc.begin() là hàm khởi tạo để đảm bảo module RTC được kết nối.
Hàm rtc.isrunning() là hàm đọc các thanh ghi bên trong I2C của DS1307 để kiểm tra xem chip có trả về thời gian hay không.
Nếu hàm trả về giá trị False thì đặt lại thời gian.
Hàm rtc.adjust()
Hàm rtc.adjust() là hàm đặt ngày và giờ.
Chúng ta có 2 cách đặt ngày giờ:
- DateTime(F(__DATE__), F(__TIME__)) cách này chúng ta cập nhật thời gian tự động từ máy tính.
- DateTime(YYY, M, D, H, M, s) cách này chúng ta thiết lập giờ thủ công.
Ví dụ: Đặt ngày 12 tháng 5 năm 2019 vào lúc 14:07 thì chúng ta sẽ gọi hàm DateTime(2019, 5, 12, 14, 07, 00).
Một số hàm khác:
Hàm rtc.now() | Trả về ngày & giờ hiện tại. Giá trị trả về của nó thường được lưu trữ trong biến của kiểu dữ liệu DateTime. |
Hàm year() | Trả về năm hiện tại. |
Hàm month() | Trả về tháng hiện tại. |
Hàm day() | Trả về ngày hiện tại. |
Hàm daysOfTheWeek() | Trả về ngày hiện tại trong tuần. |
Hàm hour() | Trả về giờ hiện tại. |
Hàm minute() | Trả về phút hiện tại. |
Hàm second() | Trả về giây hiện tại. |
Code:
#include
#include#include “RTClib.h” RTC_DS1307 rtc; char daysOfTheWeek[7][12] = {“Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”}; void setup () { Serial.begin(9600); if (! rtc.begin()) { Serial.print(“Couldn’t find RTC”); while (1); } if (! rtc.isrunning()) { Serial.print(“RTC is NOT running!”); Serial.println(); } rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); } void loop () { DateTime now = rtc.now(); if(now.hour()<=9) { Serial.print(“0”); Serial.print(now.hour()); } else { Serial.print(now.hour()); } Serial.print(‘:’); if(now.minute()<=9) { Serial.print(“0”); Serial.print(now.minute()); } else { Serial.print(now.minute()); } Serial.print(‘:’); if(now.second()<=9) { Serial.print(“0”); Serial.print(now.second()); } else { Serial.print(now.second()); } Serial.println(); Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); Serial.print(“,”); if(now.day()<=9) { Serial.print(“0”); Serial.print(now.day()); } else { Serial.print(now.day()); } Serial.print(‘/’); if(now.month()<=9) { Serial.print(“0”); Serial.print(now.month()); } else { Serial.print(now.month()); } Serial.print(‘/’); if(now.year()<=9) { Serial.print(“0”); Serial.print(now.year()); } else { Serial.print(now.year()); } Serial.println(); delay(1000); }
Hiển thị thời gian thực lên LCD16x2 sử dụng module RTC DS1307
Màn hình LCD 16×2 | Arduino UNO R3 |
GND | GND |
VCC | 5V |
SDA | A4/SDA |
SCL | A5/SCL |
Module RTC DS1307 | |
GND | GND |
VCC | 5V |
SDA | A4/SDA |
SCL | A5/SCL |
Linh kiện cần thiết cho dự án
Tên linh kiện | Số lượng | Shopee |
Arduino Uno R3 | Mua ngay | |
Cáp nạp | Mua ngay | |
Module RTC DS1307 | Mua ngay | |
Màn hình LCD 16×2 | Mua ngay | |
Module I2C LCD 16×2 | Mua ngay | |
Dây cắm (Đực – Cái) | Mua ngay |
Thư viện
- Thư viện hỗ trợ sử dụng module RTC DS1307: Tải ngay.
- Thư viện hỗ trợ sử dụng màn hình LCD I2C: Tải ngay.
Code mẫu RTC DS1307
#include
#include#include “RTClib.h” RTC_DS1307 rtc; LiquidCrystal_I2C lcd(0x3F,16,2); char daysOfTheWeek[7][12] = {“Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”}; void setup () { Serial.begin(9600); lcd.init(); lcd.backlight(); if (! rtc.begin()) { lcd.print(“Couldn’t find RTC”); while (1); } if (! rtc.isrunning()) { lcd.print(“RTC is NOT running!”); } rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));//auto update from computer time //rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));// to set the time manualy } void loop () { DateTime now = rtc.now(); lcd.setCursor(4, 1); if(now.hour()<=9) { lcd.print(“0”); lcd.print(now.hour()); } else { lcd.print(now.hour()); } lcd.print(‘:’); if(now.minute()<=9) { lcd.print(“0”); lcd.print(now.minute()); } else { lcd.print(now.minute()); } lcd.print(‘:’); if(now.second()<=9) { lcd.print(“0″); lcd.print(now.second()); } else { lcd.print(now.second()); } lcd.print(” “); lcd.setCursor(1, 0); lcd.print(daysOfTheWeek[now.dayOfTheWeek()]); lcd.print(“,”); if(now.day()<=9) { lcd.print(“0”); lcd.print(now.day()); } else { lcd.print(now.day()); } lcd.print(‘/’); if(now.month()<=9) { lcd.print(“0”); lcd.print(now.month()); } else { lcd.print(now.month()); } lcd.print(‘/’); if(now.year()<=9) { lcd.print(“0”); lcd.print(now.year()); } else { lcd.print(now.year()); } }
Bạn sẽ học được gì
- Có kiến thức cơ bản về Robotics
- Chế tạo Robot dò đường thông minh
- Đánh thức nhà khoa học bên trong bạn
- Tìm hiểu thêm về Robotics, các thuật toán Robot tự động
- Kiến thức nền tảng để chế tạo các máy móc tự động phục vụ đời sống sinh hoạt, lao động sản xuất
- Kiến thức để chế tạo sản phẩm, tham gia các cuộc thi khoa học công nghệ trong nước và quốc tế
Lời kết
Tham gia cộng đồng Arduino KIT Để nhận được nhiều kiến thức bổ ích, các bạn Đăng ký để nhận thông báo khi có bài viết mới nhé. Tham gia Cộng đồng Arduino KIT để cùng nhau thảo luận và chia sẽ kiến thức về lập trình Arduino. Nếu các bạn thấy bài viết bổ ích nhớ Like và Share cho mọi người cùng học nhé. |
Chúc các bạn thành công.
Trân trọng.
-
- Tổng tiền thanh toán:
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
27/05/2021
Real Time Clock DS1307(RTC)
Module DS1307 là một trong những module RTC giá cả phải chăng và được sử dụng phổ biến nhất. Nó có thể theo dõi chính xác giây, phút, giờ, ngày, tháng và năm.
Một số tính năng quan trọng của DS1307 là:
- Khả năng tạo sóng vuông có thể lập trình.
- Dòng điện thấp, dưới 500mA trong chế độ sao lưu pin.
- Khả năng thiết lập ngày đến năm 2100.
- Sử dụng chuẩn giao tiếp I2C.
Module DS1307 sử dụng pin CR2023 3 volt. Bộ nhớ EEPROM 24c32 nhúng trên mô-đun này có thể tiết kiệm 32kb dữ liệu.
Ngoài ra, các bạn có thể đo nhiệt độ môi trường bằng cách sử dụng cảm biến DS18B20 đã được tích hợp sẵn trên board mạch.
Đọc giá trị điện áp của pin từ chân BAT.
Các chân chức năng:
PIN | Chức năng |
VCC | Cấp nguồn từ 3.3V – 5.5V |
GND | Nối vào cực âm của mạch |
SCL | |
SDA | |
DS |
- Các bạn tải và cài đặt thư viện hỗ trợ sử dụng Module RTC DS1307: Tại đây
- Xem thêm: Hướng dẫn cách cài thư viện trên Arduino IDE.
Keywords searched by users: ds1307 lcd i2c arduino
Categories: Chia sẻ 72 Ds1307 Lcd I2C Arduino
See more here: kientrucannam.vn
See more: https://kientrucannam.vn/vn/