Nút ấn nhận quá nhiều sự kiện


12

Tôi đang viết một máy nghe nhạc mp3 ghi thông tin vào màn hình LCD, tôi muốn chuyển đổi nó từ sử dụng bàn phím sang sử dụng các nút ấn nhưng tôi liên tục nhận được quá nhiều lần nhấn phím. Tôi đã thử kéo lên và giảm / tăng cạnh nhưng tôi vẫn nhận được kết quả tương tự. Bất cứ ai cũng biết nếu đây là một vấn đề đã biết hoặc tôi chỉ đang làm gì đó sai? Ồ, tôi cũng đang làm điều này hoàn toàn bằng C bằng cách sử dụng hệ thống dây điện.


1
Chỉ cần thêm vào nồi các giải pháp phần mềm, hãy kiểm tra người bạn của chúng tôi trong bộ điều khiển vi mô. arduino.cc/en/Tutorial/Debounce
Cammy_the_block

Đây là một đoạn trích từ một cái gì đó tôi đã viết một lúc trước. if(digitalRead(data) && millis()-startTime > 10){và đặt startTime bao giờ hết khi vào vòng lặp.
Cammy_the_block

chỉ thắc mắc; Chính xác thì tôi sẽ đặt startTime thành gì?
linuxgnuru

Một số bộ đếm thời gian sắp xếp. Arduino có chức năng millis cho thời gian kể từ khi bắt đầu.
Cammy_the_block

À, vậy thì, hệ thống dây điện cũng vậy, hệ thống
linuxgnuru

Câu trả lời:


12

Các nút và công tắc cơ có thể bị nảy do chuyển đổi khi chúng chuyển đổi nhanh giữa mở và đóng trong vài mili giây.

Bạn có thể thử gỡ nút / chuyển đổi trong phần mềm hoặc phần cứng.

Có lẽ đơn giản nhất trong phần mềm.

Nếu mức độ thay đổi (bật sang tắt hoặc tắt sang bật), đợi x mili giây và đọc lại gpio. Nếu nó vẫn ở trạng thái mới thì giả sử đó là một quá trình chuyển đổi thực sự. Giá trị của x có thể là khoảng 20.

Đối với các giải pháp phần cứng hãy tìm loại bài đăng này


8

Dành thời gian để đọc hướng dẫn thảo luận của Jack Ganssle . Trang đầu tiên minh họa vấn đề rất chi tiết và cách thứ hai để giải quyết vấn đề này trong phần cứng hoặc phần mềm. Không có phương pháp gỡ lỗi 'hoàn hảo', nhưng có rất nhiều phương pháp xấu!

Đây là một vấn đề bạn sẽ gặp phải nhiều lần nếu giao tiếp phần mềm với các công tắc, vì vậy, đáng để dành thời gian để hiểu nó và bài viết của Jack là cách ngắn gọn nhất mà tôi từng thấy để làm điều đó.


2

Trong các ứng dụng có mã hệ thống, tôi thường thực hiện đăng ký thay đổi.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

if (button_checker == 0xFF) 
{ 
    // button was pressed 
}

Tất nhiên, bạn chỉ nên thực hiện các sự kiện nhấn nút trên một cạnh tăng.


1
Đó là một phương pháp thú vị. Dễ dàng tùy chỉnh (bằng cách che đi các bit quan trọng nhất của button_checker) để yêu cầu số lần đọc liên tiếp khác nhau.
joan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.