Trong bài này chúng ta cùng nhau tìm hiểu cách lập trình stm32 với nút nhấn 3 chế độ click, double click và long click. Cách lập trình với các trạng thái của nút nhấn
Bài này nằm trong Serie Học STM32 từ A tới Z
Ý tưởng lập trình nút nhấn nhiều trạng thái
Chắc hẳn các bạn ai ai ở đây cũng đã sử dụng máy tính. Trên chuột máy tính có các nút left click và right click. Và ai cũng biết rằng chúng có 3 trạng thái: Click, double click và hold.
Tương ứng với ấn 1 lần, 2 lần và nhấn giữ.
Vậy làm như thế nào chúng ta có thể lập trình được như vậy?
Ý tưởng như sau:
Khi nút nhấn không bấm, chúng ở trạng thái rảnh IDLE
Khi nhấn nút lần đầu tiên, chúng sẽ ở trạng thái click. Sẽ có 2 trường hợp sảy ra
- nút nhấn được nhả ra
- nút nhấn được giữ( nút nhân đang ở trạng thái hold)
Nếu nút nhấn được nhả ra lại có 2 trường hợp sảy ra:
- Nút nhấn được bấm tiếp. Vậy thì lúc này chúng ta đã xác định được đây là double click
- Nút nhấn không được bấm. Chúng ta xác định được đây là single click
Nếu nút nhấn được giữ, chúng xa sẽ bắt đầu đếm xem giữ được bao nhiêu giây, nếu lớn hơn hoặc bằng thời gian đã định nghĩa (vd: 3giây). Thì Chúng ta đã xác định được đây là long click.
Để biểu diễn được các trạng thái nút nhấn một cách dễ hiểu, người ta sử dụng State machine.
States machine là gì
State machine là một cách thức lập trình theo mô hình quản lý quá trình chuyển đổi trạng thái của thiết bị. Với trạng thái máy, chúng ta sẽ tiếp cận vấn đề bằng cách chia quá trình vận hành của thiết bị thành các trạng thái, mỗi trạng thái gồm: Các hành động được thực hiện khi thiết bị ở trạng thái này, sự chuyển đổi trạng thái và điều kiện kích hoạt sự chuyển đổi trạng thái.
Minh sẽ có 1 bài nói chi tiết về States Machine trong lập trình nhúng
Trong ví dụ vế nút nhấn, chúng ta sẽ định nghĩa được các trạng thái của nút nhấn như sau:
- IDLE: Chưa được nhấn
- Click : Nhấn lần đầu
- Relese: Nhả nút nhấn
- 2nd Click: Click lần tiếp theo
Vậy các sự kiện để chuyển trạng thái như sau:
- IDLE – Click: Nhấn nút nhấn
- Click – Long Click: So sánh với thời gian 3s. Nếu trên 3s trả về long click
- Click – Release: Nhả nút nhấn
- Release – Single click: So sánh với time out click ( Nghĩa là trong thời gian này nếu ko được nhấn lần tiếp theo sẽ trả về kết quả Single Click)
- Release – 2nd Click: Nút được nhấn tiếp
- 2nd Click – Release: Nút nhấn được nhả ra. Trả về kết quả Double click.
Cứ như vậy bạn cũng có thể detect được các trạng thái tripble click, ….
Lập trình STM32 với nút nhấn
Khởi tạo nút nhấn ở PA0 và Led ở PC13. Làm như bài 3 STM32 GPIO led và nút nhấn nhé các bạn
Định nghĩa khoảng thời gian
Trong button.h mình sẽ định nghĩa các khoảng thời gian để chuyển trạng thái.
- DEBOUND_TIME tránh việc rung phím
- SINGLE_Click_Time là thời gian định nghĩa việc single click và long click
- Double_Click_Time là thời gian giữa 2 lần nhấn nút.
Sau đó định nghĩa kiểu enum các trạng thái của nút nhấn
Tiếp tới mình định nghĩa 1 struct để lưu port và pin nút nhấn. Trạng thái nút nhấn, các biến sự kiện để so sánh.
Lập trình STM32 tại các trạng thái
Trong hàm read chúng ta sẽ lần lượt kiểm tra từ trạng thái IDLE.
Nếu được nhấn, chương trình sẽ chạy xuống kiếm tra nút được nhả ra hay nhấn tiếp
Nếu nút được nhả ra, chúng ta kiểm tra tiếp trong khoảng thời gian Double_click_time có được nhấn tiếp không?
- Nếu được nhấn: Return double click
- Nếu không được nhấn: Chúng ta kiểm tra tiếp thời gian nhấn nút.nếu < Single click time. Return single click , nếu lớn hơn, return long click
Để tải full code các bạn đọc bài viết: Download tài liệu STM32 và down thư viện và lib example về nhé
Trong main các bạn khai báo nút nhấn, khởi tạo nút nhấn và led
Trong while chúng ta đọc trạng thái nút nhấn, sau đó lập trình nháy led tương ứng với mỗi trạng thái của nút.
Các bạn có thể dùng switch case để thay if else nếu nút nhiều trạng thái
Kết quả
Kết
Lập trình STM32 với nút nhấn có thể sử dụng nhiều phương pháp khác nhau. Đơn giản nhất chúng ta sử dụng while để chia thành các states, nhược điểm đó là trương trình có thể bị treo trong while, và sẽ làm chậm các tác vụ khác nếu không tối ưu về code.
Nhưng nó cũng rất đơn giản để các bạn hiểu thêm về khái niêm states machine trong lập trình nhúng
Nếu thấy bài viết này hay, hãy chia sẻ tới những người bạn học hay đồng nghiệp của mình. Và nếu thắc mắc điều gì, hãy để lại bình luận và cùng gia nhập những người anh em nghiện lập trình tại đây nhé: Hội anh em nghiện lập trình
Hi anh,
cảm ơn bài viết rất hay của anh. em đã làm theo và chạy đc, nhưng có 1 lỗi nhỏ, đó là trong hàm main em có sử dụng if status button giống anh thì sau khi vào rẽ nhánh double click thì sau đó nó vẫn tiếp tục vào rẽ nhánh single click. em debug thì lại ko bị hiện tượng đó. ko biết anh có bị hiện tượng này ko, mong anh chỉ giúp em lỗi sai.
thanks anh.
phần BUTTON_Init(&Button1,BUTTON_GPIO_Port ,BUTTON_Pin ); em nhâp vào toàn báo lỗi chố &Button1 em mông a chỉ cách sửa ạ
anh ơi a ra thêm nhiều bài hơn được không ạ. Đây là nguồn tư liệu quý báu cho bọn em học ạ tài vì nhiều kiến thức trường không đi sâu phải tự mò anh ak. Cảm ơn a nhiều
A sẽ cố gắng nhé