## **用压电元件检测振动**
> 本例向你展示如何使用一个**压电元件**来检测震动。(压电元件有很多种应用,蜂鸣器就是一种,但是这里不是”正向”使用压电元件,而是利用其电路特性“逆向”使用。即原来是通电产生振动,振动发声,现在是振动产生电流,通过电流判断振动。)本例向你展示如何使用压电元件来进行振动的检测,你可以用本例的方法来对敲门、敲桌子、或者敲其他固体表面的振动进行识别。
当压电元件因为声波、机械扰动或振动产生形变时,会产生压差。而相反,如果你给压电元件加电压,它就会产生振动。由此可知,压电元件既可以由电产生振动,又可以由振动生电。
本例不断使用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)
- 说明
- 系统示例文件目录结构及说明
- 01.Basics
- AnalogReadSerial
- BareMinimum
- Blink
- DigitalReadSerial
- Fade
- ReadAnalogVoltage
- 02.Digital
- BlinkWithoutDelay
- Button
- Debounce
- DigitalInputPullup
- StateChangeDetection
- toneKeyboard
- toneMelody
- toneMultiple
- tonePitchFollower
- 03.Analog
- AnalogInOutSerial
- AnalogInput
- AnalogWriteMega
- Calibration
- Fading
- Smoothing
- 04.Communication
- ASCIITable
- Dimmer
- Graph
- Midi
- MultiSerial
- PhysicalPixel
- ReadASCIIString
- SerialCallResponse
- SerialCallResponseASCII
- SerialEvent
- SerialPassthrough
- VirtualColorMixer
- 05.Control
- Arrays
- ForLoopIteration
- IfStatementConditional
- switchCase
- switchCase2
- WhileStatementConditional
- 06.Sensors
- ADXL3xx
- Knock
- Memsic2125
- Ping
- 07.Display
- barGraph
- RowColumnScanning
- 08.Strings
- CharacterAnalysis
- StringAdditionOperator
- StringAppendOperator
- StringCaseChanges
- StringCharacters
- StringComparisonOperators
- StringConstructors
- StringIndexOf
- StringLength
- StringLengthTrim
- StringReplace
- StringStartsWithEndsWith
- StringSubstring
- StringToInt
- 09.USB
- Keyboard
- KeyboardLogout
- KeyboardMessage
- KeyboardReprogram
- KeyboardSerial
- KeyboardAndMouseControl
- Mouse
- ButtonMouseControl
- JoystickMouseControl
- 10.StarterKit_BasicKit (与特定硬件相关,暂无)
- p02_SpaceshipInterface
- p03_LoveOMeter
- p04_ColorMixingLamp
- p05_ServoMoodIndicator
- p06_LightTheremin
- p07_Keyboard
- p08_DigitalHourglass
- p09_MotorizedPinwheel
- p10_Zoetrope
- p11_CrystalBall
- p12_KnockLock
- p13_TouchSensorLamp
- p14_TweakTheArduinoLogo
- p15_HackingButtons
- 11.ArduinoISP(暂无)
- ArduinoISP