完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
了解按钮
要实现用按钮点灯,首先我们要先来了解一下按钮。 去淘宝搜了一圈,市面上的按钮大多都是这样子的 他们的封装(内部结构)是这样子的: 也就是说,按钮的内部结构是有两头没连接的(如上图①②和③④没连接在一起),当按钮按下,①②就会接通③④。 我用一张图来做个比喻: 没按下时 按钮两端电流互不干扰(一般是横面同一种电流) 当按钮按下时: 发光二极管 我们的灯光用的是普通的发光二极管,也就是所谓的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) //松开跳出死循环 { } } } } |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3457 浏览 1 评论
8995 浏览 16 评论
4050 浏览 18 评论
1103浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 17:22 , Processed in 0.967420 second(s), Total 75, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号