Proyek Piezo knock sensor akan menggunakan piezo disc. Piezo disc bekerja ketika terjadi medan listrik pada materi ceramic pada disc yang menyebabkan ceramic berubah bentuk dan menimbulkan suara.
Piezo juga bekerja sebaliknya, saat diketuk atau ditekan, gaya pada material dapat menimbulkan arus listrik. Arus yang terjadi dapat dibaca, dan dapat digunakan sebagai sensor ketuk.
Komponen
- Piezo Sounder (or piezo disc)
- 2-Way Screw Terminal
- 5mm LED (any color)
- 1MW Resistor
- 150W Current-Limiting Resistor
Skema

Sketch
int ledPin = 9; // LED on Digital Pin 9
int piezoPin = 5; // Piezo on Analog Pin 5
int threshold = 120; // The sensor value to reach before activation
int sensorValue = 0; // A variable to store the value read from the sensor
float ledValue = 0; // The brightness of the LED
void setup() {
pinMode(ledPin, OUTPUT); // Set the ledPin to an OUTPUT
// Flash the LED twice to show the program has started
digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
}
void loop() {
sensorValue = analogRead(piezoPin); // Read the value from the sensor
if (sensorValue >= threshold) { // If knock detected set brightness to max
ledValue = 255;
}
analogWrite(ledPin, int(ledValue) ); // Write brightness value to LED
ledValue = ledValue - 0.05; // Dim the LED slowly
if (ledValue <= 0) { ledValue = 0;} // Make sure value does not go below zero
}
Pembahasan Sketch
Pertama lakukan inisialisasi variable.
int ledPin = 9; // LED on Digital Pin 9 int piezoPin = 5; // Piezo on Analog Pin 5 int threshold = 120; // The sensor value to reach before activation int sensorValue = 0; // A variable to store the value read from the sensor float ledValue = 0; // The brightness of the LED
Pada fungsi setup, set output dengan variable ledPin dan LED akan berkedip 2 kali sebagai indikator program telah berjalan.
void setup() {
pinMode(ledPin, OUTPUT); // Set the ledPin to an OUTPUT
// Flash the LED twice to show the program has started
digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
digitalWrite(ledPin, HIGH); delay(150); digitalWrite(ledPin, LOW); delay(150);
}
Pada main loop, baca nilai analog dari pin 5 yang terhubung dengan piezo
sensorValue = analogRead(piezoPin); // Read the value from the sensor
Bandingkan nilai tersebut dengan variable treshold untuk menentukan apakah terjadi ketukan atau tekanan pada piezo. Jika terjadi, set ledValue ke 255, yaitu voltage maksimum pin PWM di no 9.
if (sensorValue >= threshold) { // If knock detected set brightness to max<br>
ledValue = 255;<br>
}
Kemudian tulis nilai tersebut ke pin PWM 9. perintah int() adalah cara kita mengkonversi tipe data, karena variable ledValue bertipe float.
analogWrite(ledPin, int(ledValue) ); // Write brightness value to LED
Kemudian kurangi nilai ledValue sebesear 0.05. LED akan meredup dengan perlahan, karena kita menggunakan angka 0.05 untuk menurunkan tingkat kecerahan LED. Bila ingin lebih cepat atau lebih lambat, bisa diubah nilai 0.05 tersebut.
ledValue = ledValue - 0.05; // Dim the LED slowly
Pada akhir program, periksa nilai ledValue tidak dibawah 0, karena PWM pin 9 hanya menerima nilai 0-255. Jika lebih kecil atau sama dengan 0, kembalikan ke nilai 0.
if (ledValue <= 0) { ledValue = 0;} // Make sure value does not go below zero
Program akan kembali keawal, LED akan meredup perlahan hingga padam atau ketukan berikutnya terdeteksi dan kecerahan LED akan kembali ke maksimum.