[Matrix LED] Bài 6: Đồng hồ matrix 8×40 hiệu ứng lật trang đơn giản

clock matrix 8x40

Nếu như hiểu hết 5 bài trước thì chắc chắn các bạn đã có thể tự thiết kế đồng hồ matrix cho riêng mình rồi. Tuy nhiên bài này mình sẽ làm 1 demo nho nhỏ là đồng hồ matrix 8×40 có hiệu ứng lật trang đơn giản

Mình sẽ làm demo 1 cái đồng hồ có các chức năng cơ bản sau

  • Hiện thị giờ – phút – giây
  • Lật trang mỗi khi giây thay đổi
  • Cứ 20s sẽ chạy thứ ngày tháng năm 1 lần

Do nâng cấp thêm 1 con led matrix 8×8 nữa nên số độ phân giải bây giờ là 8×40. Mình sẽ thêm 1 chiều nữa cho bộ đệm hiển thị

Do đã thêm 1 led nên hàm ngắt hiển thị cũng sẽ bổ sung thêm 1 dòng gửi data ra nữa

Vậy là xong, còn lại hầu như không thay đổi gì so với bài trước

Do cần đọc thời gian nên ta sẽ phải giao tiếp với ic ds1307, tuy nhiên phạm trù tus này chỉ nói về code cho matrix và cách giao tiếp với ds1307 hay chuẩn I2C đã có rất nhiều trên mạng nên mình không đề cập đền nữa. Mình đã viết sẵn 1 thư viện ds1307 nên giờ chỉ cần gọi ra thôi

Trong thư viện này thì chỉ cần chú trọng vào 3 hàm cơ chính

Khai bảo mảng 7 phần tử lưu thời gian theo thứ tự
Giây, phút, giờ, thứ, ngày, tháng, năm
1 biến old_time để đựng giá trị giây trước đó ( mục đích phát hiện 1s đã trôi qua)
Và 1 mảng 30 phần tử lưu data chữ chạy ngày tháng năm

Xây dựng hàm in dữ liệu giờ – phút – giây ra màn hình

Hàm này có 1 giá trị nạp vào, nếu nạp vào 1 thì sẽ in cả giây ra, còn không thì in mỗi Giờ và phút thôi (để không anh hưởng đến hiệu ứng lật trang)

Xây dựng hàm lật trang cho giây

Hàm này cũng có 1 giá trị nạp vào, nếu nạp vào 1 thì lật cả 2 số hàng Chục và Đơn Vị. Ngược lại thì chỉ lật hàng đơn vị thôi

Việc lật trang sẽ có ba giai đoạn chính

  • Cuộn số cũ xuống vài dòng ( số mới chưa xuất hiện) ( h chạy từ 1 đến 5)
  • Vừa cuộn số cũ vữa cuốn số mới ( h chạy từ 5 đến 8 )
  • Cuộn số mới đến hết ( h chạy từ 8 đến 13 )

Do vậy mình khởi tạo 1 biến giây, mục đích là trừ nó đi 1 để nó thành số cũ. Nếu là 0 thì set thành 59. Các hàm bên trong vòng for thực thi việc in kí tự cũ và mới ra ở các vị trí trục Y khác nhau nên cao độ của chữ cũng sẽ thay đổi. Sau mỗi lần in mình delay cho mắt kịp nhìn và xóa hoàn toàn phần dữ liệu ở chỗ lật đi bằng hàm Matrix_clear. Sau đó tiền hành vẽ lại

Trong hàm main, trước khi nhảy vào while 1 sẽ cho đọc dữ liệu từ DS1307 ra bằng hàm DS1307_get_TIME_and_Date(time); và in toàn bộ Giờ – Phút – Giây ra bằng hàm display_Time(1); (tham số 1 ám chỉ in đẩy đủ cả Giờ – phút -giây)

Trong vòng lặp while, sử dụng biến old_time so sánh với time[0] ( giây mà mình đọc trong ds ra). Nếu khác nhau tức là giây dã thay đổi. Gọi hàm latgiay với tham số 0 nếu chỉ cần lật đơn vị, hoặc tham số 1 nếu muốn lật cả 2 chữ số ( bằng cách chia lấy dư cho 10)

Phần còn lại là kiểm tra nếu giây đạt các mốc 10 30 50 thì sẽ cho chạy thời gian thứ ngay tháng năm. Hàm sprintf sẽ đưa các dữ liệu thời gian vào mảng Date và chỉ việc in ra bằng vòng lặp for như bài trước là ta sẽ có hiệu ứng chạy chữ. ( trước và sau khi chạy sẽ clear hết màn đi để tránh các pixel không cần thiết vẫn bị sáng)

PS: Project này mình không sử dụng bộ đệm đôi, lí do phần mềm keilC của mình không phải bản quyền nên chỉ biên dịch được với 50% Ram. Dẫn tới k đủ Ram để chạy 2 bộ đệm. Các bạn hãy thư nâng cấp lên 2 bộ đệm để các hiệu ứng đẹp mắt nhất

File cho project này các bạn tải ở đây

Project đồng hồ matrix 8×40 này chưa có mode cài đặt thời gian. Các bạn tự phát triển các chức năng cần thiết cho mình nhé !

Giới thiệu Đào Nguyện 19 bài viết
DIY,chế cháo, viết blog chia sẽ kiến thức về lập trình,điện tử - IoT. Rất mong được giao lưu, kết bạn với các bạn cùng đam mê. Địa chỉ Facebook: https://www.facebook.com/nguyendao207

Hãy bình luận đầu tiên

Để lại một phản hồi

Thư điện tử của bạn sẽ không được hiện thị công khai.