Ardunio实现按钮控制LED常亮或常灭

您所在的位置:网站首页 arduino小灯闪烁程序 Ardunio实现按钮控制LED常亮或常灭

Ardunio实现按钮控制LED常亮或常灭

2024-01-20 09:48| 来源: 网络整理| 查看: 265

想法

Arduino中 如何实现

情况一: LED常灭时, 按钮按下并松开之后保持LED灯常亮?情况二:LED常亮时, 按钮按下并松开之后保持LED灯常灭? 想法实现过程 版本1 亮个灯

Arduino上有一个LED灯,上面的字母为L 在这里插入图片描述

当然我们也可以自己再额外加一个LED灯, 长脚接PIN13, 短脚接GND 不推荐以上做法: 外接的LED灯容易烧掉, 最好将LED插在面包板上, 串联加一个电阻 不要问我为什么? 因为我无意中烧掉了好几个了, 还好这玩意多! 在这里插入图片描述

#define LED 13 void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(LED , OUTPUT); } void loop() { digitalWrite(LED, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }

结果: LED灯每隔1S闪烁一次

版本2 加个按钮

在这里插入图片描述

#define LED 13 #define BUTTON 7 int val = 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){ digitalWrite(LED, HIGH); }else{ digitalWrite(LED, LOW); } }

新的问题: 必须用手指一直按着不能松手, 不然灯就会灭, 如何按一下亮, 再按一下灭呢?

版本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