了解按钮
要实现用按钮点灯,首先我们要先来了解一下按钮。
去淘宝搜了一圈,市面上的按钮大多都是这样子的
他们的封装(内部结构)是这样子的:
也就是说,按钮的内部结构是有两头没连接的(如上图①②和③④没连接在一起),当按钮按下,①②就会接通③④。
我用一张图来做个比喻:
没按下时
按钮两端电流互不干扰(一般是横面同一种电流)
当按钮按下时:
发光二极管
我们的灯光用的是普通的发光二极管,也就是所谓的LED灯
发光二极管网上的资料很多,随便一搜一大把,在这里不做过多介绍,不懂留言,或者私信,我给你手摸手教学,嘿嘿嘿
根据上图,送大家一句口诀:
长正短负,负胖正瘦。
arduino编程和接线
我没有找到我的LED灯,只有贴片的了,所以我用了arduino UNO R3的板载LED灯(13号引脚)
如果用led灯的话,接线是这样子的
PS:(为什么上图会加了个电阻?)
Led灯的阻值会随着它两端电压的变化而改变,一般来说,如果直接将Led灯的正极接在Arduino的+5V,负极接在Arduino的GND,这个Led灯会直接烧坏。不过如果直接以Arduino的输出接口接Led灯的正极,在输出高电平点亮Led灯时倒不会烧坏,但是此时流过Led灯的电流已经达到了60mA以上,超过了Arduino输出端口的最大输出电流,长时间工作可能会损坏Arduinio板。所以接Led灯时最好要串联一个220欧姆左右的电阻,这样可以使流过Led灯的电流降到10mA左右。
LED 额定工作电压1.8V,额定工作电流10mA,由R=(5-1.8V)/10mA=20欧
LED的接线是:
短脚接GND
长脚接P13
按钮的接线是 一只脚接GND 一只脚接P6
代码:
void setup(){
pinMode(6, INPUT); //P6模式是输出
digitalWrite(6,HIGH); //P6输出高电平
pinMode(13, OUTPUT); //P13输出高电平
}
void loop(){
if (digitalRead(6) == LOW) //如果P6等于低电平(GND)
{
digitalWrite(13,HIGH); //十三号引脚亮灯
} else {
digitalWrite(13,LOW); //十三号引脚灭灯
}
}
效果如下:
arduino按钮点灯(开源)
debug–消抖
用上面的代码,效果就是按下按钮,板载LED灯和你连接十三号引脚的灯就会亮
但是这样子并不好,有时候明明没有按下,你的灯会突然亮一下,这是为什么呢?
这是因为你的按钮会抖动,会突然接触上那么0.01秒,那么你的单片机也会识别到,认为是低电平了应该亮一下灯了,我们管他叫debug,那咋办勒?
那我们让他不在0.01秒识别不就没事了?
看了很多文章,一般的识别时间是20毫秒一次,也就是说,我识别你是低电平,好,那我等20毫秒,我怕你是突然抖动,耍我玩的,20毫秒后,诶,你还真是低电平,那我才给你开灯。
实现代码如下:
void setup(){
pinMode(6, INPUT);
digitalWrite(6,HIGH);
pinMode(13, OUTPUT);
}
void loop(){
if (digitalRead(6) == LOW) {
delay(20); //20ms消抖
if (digitalRead(6) == LOW) {
digitalWrite(13,HIGH);
}
}
if (digitalRead(6) == HIGH) {
delay(20); //消抖
if (digitalRead(6) == HIGH) {
digitalWrite(13,LOW);
}
}
}
这时候又有人来询问(刁难)我了
哎呀,你这个怎么要一直按着才能亮灯呀,好麻烦呀,能不能按一下就亮,按一下就灭呀,你该不会不行吧?????????????????????????????????????????????????????????????????????????????????????????????????
我掉了整整两根头发,日思夜想,想了整整10秒钟,敲动键盘,啪啪啪,几秒钟就弄好了,代码如下:
volatile boolean LED; //做个布尔类型变量 LED 布尔类型只有0和1 也就是真和假
void setup(){
LED = 0;
pinMode(6, INPUT);
pinMode(13, OUTPUT);
}
void loop(){
if (digitalRead(6) == LOW) {
delay(50); //我这里抖的厉害(本人老帕金森)所以抖动延时到了50ms
if (digitalRead(6) == LOW) {
LED = !LED; //0不等于0=1 1不等于1=0
digitalWrite(13,LED); //LED=0或者1 就亮灭
while(digitalRead(6) == LOW)//如果6号引脚一直是低电平,则卡在这里不出去,这样子直到松开才能继续运气其他函数
}
}
}
这个时候又刁民,啊不,可爱的网友出来说了:“怎么那么复杂呀?有没有简单一点的呀?你该不会不行吧?巴拉巴拉吧啦吧啦…”
void setup(){
pinMode(6, INPUT);
pinMode(13, OUTPUT);
}
void loop(){
if (digitalRead(6) == LOW) {
delay(200); //帕金森 懂得都懂
if (digitalRead(6) == LOW) //按够0.2秒后
{
digitalWrite(13,(!digitalRead(13))); //13号引脚不等于13号引脚 亮不等于亮 = 灭 灭不等于灭 = 亮
while(digitalRead(6) == LOW) //松开跳出死循环
{
}
}
}
}