原文鏈接:https://www.arduino.cc/en/Tutorial/Knock
敲擊檢測
本教程介紹如何使用壓電傳感器檢測振動,比如敲門、桌子或其他固體表面。
壓電傳感器是一種能夠在振動、聲波或機械應變而物理變形時產生電壓的電子裝置,同樣地,當你在壓電傳感器上施加電壓時,它會振動並產生音調。 壓電元器件可以用於播放音調和檢測音調。
代碼使用 analogRead() 函數讀取壓電傳感器的輸出,在模數轉換(ADC)的過程中將電壓范圍從0至5伏編碼為0至1023的數值。
如果傳感器的輸出強於某個閾值,你的開發板將通過串口發送字符串 “Knock!” 到計算機。
請打開串口窗口查看這個字符串。
硬件要求
-
Arduino 或 Genuino 開發板
-
壓電傳感器
-
1兆歐的電阻
-
固體的表面
電路
各種壓電元器件都是有極性的,意味着電壓沿特定方向通過它們(或從它們中)。將黑線(較低電壓)接地,將紅線(較高電壓)連接到模擬引腳0.此外,將一個1兆歐電阻並聯到壓電元器件,以限制壓電元器件產生的電壓和電流來保護模擬輸入引腳。
可能有些壓電元件沒有塑料外殼。它們看起來像一個金屬盤,這樣就更容易用作輸入傳感器。因為壓電傳感器在牢固按壓、粘貼其感應面時工作效果最佳。
點擊圖片放大 
圖片使用Fritzing開發。 有關更多電路示例,請參見Fritzing項目頁
原理圖
點擊圖片放大 
壓電傳感器並聯一個1兆歐電阻然后連接到模擬引腳0(A0)
代碼
在下面的代碼中,將輸入的壓電傳感器的數值與用戶設置的閾值進行比較。嘗試提高或降低此值以提高傳感器的總體靈敏度。
/* Knock Sensor
震動傳感器
This sketch reads a piezo element to detect a knocking sound.
It reads an analog pin and compares the result to a set threshold.
If the result is greater than the threshold, it writes
"knock" to the serial port, and toggles the LED on pin 13.
//此代碼讀取壓電元件的值以檢測敲擊聲。
//它讀取模擬引腳,並將結果與閾值進行比較。
//如果結果大於閾值,則對串口寫入“knock”,
//並切換引腳13上的LED的狀態。
The circuit:
* + connection of the piezo attached to analog in 0
* 壓電元器件的“+”端接到 A0
* - connection of the piezo attached to ground
* 壓電元器件的“-”端接到 Gnd
* 1-megohm resistor attached from analog in 0 to ground
* 1兆歐的電阻兩端分別連接 A0 和 Gnd
參考網址:http://www.arduino.cc/en/Tutorial/Knock
created 25 Mar 2007
by David Cuartielles <http://www.0j0.org>
modified 30 Aug 2011
by Tom Igoe
This example code is in the public domain.
*/
// 這些常量不會改變
const int ledPin = 13; // LED 連接到 D13
const int knockSensor = A0; // 壓電元器件連接到A0
const int threshold = 100; // 設置閥值以檢測聲音是不是敲擊發出的
//這些變量會發生改變
int sensorReading = 0; //這個變量存儲從傳感器引腳讀取的值
int ledState = LOW; // 這個變量存儲最后一個LED狀態,用於切換LED的狀態(亮/滅)
void setup() {
pinMode(ledPin, OUTPUT); // 將ledPin定義為輸出狀態
Serial.begin(9600); // 使用串口
}
void loop() {
// 讀取傳感器的值並將其存儲在變量sensorReading:
sensorReading = analogRead(knockSensor);
// 如果傳感器讀數大於閾值:
if (sensorReading >= threshold) {
// 則切換LED的狀態
ledState = !ledState;
// 並將最后一次LED引腳的狀態賦予變量ledState
digitalWrite(ledPin, ledState);
// 發送字符串“Knock!” 到電腦,然后換行
Serial.println("Knock!");
}
delay(100); // 延時以避免串口緩沖區過載(溢出)
}
參考
pinMode()
analogRead()
if()
serial.begin()
serial.print()
AnalogInput - 使用電位器去控制 LED 的閃爍。
AnalogInOutSerial - 讀取模擬輸入,映射結果值,並使用該值去使 LED 變亮或變暗。
Knock - 使用壓電傳感器來檢測敲擊。
Memsic2125 - 兩軸加速度傳感器。
Ping - 使用超聲波模塊來檢測物體。
最后修改 2015/07/29 SM
QQ 群
歡迎加入我們的大家庭
點擊加入 硬創聯盟 Arduino 群號 8580606
翻譯:硬創聯盟翻譯組翻譯員 – 廣東小木
翻譯時間:2016/12/15
審核:硬創聯盟翻譯組技術語文審核 - 神奇海螺,Lepton-華,成都阿傑
