Knock Sensor with a Piezo Element


Piezo elements are quite interesting parts and useful for a lot of more purposes then making beep sounds. In this case we use a piezo element “reversed” as a kind of microphone for sensing subaudio sounds like knocks, vibrations or other impact sound sources. The setup is quite easy. Take a piezo disk and connect two wires one soldered to the middle electrode and the other to metall plate on the edge of the disk. These wires are connected to ground and analog input of the Arduino or you better use our SensorAktor Shield which has an built-in high impedance amplifier. The piezo disk has to be supported on the edge of the disk by some stands for instance like a tripod superglue some plastic rods to the edge. The most important thing is the reaction force which is provided by an 50 gram fishing plumb  weight glued in the middle of the disk. This setup is able to detect footsteps in a room or even keyboard strokes when the sensor is placed on the same table.

The Software averages the incoming audio signal and subtracts the actual audio signal to get rid of any dc offset. If the signal level is over a threshold adjustable by an potentiometer a led is turned on. A metro timer sets  the sampling rate to 5 ms to measure deep frequencies.


Fingers  drumming gently on a table are producing an easy detectable signal.


/* Knock Sensor with Piezo Disk connected to Mic Input

 *  SensorAktor Shield V2

 * Code und Material Workshop
 * Lab3 2010
 * Kunsthochschule fuer Medien Koeln
 * Academy of Media Arts Cologne

 * pin mapping SensorAktor Shield (import  to get already defined mapping)
 * analog inputs: a0 = pin0, a1 = pin1, a2 = pin2, a3 = pin3, a4 = pin4, a5 = pin5
 * built-in poti: poti = pin5
 * amplified input: mic = pin0
 * switches: s1 = pin1, s2 = pin2, s3 = pin3
 * leds: led1 = pin3, led2 = pin5, led3 = pin6
 * power outs: out1 = pin3, out2 = pin5, out3 = pin6
 * motor outs: motor1_1 = pin11, motor1_2 = pin12, motor2_1 = pin13, motor2_2 = pin8
 * motor pwms: pwmMotor1 = pin9, pwmMotor2 = pin10
 * servo outs: servo1 = pin2, servo2 = pin4, servo3 = pin7

// import sensor aktor library for pin mapping

int potiValue;
int aPiezo,aPiezoAverage;
int adiff;
int timer10ms;
int threshold;
int sens;

Metro tMetro = Metro(5); 

void setup () {




// this block is executed in a loop after setup is called one time
void loop(){
  if ( tMetro.check() ) {

    aPiezo=analogRead(analog0);      // read piezo Sensor
    potiValue=analogRead(analog5);   // read poti as analog threshold
    if (aPiezo < aPiezoAverage) aPiezoAverage--;    // analog value average
    if (aPiezo > aPiezoAverage) aPiezoAverage++;

    adiff=aPiezo - aPiezoAverage;    // analog input as difference to average / eliminate DC offset
    adiff=abs(adiff);                // difference absolte value

    if (adiff > threshold ) sens++;  // if difference greater then threshold incremet sensor event

    if (timer10ms++ > 100)  // check within half a second
      if (sens > 50) digitalWrite(led1,1);  // if more then x sensor event within half a second trigger

      Serial.print("  aPiezo:");
      Serial.print("  Mittel:");
      Serial.print(" diff:");
      Serial.print(" sens:");


Martin Nawrath  / KHM 2010