当电流穿过压电盘里的压电陶瓷材料时,压电盘开始工作,电流使它变形,因此压电盘发出声音(敲击声)。压电盘也可以反过来工作。当压电盘高击或震动时,作用在材料上的力产生电流,可以使用 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关闭,或者检测到另一次敲击,亮度变回最大值。