因为按键是基于弹簧-阻尼系统的机械部件,因此当按下一个按键时,读到的信号并非从低到高,而是在高低电平之间跳动几毫秒以后才最终稳定。git
1 const int LED = 9; 2 const int BUTTON = 2; 3 boolean lastButton = LOW; 4 boolean currentButton = HIGH; 5 boolean ledOn = false; 6 7 // The setup() function runs once each time the micro-controller starts 8 void setup() 9 { 10 pinMode(LED, OUTPUT); 11 pinMode(LED, INPUT); 12 } 13 14 /* 15 * 消抖动函数:传入前一个按键状态,返回当前消抖动的按键状态 16 * - 这里所谓的消抖动,实际上就是若是检测到电压变化后先不操做,由于多是抖动阶段的 17 * 电压改变,等5m以后(等电平稳定下来)再读取当前值,避开抖动阶段。 18 * - 若是没有使用消抖动函数,在抖动的过程当中电压屡次变化,会获得不少次“按钮按下”的 19 * 结论,从而形成短期内频繁的开灯关灯。 20 */ 21 boolean debounce(boolean last) { 22 boolean current = digitalRead(BUTTON); 23 if (last != current) { 24 // 若是电压改变了,说明确定按下按钮了,不然电压值是不会改变的。 25 // 可是这个电压改变是否是抖动阶段的电压改变是不知道的,因此要等5ms(避开抖动 26 // 阶段)再读取一次,第二次读取的就是稳定后的值能够直接返回了。 27 delay(5); 28 current = digitalRead(BUTTON); 29 } 30 // 若是电压没有改变,不能判断是否按下按钮,直接返回,等待下一轮对引脚状态的查询 31 return current; 32 } 33 35 void loop() 36 { 37 currentButton = debounce(lastButton); 38 // 若是不用消抖动函数读取引脚值, 这一句应该是currentButton = digitalRead(BUTTON),后面的逻辑都不变 39 40 if (lastButton == LOW && currentButton == HIGH) { 41 // 若是lastButton == LOW && currentButton = HIGH,则认为按钮按下了,所以要改变led灯的状态 42 ledOn = !ledOn; 43 } 44 lastButton = currentButton; 45 46 digitalWrite(LED, ledOn); 47 }