Arduino Workshop @ The Forge

Jeff, Karen & Bob

Piezo Knock

Piezo Knock Physical Image

Notes and explanations

Piezos can work as either a microphone or a speaker. In this example from we will use it to register a knock. Note the reset button on the arduino. The piezo needs to lay flat on the table for this to work. You can change the threshhold to make your particular piezo more or less sensitive.

This is a parallel circuit. Note the resistor position.

Parts & Symbols

8 ohm speaker
1 M resister

Piezo Knock Schematic

Copy & Paste the following code to the Arduino IDE.

/* 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.

The circuit:
* + connection of the piezo attached to analog in 0
* - connection of the piezo attached to ground
* 1-megohm resistor attached from analog in 0 to ground

created 25 Mar 2007
by David Cuartielles <>
modified 30 Aug 2011
by Tom Igoe

This example code is in the public domain.


// these constants won't change:
const int ledPin = 13; // led connected to digital pin 13
const int knockSensor = A0; // the piezo is connected to analog pin 0
const int threshold = 100; // threshold value to decide when the detected sound is a knock or not

// these variables will change:
int sensorReading = 0; // variable to store the value read from the sensor pin
int ledState = LOW; // variable used to store the last LED status, to toggle the light

void setup() {
pinMode(ledPin, OUTPUT); // declare the ledPin as as OUTPUT
Serial.begin(9600); // use the serial port

void loop() {
// read the sensor and store it in the variable sensorReading:
sensorReading = analogRead(knockSensor);

// if the sensor reading is greater than the threshold:
if (sensorReading >= threshold) {
// toggle the status of the ledPin:
ledState = !ledState;
// update the LED pin itself:
digitalWrite(ledPin, ledState);
// send the string "Knock!" back to the computer, followed by newline
delay(100); // delay to avoid overloading the serial port buffer