
代码:
void setup(){
pinMode(2, OUTPUT);
pinMode(1,INPUT);}void loop(){
if(digitalRead(1))
{
digitalWrite(2, LOW);
}
else
{
digitalWrite(2, HIGH);
}
delay(10); // Wait for 10 millisecond(s)}
按 键
按键是我们用的非常多的一种输入设备,是单片机获取外部信号的一种重要方式,按键在实际电路中的变种也非常多,不管它怎么变,只要符合按键信号的要求,我们基本上都可以按照按键的方式来处理,大同小异。

轻触开关实物

机械尺寸

内部电路原理
这种开关也叫轻触开关,是电子产品中用途非常广泛,同时也是我们学习单片机、嵌入式过程中经常接触的开关。
我们平时用开关感觉这个玩意要么是关,要么是开,就这两个动作,但是真实的开关按下和弹回的过程中是这样的

理想波形和实际波形
接下来我们来实现按键控制LED灯亮灭实验:
实验材料:6*6轻触按键、5mm红色LED灯、电阻(270Ω)、可调电源

实验结果:当轻触按键按下去LED灯就亮了,松开轻触按键LED灯就熄灭

思考??:我们能不能通过MCU接受轻触按键信号来实现对LED灯的控制呢?用按键实现LED灯的亮灭翻转,即使松开按键,LED灯也能亮?答案是肯定可以的,我们一起来实现下
实验原理图如下:
包含的器件有:6*6轻触按键一个,5mm红色LED灯一个,1/4W/270Ω直插电阻一个,1/4W/10K直插电阻一个,arduino uno开发板一块,Type USB线一根,连接导线若干

按键控制LED灯原理图
前面我们学会了如何控制LED灯亮灭,这里就不赘述了,我们接下来学习如何通过单片机即arduino来检测按键,在此之前我们先来了解一点点单片机知识。
高阻态(high-impedance state):arduino引脚默认就是高阻态,这个字面意思也好理解,就是电阻很大,一般都是MΩ级别的,所以这种状态下很不稳定,任何一个干扰信号都会造成误触发,这也是我为什么在原理图中接了个下拉电阻的原因
上拉(pullup):在单片机引脚和电源之间接个电阻,一般选择10K

上拉电阻
下拉(pulldown):在单片机引脚和地之间接个电阻,一般选择10K~47K都可以

下拉电阻
我这里使用的是默认的方式,所以我接了个下拉电阻,这样单片机在按键没有按下时输入引脚1就是低电平,当按键按下时就接到电源就是高电平,下面这段代码的意思就是当检测到引脚1为低电平时,把LED灯引脚设置为高电平,LED灯不亮; 当检测到引脚1为高电平时,把LED灯引脚设置为低电平,LED灯点亮。
void loop(){
if(digitalRead(1)) // 如果输入引脚1为高电平时 {
digitalWrite(2, LOW); // LED灯亮
}
else // 否则输入引脚为低电平 {
digitalWrite(2, HIGH); // LED灯灭 }
delay(10); // Wait for 10 millisecond(s) // 以10ms的周期检测按键}
实验现象:

为了更直观地看到效果,我们添加两个电压表,分别测量引脚1和引脚2的电压,这样我们能更直观地看到LED灯和按键的电压变化效果。

在上面例子中我们发现按键松了手之后LED灯立马熄灭,那么可不可以在电路不改的前提下按下按键让LED灯一直保持亮,再按下就保持熄灭了呢?聪明的先辈早就给我们想到了,我们下面来尝试着改下程序
代码如下:
代码原理:首先检测按键是否有按下,如果有按下先延时20ms消除下抖动,再检测有没有按下,如果有按下就对LED灯的状态进行翻转,digitalWrite(2,!digitalRead(2));,翻转的原理是读取当前引脚2的状态,然后将其取反操作
void setup(){
pinMode(2, OUTPUT);
pinMode(1,INPUT);}void loop(){
if(1==digitalRead(1))
{
delay(20);
if(1==digitalRead(1))
{
digitalWrite(2, !digitalRead(2));
}
}
delay(10); // Wait for 10 millisecond(s)}
按键效果:

上面实验中我们基本实现按键控制LED灯的状态保持,细心地朋友可能会发现,控制的很不溜,大家可以开动脑筋进一步优化代码,来达到你想要的效果,比如说状态机处理方式。
总结:
1、按键是我们生活中用的非常多的一种人机交互设备,按键手感的好坏会直接影响到体验效果
2、通过按键其实我们可以进一步引申出按键的变种,原理都是一样的,只是用途不一样罢了

自锁开关

微动开关

行程开关
3、进一步的,如果我们一个电路模块输出的信号也是这种高低按键电平信号,同样可以当做按键处理

热式红外感应模块

光电开关

电磁感应开关
4、同样的电路,代码不一样,就能实现不同的效果,这也是编程的乐趣所在,后面随着我们基础知识的积累,我们会进一步发现编程的乐趣