Đã được đăng vào 01/06/2021 @ 17:16
Ở bài viết trước, mình đã hướng dẫn các bạ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
Bài viết hôm nay cũng hướng dẫn các bạn hiển thị thời gian thực lên LCD qua I2C bằng Arduino nhưng khác ở chỗ dùng LCD 2004 (LCD 20×4) và dùng module thời gian độ chính xác cao DS3231.
Để 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
MODULE

Đây là màn hình tinh thể lỏng với 4 dòng và 20 ô hiển thị trên mỗi dòng nhưng không thể hiển thị được đồ họa (Ví dụ như vẽ đồ thị).
Ban đầu, màn hình có 16 pin nhưng sau khi lắp Module LCD I2C chuyển đổi thì chỉ còn lại 2 chân nguồn và 2 chân tín hiệu SCL SDA để kết nối với Arduino dễ dàng hơn.

Để hiển thị thời gian chính xác, module thời gian thực DS3231 được sử dụng ở bài viết này.
Module DS3231 có độ chính xác rất cao và có kèm pin dự phòng khi mất điện, thiết bị vẫn duy trì chính xác thời gian.

Module RTC sẽ duy trì thông tin giây, phút, giờ, ngày, tháng, và năm. Các ngày trong tháng, ngày kết thúc của tháng sẽ được tự động điều chỉnh nếu 31 ngày hoặc dưới 31 ngày, bao gồm cả các điều chỉnh cho năm nhuận.
TEST LCD 20×4
Đầu tiên, chúng ta sẽ kết nối màn hình LCD với Arduino để hiển thị một số mẫu văn bản và tìm hiểu cách hoạt động của nó
Sơ đồ nguyên lý
Kết nối chân GND với chân Arduino GND, VCC với chân 5V trên Arduino, SDA với chân A4, và cuối cùng là SCL với chân A5.
Code
Trước tiên, chúng ta cần tải xuống thư viện của màn hình, bao gồm tất cả các chức năng cần thiết để cấu hình và ghi dữ liệu. Bạn có thể tải ở đây.
Giải nén thư viện và copy nó vào thư mục thư viện của Arduino trong Document.
Copy toàn bộ code dưới đây vào Arduino IDE và chạy thử.
//Written by Nick Koumaris //info@educ8s.tv //educ8s.tv #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address void setup() { lcd.begin(20,4); // Initialize LCD lcd.setCursor(3,0); // Set the cursor at the 4th column and 1st row lcd.print("Hello YouTube!"); lcd.setCursor(8,1); // Set the cursor at the 9th column and 2nd row lcd.print("****"); lcd.setCursor(0,2); // Set the cursor at the 1st column and 3rd row lcd.print("This is a demo text"); lcd.setCursor(8,3); // Set the cursor at the 9th column and 4th row lcd.print("****"); } void loop() { }
Giải thích
lcd.setCursor(3,0);
Đoạn code trên dùng để đặt con trỏ của màn hình LCD ở vị trí được chỉ định. Ở đây là đặt con trỏ ở cột thứ 4 – hàng thứ nhất.
lcd.print(" ");
Đoạn này sẽ hiển thị văn bản trong dấu nháy kép ra màn hình tại vị trí con trỏ hiện tại, hãy chú ý vì các ký tự bị tràn (Vượt quá 20 ô) sẽ bị loại bỏ.
Hiển thị ngày và giờ lên LCD
Bây giờ chúng ta sẽ sử dụng mô-đun RTC với màn hình LCD để hiển thị ngày và giờ hiện tại
Sơ đồ nguyên lý
Chân SCL của LCD sẽ nối chung với chân SCL của module thời gian DS3231 và kết nối với chân A5 của mạch Arduino.
Tương tự, chân SDA của 2 module trên cũng sẽ nối với chân A4 của mạch Arduino.
Code
Trước khi bắt đầu, chúng ta phải tải xuống thư viện RTC và cài đặt thời gian cho module DS3231 (Module khi mới mua thời gian đang bị sai). Thư viện có sẵn tại github.
Giải nén thư viện và copy nó vào thư mục thư viện của Arduino trong Document.
Mở Arduino IDE -> Examples. Chọn ‘setTime’ từ thư viện DS1307.
Cuối cùng upload code vào module RTC DS3231 được kết nối thông qua Arduino và nó sẽ đặt thời gian của module RTC trùng khớp với thời gian trên máy tính.
Bên trong hàm loop, thời gian được đọc ra từ module RTC và đưa ra hiển thị ngoài màn hình.
Bây giờ chúng ta sẽ giải thích từng phần code nhé!
Đầu tiên, gọi ra 3 thư viện: I2C, LCD và RTC và cài đặt địa chỉ của LCD.
Sau hàm khởi tạo cho LCD, hàm createCustomCharacters() được gọi ra và xuất ra màn hình.
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <DS1307RTC.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address void setup() { lcd.begin(20,4); createCustomCharacters(); printFrame(); }
Mỗi ký tự có chiều rộng tối đa 5 pixel và chiều cao 8 pixel. Vì vậy, để tạo một ký tự tùy chỉnh, chúng ta cần tạo một byte mới.
Bên trong hàm createCustomCharacters(), chúng ta gọi hàm lcd.createChar(#, byte array)
Màn hình LCD hỗ trợ tối đa 8 ký tự tùy chỉnh được đánh số từ 0 đến 7.
byte verticalLine[8] = { B00100, B00100, B00100, B00100, B00100, B00100, B00100, B00100 }; byte char2[8] = { B00000, B00000, B00000, B11100, B00100, B00100, B00100, B00100 }; byte char1[8] = { B00000, B00000, B00000, B00111, B00100, B00100, B00100, B00100 }; byte char3[8] = { B00100, B00100, B00100, B00111, B00000, B00000, B00000, B00000 }; byte char4[8] = { B00100, B00100, B00100, B11100, B00000, B00000, B00000, B00000 }; void createCustomCharacters() { lcd.createChar(0, verticalLine); lcd.createChar(1, char1); lcd.createChar(2, char2); lcd.createChar(3, char3); lcd.createChar(4, char4); }
Sau khi chuẩn bị các ký tự, bây giờ chúng ta sẽ tạo khung.
Hàm này rất đơn giản, nó sử dụng hàm lcd.setCursor (#, #) để di chuyển con trỏ và lcd.print (“”) để hiển thị chuỗi ra LCD.
Hàm sẽ hiển thị ra LCD các dòng ngang trên cùng và dưới cùng, sau đó đến các ký tự tùy chỉnh khác.
void printFrame() { lcd.setCursor(1,0); lcd.print("------------------"); lcd.setCursor(1,3); lcd.print("------------------"); lcd.setCursor(0,1); lcd.write(byte(0)); lcd.setCursor(0,2); lcd.write(byte(0)); lcd.setCursor(19,1); lcd.write(byte(0)); lcd.setCursor(19,2); lcd.write(byte(0)); lcd.setCursor(0,0); lcd.write(byte(1)); lcd.setCursor(19,0); lcd.write(byte(2)); lcd.setCursor(0,3); lcd.write(byte(3)); lcd.setCursor(19,3); lcd.write(byte(4)); }
Như chúng ta đã thảo luận trước đó, mỗi giây hàm loop sẽ lấy thông số ngày – giờ và làm mới chúng trên màn hình.
Đầu tiên, chúng ta xác định phần tử thời gian “tm” có chứa dữ liệu thời gian hiện tại. Nếu thời gian là chính xác và mô-đun RTC hoạt động tốt thì ngày và giờ sẽ được xuất ra ngoài LCD.
void loop() { tmElements_t tm; if (RTC.read(tm)) { printDate(5,1,tm); printTime(6,2,tm); } else { if (RTC.chipPresent()) { //The DS1307 is stopped. Please run the SetTime } else { //DS1307 read error! Please check the circuitry } delay(9000); } delay(1000); }
Hàm PrintTime sử dụng ba đối số, cột và dòng nơi nó sẽ hiển thị thời gian lên LCD và phần tử thời gian.
Hàm lcd.print (tm.Hour) sẽ hiển thị giờ lên LCD, nếu phút và giây nhỏ hơn 10 chúng ta sẽ thêm số 0 vào bên trái. Phương pháp tương tự được sử dụng để hiển thị ngày.
void printTime(int character,int line, tmElements_t tm) { String seconds,minutes; lcd.setCursor(character,line); lcd.print(tm.Hour); lcd.print(":"); if(tm.Minute<10) { minutes = "0"+String(tm.Minute); lcd.print(minutes); }else { lcd.print(tm.Minute); } lcd.print(":"); if(tm.Second<10) { seconds = "0"+String(tm.Second); lcd.print(seconds); }else { lcd.print(tm.Second); } } void printDate(int character,int line, tmElements_t tm) { lcd.setCursor(character,line); lcd.print(tm.Month); lcd.print("/"); lcd.print(tm.Day); lcd.print("/"); lcd.print(tmYearToCalendar(tm.Year)); }
Mọi thứ đã sẵn sàng, hãy nạp code vào Arduino của bạn và tận hưởng đồng hồ mới.
Bạn có thể tải code và thư viện Arduino trong các tệp đính kèm bên dưới.
DOWNLOAD
Nguồn: electronics-lab.com
Trả lời