Ardunio实现按钮控制LED常亮或常灭 |
您所在的位置:网站首页 › arduino小灯闪烁程序 › Ardunio实现按钮控制LED常亮或常灭 |
想法
Arduino中 如何实现 情况一: LED常灭时, 按钮按下并松开之后保持LED灯常亮?情况二:LED常亮时, 按钮按下并松开之后保持LED灯常灭? 想法实现过程 版本1 亮个灯Arduino上有一个LED灯,上面的字母为L 当然我们也可以自己再额外加一个LED灯, 长脚接PIN13, 短脚接GND 不推荐以上做法: 外接的LED灯容易烧掉, 最好将LED插在面包板上, 串联加一个电阻 不要问我为什么? 因为我无意中烧掉了好几个了, 还好这玩意多! 结果: LED灯每隔1S闪烁一次 版本2 加个按钮新的问题: 必须用手指一直按着不能松手, 不然灯就会灭, 如何按一下亮, 再按一下灭呢? 版本3 让按钮按下放开后能开启及关闭LED #define LED 13 #define BUTTON 7 int val = 0; int state = 0; // 新添加一个变量记录LED状态 void setup() { // put your setup code here, to run once: pinMode(LED, OUTPUT); pinMode(BUTTON, INPUT); } void loop() { // put your main code here, to run repeatedly: val = digitalRead(BUTTON); if (val == HIGH){ // 每当按钮按下时 切换state状态 state = 1 - state; } if (state == 1){ // 根据 state状态 来点亮或熄灭LED digitalWrite(LED, HIGH); } else{ digitalWrite(LED, LOW); } }新的问题: LED灯的显示很不稳定, 有时会明明是亮的,再按下并松开按钮, 灯还是亮的, 反之, 也是 原因: Arduino 芯片会以每秒16 000 000次的速度执行程序指令. 所以 当我们按下并在松开按钮之间, 其实状态值已经被反复读取并取反赋值数千次了, 导致它的值的不确定. 所以我们如何解决这个不确定呢? 只要让我们的state值每次按一次按钮只被修改其值一次, 即取反一次即可! 版本4 解决 state值 被多次修改的问题 #define LED 13 #define BUTTON 7 int val = 0; int old_val = 0; int state = 0; void setup() { // put your setup code here, to run once: pinMode(LED, OUTPUT); pinMode(BUTTON, INPUT); } void loop() { // put your main code here, to run repeatedly: val = digitalRead(BUTTON); if (val == HIGH && old_val == LOW) { // 注释2 state = 1 - state; } old_val = val; // 注释1 if (state == 1) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } }首先 我们先看注释1处的代码 它的作用是 在按钮按下并未松开时, old_val 永远会是 HIGH, 只有当按钮松开释放后, old_val 才会是 LOW 然后 我们再看注释2处的代码 它的作用是 为了让了按钮被按下之后, 代码只运行一次, 不能循环回来之后还能进入这个 if条件 版本5 克服按键抖动在按钮尚未按到底的瞬间和按钮弹回的时候, 会产生杂波, 这时 Arduino会收到一连串开关交错的信号. 我们在程序中 加入 10~50 ms 的延迟批令可以克服这个杂波. #define LED 13 #define BUTTON 7 int val = 0; int old_val = 0; int state = 0; void setup() { // put your setup code here, to run once: pinMode(LED, OUTPUT); pinMode(BUTTON, INPUT); } void loop() { // put your main code here, to run repeatedly: val = digitalRead(BUTTON); if (val == HIGH && old_val == LOW) { state = 1 - state; delay(10); // 加入延迟以克服杂波 } old_val = val; if (state == 1) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } }参考书籍: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |