最新消息:

Arduino论坛┃传感器条件语句程序效率探究

Arduino 少儿编程 1602浏览 0评论

一、前言

近日,笔者在和同事探讨传感器的使用时,发现两个条件语句的问题,虽然看上去不影响程序执行结果,可是感觉和程序效率有所关系,特抛出来和大家交流,希望能得到专家的指点。

二、例程1

以声音传感器的使用为例,做一个声控灯。在A1号管脚上接了一个模块声音传感器,在2号数字管脚上接了一个LED灯(高电平触发),当从A1号管脚的返回值大于50时,则点亮2号数字管脚上的LED灯(写入一个高电平)5秒,否则就关灯。程序如图1所示:

Arduino论坛┃传感器条件语句程序效率探究

图1 Mixly声控灯程序

Arduino代码如下:

void setup(){

pinMode(2, OUTPUT);

}

void loop(){

if (analogRead(A1) > 50) {

digitalWrite(2,HIGH);

delay(5000);

} else {

digitalWrite(2,LOW);

}

}

笔者在几乎所有传感器入门的第一课写的程序都是如此,看上去没有什么问题,可是细想一下感觉还是有点不对,因为在loop()函数中,所有代码是重复循环的,每次都要判断A1的返回值是否大于50从而决定是否开关灯。假定某个时间段内A1的返回值都小于等于50,那程序会不断重复“digitalWrite(2,LOW);”这个命令;反之亦然,如果在某个时间段内A1的返回值都大于50,那么程序会不断重复“ digitalWrite(2,HIGH);delay(5000);”这两个命令。而LED灯的亮和灭的状态只需要给出一次命令(写入高电平/低电平)即可,那么这些不断重复的指令是不是没有必要呢?这正是我这写这篇文章的原因。

如果程序改成这样呢(图2)?

Arduino论坛┃传感器条件语句程序效率探究

图2 Mixly修改后的声控灯程序

修改后的Arduino程序代码如下:

void setup(){

pinMode(2, OUTPUT);

}

void loop(){

if (analogRead(A1) > 50) {

digitalWrite(2,HIGH);

delay(5000);

digitalWrite(2,LOW);

}

}

从程序来看,主要是把关灯代码:digitalWrite(2,LOW); 放入了符合条件时执行的模块里,这样当不符合条件时,就不需要执行任何代码了。

三、例程2

以光线传感器的使用为例,做一个光控灯。光线传感器接A1号模拟管脚,LED灯接数字2号管脚。如果检测到室内光线小于某个值时,我希望把灯常亮,直到室内光线恢复到正常值时才关灯,通常情况下会代码会这样(图3):

Arduino论坛┃传感器条件语句程序效率探究

图3 Mixly光控灯程序

和例程1类似,也存在某个时间段内光线值恒定小于指定值时,程序会不断重复发出向2号数字管脚写入高电平的指令,反之就会不断重复发出向2号数字管脚写入低电平的指令。那这个程序不能像例程1那样修改,因为这里要求是常亮,不是亮一个固定的时间就关。

因此程序的修改思路是增加一个标志变量flag,该变量默认值为0,当光线值小于指定值并且flag为0时才开灯,并设置flag变量值为1,这样当某个时间段内,光线值都很暗的时候,就只需要发出一次向2号数字管脚写入高电平的指令;反之亦然,当光线值大于等于指定值并且flag为1时才灭灯(也就是只有原来灯是开着的并且室内光线正常了)才灭灯,并设置flag变量值为0,这样当某个时间段内,光线值都很亮的时候,就只需要发出一次向2号数字管脚写入低电平的指令。修改后的程序如下图所示(图4):

Arduino论坛┃传感器条件语句程序效率探究

图4 Mixly修改后的光控灯程序

修改后的Arduino程序代码如下:

volatile int flag;

void setup(){

flag = 0;

pinMode(2, OUTPUT);

}

void loop(){

if (analogRead(A1) < 50 && flag == 0) {

digitalWrite(2,HIGH);

flag = 1;

}

if (analogRead(A1) >= 50 && flag == 1) {

digitalWrite(2,LOW);

flag = 0;

}

}

四、结束语

以上关于程序效率的问题抛出来和大家探讨,不知道修改后的程序是画蛇添足还是怎样?是否有必要修改?希望能得到大家的指点,有不当的地方还请大家明言,谢谢大家。

您必须 登录 才能发表评论!