🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## **用压电元件检测振动** > 本例向你展示如何使用一个**压电元件**来检测震动。(压电元件有很多种应用,蜂鸣器就是一种,但是这里不是”正向”使用压电元件,而是利用其电路特性“逆向”使用。即原来是通电产生振动,振动发声,现在是振动产生电流,通过电流判断振动。)本例向你展示如何使用压电元件来进行振动的检测,你可以用本例的方法来对敲门、敲桌子、或者敲其他固体表面的振动进行识别。 当压电元件因为声波、机械扰动或振动产生形变时,会产生压差。而相反,如果你给压电元件加电压,它就会产生振动。由此可知,压电元件既可以由电产生振动,又可以由振动生电。 本例不断使用analogRead() 读取压电扬声器两端电压,并且将探测到的电压(0-5V)通过**数模转换技术** **(ADC)**映射成为数字(0-1023)。 如果压电元件的输出超过了一定极限值(表明振动达到了一定强度)你的板子就会通过串口输出“检测到振动!”这一字符串到电脑。 你需要打开串口监视器来看到效果。 ### **所需硬件** * Arduino板或Genuino板 * 压电元件 * 1mΩ电阻 * 用作敲击的固体表面 * 连接线 ### **电路** ![图片来自官网](http://img.blog.csdn.net/20160622140614271)  压电元件是有极性的,就是说电势总是一侧高一侧低,如果加上外电路,那么电流总是从一侧流向另一侧。  将黑色线(通常电势较低的一级)连接到GND。将红色线(通常电势较高的一级)连接到A0口。还要并联一个1mΩ的电阻,以保证过大电流不会损坏A0口。  你可以去掉压电元件的塑料外壳。这样它能够更好地接收到外部的振动。请将压电元件粘在被测表面,并且适当用力按压、敲击以让它更好地检测到振动。 ### **原理图** ![图片来自官网](http://img.blog.csdn.net/20160622140656753) ### **代码** 在下列代码中,从压电元件读出的值会和你设定的极限值做比较。你可以尝试增加/减少极限值来调整对振动的敏感度。 ~~~ /* 用压电元件检测振动 本例通过读取压电元件来对敲击进行检测。代码将读取压电元件的数值并且将它与极限值进行比较。 如果结果大于极限值,就会输出"检测到振动"到串口监视器。13号引脚的板载LED也会随之点亮。 电路搭建: * 压电元件阳极(+)连接A0 * 压电元件阴极(-)连接GND * 1mΩ电阻连接A0和GND 代码公开 */ // 常量: const int ledPin = 13; // 13号引脚连接LED const int knockSensor = A0; // 压电元件 const int threshold = 100; // 极限值,用于检测是否有振动 // 可变量: int sensorReading = 0; // 存储值的变量 int ledState = LOW; // 存储LED状态量 void setup() { pinMode(ledPin, OUTPUT); // 将ledPin声明为OUTPUT模式 Serial.begin(9600); // 串口 } void loop() { // 读取传感器的值并且存入sensorReading变量: sensorReading = analogRead(knockSensor); // 如果sensorReading超过了极限值: if (sensorReading >= threshold) { // 改变ledPin的状态: ledState = !ledState; // 根据状态点亮/关闭: digitalWrite(ledPin, ledState); // 输出消息"检测到振动!" 并且换行 Serial.println("检测到振动!"); } delay(100); // 延迟100毫秒保持串口稳定性 } ~~~ ### **相关资料** [pinMode()](https://www.arduino.cc/en/Reference/PinMode)  [analogRead()](https://www.arduino.cc/en/Reference/AnalogRead)  [if()](https://www.arduino.cc/en/Reference/If)  [serial.begin()](https://www.arduino.cc/en/Serial/Begin)  [serial.print()](https://www.arduino.cc/en/Serial/Print)  [原文链接](http://www.arduino.cc/en/Tutorial/Knock)