STM32 với nút nhấn 3 chế độ click, double click và long click.

stm32 voi nut nhan

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

states machine

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

stm32 nut nhan 1

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.

stm32 nut nhan 2

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

stm32 button

Để 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

khoi tao led và nút nhấn 1

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

stm32 nút nhấn main

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

5/5 - (3 bình chọn)

4 những suy nghĩ trên “STM32 với nút nhấn 3 chế độ click, double click và long click.

  1. nam nói:

    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.

  2. lương nói:

    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 ạ

  3. Nguyễn Quang Bách nói:

    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

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

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 *