• HOME
  • DỰ ÁN & MẠCH ĐIỆN
    • Lập trình
      • ARDUINO PROJECT
      • ESP8266 PROJECT
      • ESP32 PROJECT
      • RASPBERRY PI PROJECT
      • Vi điều khiển
    • Điện tử ứng dụng
      • Audio / Amplifiers
      • Nguồn điện
      • Pin sạc/Acquy và mạch sạc
      • Biến đổi AC và DC
      • Robotic
      • Cảm biến
      • LED
      • LCD
      • Động cơ bước
      • Mạch linh tinh
      • Test & Measurement
      • RF – FM
    • Nixie Clock
    • HOME AUTOMATION
    • Dân dụng
    • Công nghiệp
  • KIẾN THỨC CĂN BẢN
    • Điện tử cơ bản
    • Điện tử số
    • PCB
    • Nixie Tube
    • Raspberry Pi
    • Vi điều khiển
    • Arduino
    • IN 3D
  • DOWNLOAD
    • Phần mềm điện tử
    • Giáo trình
      • Giáo trình Điện – Điện tử
      • Giáo trình Tự Động Hóa
      • Giáo trình Viễn thông
    • Đề tài
      • Đề tài – Điện – Điện Tử
      • Đề tài – Tự Động Hóa
      • Đề tài – Viễn thông
    • Điện tử ứng dụng
    • Tài liệu nước ngoài
    • Hướng dẫn, sửa chữa
    • Sơ đồ, nguyên lý thiết bị
    • Tiêu chuẩn – Đo lường – Thử nghiệm
    • Datasheet
  • LIÊN HỆ
  • SẢN PHẨM

Mạch Điện Lý Thú

Sơ đồ nguyên lý, PCB, đồ án, tài liệu, DIY

Trang chủ » DỰ ÁN & MẠCH ĐIỆN » Lập trình » ARDUINO PROJECT » Hiển thị thời gian thực lên LCD 20×4 I2C dùng Arduino

Hiển thị thời gian thực lên LCD 20×4 I2C dùng Arduino

30/05/2025 by admin Để lại bình luận

Đã đượ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

Mục lục hiện
MODULE
TEST LCD 20×4
Sơ đồ nguyên lý
Code
Giải thích
Hiển thị ngày và giờ lên LCD
Sơ đồ nguyên lý
Code
DOWNLOAD
Module màn hình LCD 2004 có gắn thêm bộ chuyển đổi I2C

Đâ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.

Tổng quan LCD 16x2 và giao tiếp I2C LCD sử dụng Arduino
Module I2C LCD

Để 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 thời gian thực DS3231

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

NewliquidCrystal_1.3.4

RTC

DS1307RTC-master

LCDExample

Nguồn: electronics-lab.com

  • Share on Facebook
  • Tweet on Twitter

Thuộc chủ đề:ARDUINO PROJECT, LCD Tag với:arduino, code, DS3231, lcd, LCD2004

Bài viết trước « Hướng dẫn nạp chương trình trên Arduino IDE
Bài viết sau Đồng hồ dùng GLCD Homephone V2.0 – Gà mổ thóc »

Reader Interactions

Để lại một bình luận Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Sidebar chính

Zalo hỏi đáp 24/7

Theo dõi qua mạng xã hội

  • Facebook

Bạn đang tìm gì?

Bài viết mới nhất

Các loại nguồn xung thông dụng và nguyên lý hoạt động

Các loại nguồn xung thông dụng và nguyên lý hoạt động

15/06/2025

Relay điện tử - Sử dụng TRIAC để đóng cắt thiết bị

Relay điện tử – Sử dụng TRIAC để đóng cắt thiết bị

15/06/2025

Mạch ổn áp cố định, IC ổn áp

Mạch ổn áp cố định, IC ổn áp

15/06/2025

Giám sát nhiệt độ, độ ẩm (DHT11) thông qua Thingspeak bằng NodeMCU ESP8266

15/06/2025

Phát hiện mưa (Rain Sensor) sử dụng NodeMCU ESP8266

15/06/2025

Danh mục

  • DỰ ÁN & MẠCH ĐIỆN (241)
    • Công nghiệp (16)
    • Dân dụng (29)
    • Điện tử ứng dụng (178)
      • Audio / Amplifiers (34)
      • Biến đổi AC và DC (24)
      • Cảm biến (40)
      • Động cơ bước (5)
      • Kiểm thử và đo đạc (23)
      • LCD (15)
      • LED (20)
      • Mạch linh tinh (27)
      • Nguồn điện (42)
      • Pin sạc/Acquy và mạch sạc (24)
      • RF – FM (5)
      • Robotic (2)
    • HOME AUTOMATION (23)
    • Lập trình (82)
      • ARDUINO PROJECT (39)
      • ESP32 PROJECT (6)
      • ESP8266 PROJECT (17)
      • RASPBERRY PI PROJECT (9)
      • Vi điều khiển (24)
    • Nixie Clock (3)
  • Kiến thức căn bản (170)
    • Arduino (36)
    • Điện tử cơ bản (77)
    • Điện tử số (9)
    • IN 3D (9)
    • Nixie Tube (13)
    • PCB (18)
    • Raspberry Pi (10)
    • Vi điều khiển (16)

Footer

Bài viết mới nhất

  • Các loại nguồn xung thông dụng và nguyên lý hoạt động
  • Relay điện tử – Sử dụng TRIAC để đóng cắt thiết bị
  • Mạch ổn áp cố định, IC ổn áp
  • Giám sát nhiệt độ, độ ẩm (DHT11) thông qua Thingspeak bằng NodeMCU ESP8266
  • Phát hiện mưa (Rain Sensor) sử dụng NodeMCU ESP8266
  • Điều khiển thiết bị thông qua Cayenne Mydevices và NodeMCU ESP8266

Bình luận mới nhất

  • admin trong Nguyên lý cảm biến siêu âm chống nước JSN-SR04T và sơ đồ mạch
  • Rohan trong Nguyên lý cảm biến siêu âm chống nước JSN-SR04T và sơ đồ mạch
  • Tên gì kệ tui trong Mạch Ampli 19W dùng IC LA4440
  • admin trong Đồng hồ số hiển thị trên LED 7 đoạn dùng 89S52 và DS1307

Tìm kiếm

Tất cả nội dung trên website chỉ dùng để tham khảo. Chúng tôi không chịu trách nhiệm về thông tin thành viên đăng tải lên website và xóa bài viết khi có vi phạm bản quyền tác giả.