## **用壓電元件檢測振動**
> 本例向你展示如何使用一個**壓電元件**來檢測震動。(壓電元件有很多種應用,蜂鳴器就是一種,但是這里不是”正向”使用壓電元件,而是利用其電路特性“逆向”使用。即原來是通電產生振動,振動發聲,現在是振動產生電流,通過電流判斷振動。)本例向你展示如何使用壓電元件來進行振動的檢測,你可以用本例的方法來對敲門、敲桌子、或者敲其他固體表面的振動進行識別。
當壓電元件因為聲波、機械擾動或振動產生形變時,會產生壓差。而相反,如果你給壓電元件加電壓,它就會產生振動。由此可知,壓電元件既可以由電產生振動,又可以由振動生電。
本例不斷使用analogRead() 讀取壓電揚聲器兩端電壓,并且將探測到的電壓(0-5V)通過**數模轉換技術**?**(ADC)**映射成為數字(0-1023)。
如果壓電元件的輸出超過了一定極限值(表明振動達到了一定強度)你的板子就會通過串口輸出“檢測到振動!”這一字符串到電腦。
你需要打開串口監視器來看到效果。
### **所需硬件**
* Arduino板或Genuino板
* 壓電元件
* 1mΩ電阻
* 用作敲擊的固體表面
* 連接線
### **電路**
?
壓電元件是有極性的,就是說電勢總是一側高一側低,如果加上外電路,那么電流總是從一側流向另一側。?
將黑色線(通常電勢較低的一級)連接到GND。將紅色線(通常電勢較高的一級)連接到A0口。還要并聯一個1mΩ的電阻,以保證過大電流不會損壞A0口。?
你可以去掉壓電元件的塑料外殼。這樣它能夠更好地接收到外部的振動。請將壓電元件粘在被測表面,并且適當用力按壓、敲擊以讓它更好地檢測到振動。
### **原理圖**

### **代碼**
在下列代碼中,從壓電元件讀出的值會和你設定的極限值做比較。你可以嘗試增加/減少極限值來調整對振動的敏感度。
~~~
/*
用壓電元件檢測振動
本例通過讀取壓電元件來對敲擊進行檢測。代碼將讀取壓電元件的數值并且將它與極限值進行比較。
如果結果大于極限值,就會輸出"檢測到振動"到串口監視器。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