机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧。
项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html
本篇博文我们要手写代码做一款人体感应灯。要求:当有人经过的时候,LED灯就会自动亮起,人一旦走开,LED自动关闭了。这里用到的传感器是人体红外热释电运动传感器,它是一种能检测人或动物身体发射的红外线而输出电信号的传感器。
早在1938年,有人提出过利用热释电效应探测红外辐射,但并未受到重视,直到六十年代,随着激光、红外技术的迅速发展,才又推动了对热释电效应的研究和对热释电晶体的应用。热释电晶体已广泛用于红外光谱仪、红外遥感以及热辐射探测器,它可以作为红外激光的一种较理想的探测器。它目标正在被广泛的应用到各种自动化控制装置中。
热释电效应同压电效应类似,是指由于温度的变化而引起晶体表面荷电的现象。热释电传感器是对温度敏感的传感器。它由陶瓷氧化物或压电晶体元件组成,在元件两个表面做成电极,在传感器监测范围内温度有ΔT的变化时,热释电效应会在两个电极上会产生电荷ΔQ,即在两电极之间产生一微弱的电压ΔV。由于它的输出阻抗极高,在传感器中有一个场效应管进行阻抗变换。热释电效应所产生的电荷ΔQ会被空气中的离子所结合而消失,即当环境温度稳定不变时,ΔT=0,则传感器无输出。当人体进入检测区,因人体温度与环境温度有差别,产生ΔT,则有ΔT输出;若人体进入检测区后不动,则温度没有变化,传感器也没有输出了。所以这种传感器检测人体或者动物的活动传感。
由实验证明,传感器不加光学透镜(也称菲涅尔透镜),其检测距离小于2米,而加上光学透镜后,其检测距离可大于7米。
整个装置分为三个部分,输入,控制与输出。人体红外热释电运动传感器为输入设备,Arduino就是控制设备,LED发光模块就是输出设备。
由于人体红外热释电运动传感器为数字量的传感器,所以接数字口。LED输出信号也是数字量,同样接数字口。
传感器连线效果如下所示:
实现代码如下所示:
int sensorPin = 2; //传感器连接到数字2
int ledPin = 13; //LED连接到数字13
int sensorState = 0; //变量sensorState用于存储传感器状态
void setup() {
pinMode(ledPin, OUTPUT); //LED为输出设备
pinMode(sensorPin, INPUT); //传感器为输入设备
}
void loop(){
sensorState = digitalRead(sensorPin); //读取传感器的值
if (sensorState == HIGH) { //如果为高,LED亮
digitalWrite(ledPin, HIGH);
}
else { //否则,LED灭
digitalWrite(ledPin, LOW);
}
}
程序开始在setup()中通过pinMode()函数将LED设置为输出模式,人体红外热释电运动传感器设置为输入模式。
有了输入设备,我要读取输入设备的值,才能进行之后的判断,所以loop函数一开始就是读取人体红外热释电运动传感器的值。 读取数字传感器状态的函数是:digitalRead(),函数格式如下所示:
digitalRead(pin)
这个函数是用来读取数字引脚状态,高电平还是低电平。人体红外热释电传感器有人或者动物走动时,读到高电平,否则读到低电平。代码的后半段就是对判断出来的值来执行相应动作。(HIGH:高电平,代表1,LOW:低电平,代表0) 。
数字传感器只会读到两个值(HIGH和LOW)。
这里要用到新的一个语句:if语句,使用格式如下所示:
(1)
if(表达式){
语句;
}
(2)
if(表达式){
语句;
}else{语句;}
(3)
if(表达式){
语句;
}else if(表达式){语句;}
...
else{语句;}
表达式是指我们的判断条件,通常为一些关系式或逻辑式,也可是直接表示某—数值。如果if表达式条件为真,则执行if中的语句。表达式条件为假,则跳出if语句。
程序中“==”是比较运算符,用于判断两个数值是否相等,记得是“双等号”而“=”是赋值运算符,把等号右边的值赋给左边。常用运算符如下所示:
特别说明下,小于等于和大于等于,<和=之间不能留有空格,否则编译不通过。
当然,除了比较运算符外,程序也可以用的+、一、*、/(加、减、乘、除)这些常用的算术运算符。