1.介绍
2.按钮控制LED
2.1下拉模式:
2.2上拉模式
3.扩展实验:
1.介绍
前篇介绍了点亮LED,这次案例我们尝试通过一个简单的传感器——按钮,来实现对LED控制。将控制按钮分解的话,能看到一个十分简单的构造。
如上图所示,这个按钮有四个引脚,分别1-2导通,3-4导通,中间一个开关连接。这里或许朋友们会有疑问了,对于一个常开开关而言,这里为什么会有四个引脚,只需要两个引脚不就可以了吗?比如工业上常用的欧姆龙行程开关,如下图:
常开端一对引脚,常闭端一对引脚,触碰按钮后,原本的常开和常闭端相互切换状态。而对于实验用的这个四脚小开关,这里的四个引脚的其中一个是为了给下拉电阻做引脚而准备的,常规的欧姆龙开关一般是和工业控制器如PLC等搭配使用。而对于PLC而言,首先是电源,一般PLC电源采用DC24V,而Arduino一般是DC5V,就电源上自然Arduino就不如PLC抗干扰能力强,再一个PLC电源线以及接线一般是采用具有一定抗干扰能力的双绞线,而我们对Arduino实验时一般是采用面包线,两者抗干扰能力也不在一个级别上,所以如果Arduino在读取开关信号时不接上拉或下拉电阻,那么其误动作的概率就很大。Arduino本身有自带上拉电阻,所以实际使用过程中更推荐使用上拉模式来读取开关信号。(这里虽然说Arduino相比较PLC而言抗干扰能力上不如PLC,但并不是说Arduino就不能用于工控了。做好屏蔽,外部的抗干扰等,依旧可以实现工控,毕竟一块Arduino的价格是一个PLC的几分之一。自己做的一条自动化生产线也是采用Arduino来设计的,虽然其中有坑,但都还是解决掉了。)
电路中上下拉电阻的作用:
上拉电阻——是将不确定信号通过一个电阻钳位在高电平,电阻同时限流作用
下来电阻——是将不确定信号通过一个电阻钳位在低电平
两者最终的目的都是提高电路稳定性,避免误动作。
2.按钮控制LED
分别介绍两种模式下拉与上拉。
2.1下拉模式:
接线图如下:
代码如下:
void setup()
{
pinMode(13,OUTPUT);
pinMode(2,INPUT);
digitalWrite(13, LOW);
}
void loop()
{
if(digitalRead(2)==HIGH){//读取2号引脚状态,并做判断
digitalWrite(13, HIGH);
}
}
说明:
1.下拉模式即——pinMode(2,INPUT);。通常状态下2号引脚为低,触发高电平时有效,即将2与5V接通。
2.if语句常用判定式:<,<=,==,>=,>,!=。
布尔运算式: if(digitalRead(2)==HIGH && digitalRead(2)==HIGH){//.... } && 与 if(digitalRead(2)==HIGH || digitalRead(2)==HIGH){//.... } || 或
3.对于“==”判断,要小心使用成了单个等号如if(x=10)。这里单个等号是赋值运算,将恒为真。
2.2上拉模式
相比较下拉模式的接线图,上拉模式下就简单许多了。接线图如下:
代码如下:
void setup()
{
pinMode(13,OUTPUT);
pinMode(2,INPUT_PULLUP);
digitalWrite(13, LOW);
}
void loop()
{
if(digitalRead(2)==LOW){
digitalWrite(13, HIGH);
}
}
说明:
可以看到对于Arduino而言,因其自身已经配有上拉电阻,所以实际使用中更推荐采用上拉模式,以节省外接电子元器件,减少干扰,提高系统的稳定性。
在上拉模式即—— pinMode(2,INPUT_PULLUP);。通常状态下2号引脚拉高,触发低电平时有效,即将2与地接通。
3.扩展实验:
按钮按下后开始计时,并同时点亮LED,10秒途中再次按下按钮,熄灭LED,并打印时间,10秒后若无任何操作,自动熄灭LED,并打印时间。扩展实验中有循环while的使用,会在下一章节具体说明。
接线图如下:
代码如下:
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(2, INPUT_PULLUP);
digitalWrite(13, LOW);
}
void loop()
{
int i=10;
if (digitalRead(2)==LOW) {
while (digitalRead(2)==LOW) {
if(digitalRead(2)==HIGH){
digitalWrite(13, HIGH);
while (i<=10000){
delay(10);
i=i+10;
if (digitalRead(2)==LOW) {
while (digitalRead(2)==LOW){
if(digitalRead(2)==HIGH) {
Serial.println(float(i)/1000);
break;
}
}
break;
}
Serial.println(float(i)/1000);
}
digitalWrite(13, LOW);
break;
}
}
}
}