购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2.3 压电震动传感器

当电流穿过压电盘里的压电陶瓷材料时,压电盘开始工作,电流使它变形,因此压电盘发出声音(敲击声)。压电盘也可以反过来工作。当压电盘高击或震动时,作用在材料上的力产生电流,可以使用 Arduino 读出这个电流。利用这个原理现在马上就要做一个震动传感器。

1.连接硬件

本试验所需的硬件有压电蜂鸣器(或压电陶瓷片)一只、LED一只、1MΩ电阻一只。首先,把USB线拔下来确保Arduino没有上电;之后,连接元件,形成如图2-33所示的电路。在本试验中,压电陶瓷片的效果比压电蜂鸣器的效果要好。

图2-33 实际接线图

2.程序代码

打开Arduino IDE并输入代码。

程序代码如下:

//震动传感器

int ledpin=9;//LED接在引脚9上

int piezopin=5;//压电盘接在引脚5上

int threshold=120;//传感器产生动作的阈值

int sensorvalue=0;//存储从传感器读出的值的变量

float ledvalue=0;//LED的亮度

void setup(){

Pinmode(ledpin,OUTPUT);//设置引脚为输出模式

//闪烁LED两次显示程序已经开始

digitalwrite(ledpin,HIGH);delay(150);digitalwrite(ledpin,;LOW);delay(150);

digitalwrite(ledpin,HIGH);delay(150);digitalwrite(ledpin,;LOW);delay(150);

}

void loop()

sensorvalue=analogread(piezopin);//从传感器读值

if(sensorvalue>=threshole){//如果检测到敲击,则设置亮度为最大值

ledvalue=255;

}

analogwrite(ledpin,int(ledvaluw))};//写亮度值到LED

ledvalue=ledvalue-0.05;//慢慢使LED变暗

if(ledvaluw<=0){ledvalue=0;}//确保值没有低于0

}

上传代码之后,LED 将快速闪烁两下,此时表明程序已经开始。现在可以敲击传感器(首先把它平放在一个平面上),或者用手指挤压它。当Arduino每次检查到敲击或挤压时,LED 变亮之后将慢慢变暗直至关闭(注意,代码中的阈值是根据本项目所使用的特定压电片设置的。可以根据项目中所使用的压电片的形式和尺寸设定合适的值。阈值越低会更敏感,阈值越高敏感性会差一点)。

3.代码详解

本项目中没有涉及新的编写代码的知识,但是要说明一下本项目的代码是如何工作的。

首先,给程序设置必要的变量,代码后有注释:

int ledpin=9;//LED接在引脚9上

int piezopin=5;//压电盘接在引脚5上

int threshold=120;//传感器产生动作的阈值

int sensorvalue=0;//存储从传感器读出的值的变量

float ledvalue=0;//LED的亮度

在setup函数中,ledpin设置为输出,如前所述,LED快速闪烁两次作为程序开始工作的可视标志:

void setup()

pinmode(ledpin,OUTPUT);

digitalwrite(ledpin,HIGH);delay(150);

digitalwrite(ledpin,LOW);delay(150);

digitalwrite(ledpin,HIGH);delay(150)

digitalwrite(ledpin,LOW);delay(150)

}

在主循环中,首先从模拟引脚5读出一个模拟值,模拟引脚5是连接压电盘的那个引脚。

sensorValue=analogread(piezopin);

之后,代码检查这个模拟值是否大于或等于已设定的阈值。例如,它是否被敲击或挤压(如果阈值设定为一个非常低的值,则压电盘会变得非常敏感)。如果满足条件,设置ledValue为255,这是数字PWM引脚9输出的最大电压值。

if (sensorValuw>=threshold) {

ledValue=255;

}

之后将该值写入PWM引脚9。因为ledValue是一个浮点值,需要将它转换成整型。作为模拟量写函数,analogWrite只能接受整型而不是浮点型数值。

analogWrite(ledpin,int(ledvalue));

之后,将ledValue的值减去浮点数0.05:

ledValue=ledValue-0.05;

因为希望LED慢慢变暗,所以这里用浮点型而不是整型来存储LED的亮度值,从而可以用较小的增量逐渐减小它的值(这里是0.05),它通过主程序循环逐渐减小,直至变成0,如果希望LED变暗的速度放慢或加快,可减小或增大这个增量。

最后,不希望ledValue的值小于零,因为数字PWM引脚9只能输出0~255之间的值,因此需要检查它是否小于等于0,如果是,则将它置零:

If(ledValue<=0) {ledValue=0;}

然后,主循环重复,每次运行时LED慢慢变暗直到LED关闭,或者检测到另一次敲击,亮度变回最大值。 2qa/CtnjfFhz/AvjvaKQETPD6/ahTDrzRsNVvu16/VfJ9Z/rK8AoRVGRGLuoTXm6

点击中间区域
呼出菜单
上一章
目录
下一章
×