本文主要介绍Arduino对于开关和条件判断函数的使用。
目录
0.前言
1.介绍
2.按钮控制LED
2.1下拉模式:
2.2上拉模式
3.扩展实验:
前篇介绍了点亮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来设计的,虽然其中有坑,但都还是解决掉了。)
电路中上下拉电阻的作用:
两者最终的目的都是提高电路稳定性,避免误动作。
分别介绍两种模式下拉与上拉。
接线图如下:
代码如下:
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)。这里单个等号是赋值运算,将恒为真。
相比较下拉模式的接线图,上拉模式下就简单许多了。接线图如下:
代码如下:
void setup()
{pinMode(13,OUTPUT);pinMode(2,INPUT_PULLUP);digitalWrite(13, LOW);
}void loop()
{if(digitalRead(2)==LOW){digitalWrite(13, HIGH);}
}
说明:
1.可以看到对于Arduino而言,因其自身已经配有上拉电阻,所以实际使用中更推荐采用上拉模式,以节省外接电子元器件,减少干扰,提高系统的稳定性。
2.在上拉模式即—— pinMode(2,INPUT_PULLUP);。通常状态下2号引脚拉高,触发低电平时有效,即将2与地接通。
按钮按下后开始计时,并同时点亮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;}}}
}