Re: [請益] arduino Leonardo 當開關使用
看板Electronics作者yuleen123 (.......................)時間4年前 (2020/04/24 18:12)推噓0(0推 0噓 0→)留言0則, 0人參與討論串2/2 (看更多)
※ 引述《mOuOm (mOuOm)》之銘言:
: 我的開關設計很特別,當開關被按下不放時會模擬鍵盤送出某個特定按鍵訊號到電腦,類似usb keyboard的方式,這個目前都沒問題
: 我是用digitalread來讀取2號數位針腳有沒有接地的方式達成
: 但是想請教這邊的大神,有沒有方法可以在按下控制器按鍵時僅觸發一次,但是在控制器彈起時不會送訊號到電腦,直到下次在被按壓時才會再次觸發,想來想去還是沒有想到合適的方法,目前先用delay時間來控制
: 更新一下
: 後來用了其他寫法來達成我的需求,目前運作沒毛病,但偶爾在放開開關時會出現按壓的情況
: 不確定是不是線路雜訊造成
: 我開關設置距離較遠,目前用網路線加上微動開關連接pin2跟GND來當作開關
因為開關訊號會有彈跳的情況, 像下圖這樣
https://i.imgur.com/7KNPedn.png
如果在硬體上沒有對訊號做濾波的話, 就要在軟體中加上 debounce 處理
#define DEBOUNCE_TIME 3
int pin_state[DEBOUNCE_TIME];
void setup()
{
int init_state = digitalRead(2);
for(int i = 0; i < DEBOUNCE_TIME; i++)
pin_state[i] = init_state;
}
void main()
{
int new_state = digitalRead(2);
int debounce_result = 0;
for(int i = 0; i < DEBOUNCE_TIME-1; i++) {
pin_state[i] = pin_state[i+1];
debounce_result += pin_state[i];
}
pin_state[DEBOUNCE_TIME-1] = new_state;
debounce_result += new_state;
if(debounce_result == 0) {
// 連續 DEBOUNCE_TIME 次讀到 0(LOW) 才做處理
// 送出 keyboard 訊號
}
// 每 10ms 讀取一次訊號
delay_ms(10);
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.38.58.253 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Electronics/M.1587723146.A.7FD.html
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):