Sensor Getaran SW-420 Arduino: Deteksi Guncangan dan Alarm
Sensor getaran SW-420 dengan Arduino: cara kerja, sensitivitas, menghitung pulsa dan mengukur lama guncangan, alarm maling, batas ide alarm gempa vs MPU6050, dan Telegram ESP32.
Dalam proyek sensor getaran Arduino, komponen yang paling sering dipakai adalah modul SW-420 yang murah dan sederhana. Hanya dengan satu pin digital, modul ini memberi tahu bahwa sebuah permukaan terguncang, seseorang mengetuk pintu, laci dibuka, atau sebuah mesin mulai berjalan. Di modulnya ada sakelar getaran pegas, chip komparator LM393, dan potensiometer kecil untuk mengatur sensitivitas. Cara memakainya mudah, tapi pada percobaan pertama kebanyakan orang mengalami dua masalah yang sama: sensor melewatkan sebagian getaran dan kadang malah membunyikan alarm tanpa alasan sama sekali.
Di panduan ini kamu akan belajar cara kerja kontak pegas di dalam SW-420, kenapa output-nya datang berupa pulsa-pulsa pendek, dan cara mengatur sensitivitas dengan benar. Setelah itu kita akan menghitung pulsa dengan interrupt, mengukur berapa lama dan seberapa kuat sebuah guncangan, lalu membuat alarm maling yang mengurangi alarm palsu. Kita juga akan membahas kenapa ide alarm gempa tidak sesederhana kedengarannya dan apa tambahan yang diberikan akselerometer MPU6050. Terakhir, kita akan mengirim pesan Telegram ke ponselmu dengan ESP32 ketika getaran terdeteksi dan menulis kode MicroPython untuk Raspberry Pi Pico.

Apa itu sensor getaran SW-420 dan bagaimana cara kerjanya?
Elemen pendeteksi yang sebenarnya pada modul ini adalah sakelar getaran normally closed (NC, normal tertutup) di dalam selubung logam kecil berbentuk silinder. Di dalam selubung ada pegas dan bagian konduktif; ketika sensor diam, keduanya bersentuhan dan kontaknya tertutup. Ketika sensor terguncang, pegas berayun dan kontak membuka-menutup dalam semburan sangat pendek, masing-masing kurang dari satu milidetik. Sakelarnya sendiri tidak berarah, jadi ia bereaksi terhadap getaran dari arah mana pun. LM393 di modul membandingkan tegangan yang dihasilkan sakelar ini dengan ambang yang diatur potensiometer, lalu menghasilkan output digital (DO) yang bersih. Pada kebanyakan modul, DO bernilai LOW ketika sensor diam dan HIGH selama ada getaran, dan LED sinyal di board padam atau berkedip mengikuti getaran; di beberapa board klon logikanya bisa terbalik, jadi uji dulu modulmu dengan Serial Monitor.
| Fitur | Nilai |
|---|---|
| Elemen pendeteksi | SW-420, sakelar getaran pegas normally closed |
| Catu daya | 3,3–5 V |
| Output | Digital (DO), lewat komparator LM393 |
| Pengaturan sensitivitas | Potensiometer di board |
| Arah | Tidak berarah, merespons getaran dari sisi mana pun |
| Sinyal output | Rentetan pulsa pendek selama getaran |
| Pin | VCC, GND, DO |
| Ukuran board | Sekitar 32 × 14 mm, satu lubang pemasangan M3 |
Pengkabelan SW-420 ke Arduino
| Pin modul | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | 5V | 3V3 | 3V3(OUT) |
| GND | GND | GND | GND |
| DO | D2 (pin interrupt INT0) | GPIO 27 | GP15 |
Sensitivitas: bagaimana cara mengatur potensiometer?
Potensiometer mengatur ambang komparator. Kalau terlalu sensitif, sensor menangkap gelas yang diletakkan di meja, truk yang lewat, bahkan getaran buzzer-nya sendiri; kalau terlalu kasar, ia hanya bereaksi pada ketukan keras. Untuk pengaturan yang tepat, sekrup modul ke permukaan tempat ia akan dipakai dan amati LED sinyal di board. Putar potensiometer sampai titik di mana LED tetap stabil ketika diam tapi bereaksi ketika kamu mengetuk permukaan pelan dengan jari; lalu kurangi sensitivitas sedikit saja untuk menyisakan margin aman. Pengaturan ini bergantung pada bahan permukaan: pengaturan yang sama bisa sangat sensitif di meja kayu dan nyaris tidak bereaksi di dinding beton.
Tes pertama: mendeteksi getaran dan menangkap pulsa pendek
Kode pertama pemula biasanya membaca pin dengan digitalRead() di loop() dan menyalakan LED ketika melihat HIGH. Cara itu berhasil untuk ketukan keras, tapi pada getaran ringan sering kali tidak terjadi apa-apa, karena output SW-420 mungkin hanya HIGH selama beberapa ratus mikrodetik, dan kalau pada momen itu loop() sedang sibuk dengan Serial.print() atau delay(), pulsanya terlewat. Solusinya adalah menangkap pulsa dengan interrupt dan mencatat waktunya sampai pulsa berikutnya. Kode di bawah mencatat waktu setiap pulsa dan menjaga LED tetap menyala selama 1 detik setelah pulsa terakhir, sehingga matamu bisa melihat getaran yang sangat singkat sekalipun.
1const byte VIB_PIN = 2; // SW-420 DO (INT0)
2const byte LED_PIN = 13; // dahili LED / onboard LED
3const unsigned long HOLD_MS = 1000; // son darbeden sonra LED süresi / LED time after the last pulse
4
5volatile unsigned long lastPulseMs = 0;
6volatile bool pulseSeen = false;
7
8void onVibration() { // her darbede çalışır / runs on every pulse
9 lastPulseMs = millis();
10 pulseSeen = true;
11}
12
13void setup() {
14 pinMode(VIB_PIN, INPUT);
15 pinMode(LED_PIN, OUTPUT);
16 attachInterrupt(digitalPinToInterrupt(VIB_PIN), onVibration, RISING); // LOW → HIGH geçişi / LOW to HIGH edge
17 Serial.begin(9600);
18}
19
20void loop() {
21 noInterrupts();
22 unsigned long last = lastPulseMs;
23 bool seen = pulseSeen;
24 pulseSeen = false;
25 interrupts();
26
27 if (seen) Serial.println(F("Titresim / vibration"));
28 digitalWrite(LED_PIN, (last > 0 && millis() - last < HOLD_MS) ? HIGH : LOW);
29}Interrupt berjalan pada setiap tepi ketika pin berpindah dari LOW ke HIGH; di Uno, hanya D2 dan D3 yang menyediakan interrupt eksternal jenis ini. Kalau logika modulmu terbalik, tulis FALLING sebagai ganti RISING; karena rentetan pulsa terdiri dari tepi naik dan tepi turun, hitungannya tidak berubah. Fungsi interrupt dibuat sesingkat mungkin dan tidak memakai Serial; pencetakan dilakukan di loop(). Menonaktifkan interrupt sebentar ketika membaca variabel di loop() mencegah variabel multi-byte berubah di tengah pembacaan dan terbaca rusak.
Menghitung pulsa dan mengukur durasi: berapa lama dan seberapa kuat guncangannya?
SW-420 tidak mengukur percepatan, tapi jumlah pulsa yang dihasilkannya memberi gambaran yang baik tentang kekuatan guncangan: ketukan ringan menghasilkan beberapa pulsa, pintu yang dibanting puluhan, dan getaran bor ratusan per detik. Kode di bawah menghitung pulsa dengan interrupt dan mengelompokkannya menjadi kejadian (event): pulsa pertama memulai sebuah kejadian, dan kalau tidak ada pulsa baru selama 500 ms, kejadian itu selesai. Di akhir setiap kejadian, kode mencetak durasi, total jumlah pulsa, dan kepadatan pulsa per detik. Dengan begitu kamu bisa membuat “sidik jari” kejadian-kejadian di lingkunganmu sendiri dan menentukan ambang alarm berdasarkan pengukuran, bukan tebakan.
1const byte VIB_PIN = 2; // SW-420 DO (INT0)
2const unsigned long QUIET_MS = 500; // bu kadar sessizlik olayı bitirir / this much silence ends an event
3
4volatile unsigned long pulseCount = 0;
5volatile unsigned long lastPulseMs = 0;
6
7bool inEvent = false;
8unsigned long eventStart = 0;
9unsigned long eventStartCount = 0;
10
11void onVibration() {
12 pulseCount++;
13 lastPulseMs = millis();
14}
15
16void setup() {
17 pinMode(VIB_PIN, INPUT);
18 attachInterrupt(digitalPinToInterrupt(VIB_PIN), onVibration, RISING);
19 Serial.begin(9600);
20 Serial.println(F("Sure(ms) Darbe/pulses Darbe/sn (pulses/s)"));
21}
22
23void loop() {
24 noInterrupts();
25 unsigned long count = pulseCount;
26 unsigned long last = lastPulseMs;
27 interrupts();
28
29 if (!inEvent && count != eventStartCount) { // yeni olay başladı / a new event started
30 inEvent = true;
31 eventStart = last;
32 }
33 if (inEvent && millis() - last > QUIET_MS) { // olay bitti / the event is over
34 unsigned long duration = last - eventStart;
35 unsigned long pulses = count - eventStartCount;
36 float density = duration > 0 ? pulses * 1000.0 / duration : pulses;
37 Serial.print(duration);
38 Serial.print(F(" "));
39 Serial.print(pulses);
40 Serial.print(F(" "));
41 Serial.println(density, 0);
42 eventStartCount = count;
43 inEvent = false;
44 }
45}Jalankan kodenya, lalu ketuk meja dengan berbagai cara, buka laci, tutup pintu, dan catat angka yang muncul. Untuk satu ketukan pendek, durasinya sering mendekati nol dan jumlah pulsanya hanya satu digit; getaran yang panjang membuat durasi dan jumlah pulsa sama-sama bertambah. Memakai kedua nilai ini bersama jauh lebih ampuh daripada sekadar “ada getaran atau tidak”: misalnya, pada sensor yang dipasang di brankas, aturan seperti “kejadian yang berlangsung minimal 300 ms dengan minimal 20 pulsa” bisa menyaring langkah kaki orang yang lewat dan tetap menangkap orang yang mencoba membongkar brankas.
Alarm maling dengan SW-420 dan mengurangi alarm palsu
SW-420 yang dipasang di kaca jendela, sepeda, laci, atau brankas bisa menjadi jantung alarm maling sederhana. Yang membedakan alarm yang bagus dari yang buruk bukan terutama soal pendeteksian, melainkan bagaimana ia menyaring alarm palsu. Kode di bawah melakukannya dalam tiga lapis: setelah diaktifkan, ia memberi jeda keluar 10 detik, ia terpicu bukan oleh satu ketukan tapi ketika melihat minimal 5 pulsa dalam 1 detik, dan ia mengabaikan pulsa baru selama 15 detik sirene berbunyi. Alarm diaktifkan dan dimatikan dengan tombol di D4, buzzer aktif ada di D8, dan LED status di D13. Untuk sistem yang lebih lengkap, lihat panduan sistem alarm Arduino.
1const byte VIB_PIN = 2; // SW-420 DO (INT0)
2const byte BUTTON_PIN = 4; // kur / kapat butonu, D4 ile GND arası / arm-disarm button
3const byte BUZZER_PIN = 8; // aktif buzzer / active buzzer
4const byte LED_PIN = 13; // durum LED'i / status LED
5const unsigned int MIN_PULSES = 5; // pencerede gereken darbe / pulses needed in the window
6const unsigned long WINDOW_MS = 1000; // sayım penceresi / counting window
7const unsigned long EXIT_DELAY_MS = 10000; // kurduktan sonra çıkış süresi / exit delay after arming
8const unsigned long ALARM_MS = 15000; // siren süresi / siren duration
9
10enum AlarmState { DISARMED, ARMING, ARMED, ALARM };
11AlarmState state = DISARMED;
12
13volatile unsigned int pulses = 0;
14unsigned long stateTime = 0;
15unsigned long windowStart = 0;
16unsigned long lastPress = 0;
17bool lastButton = HIGH;
18
19void onVibration() {
20 pulses++;
21}
22
23void setState(AlarmState s) {
24 state = s;
25 stateTime = millis();
26 digitalWrite(BUZZER_PIN, LOW);
27 noInterrupts();
28 pulses = 0; // eski darbeleri sil / discard old pulses
29 interrupts();
30 windowStart = millis();
31}
32
33void setup() {
34 pinMode(VIB_PIN, INPUT);
35 pinMode(BUTTON_PIN, INPUT_PULLUP);
36 pinMode(BUZZER_PIN, OUTPUT);
37 pinMode(LED_PIN, OUTPUT);
38 attachInterrupt(digitalPinToInterrupt(VIB_PIN), onVibration, RISING);
39 Serial.begin(9600);
40}
41
42void loop() {
43 bool button = digitalRead(BUTTON_PIN);
44 if (button == LOW && lastButton == HIGH && millis() - lastPress > 200) {
45 lastPress = millis();
46 setState(state == DISARMED ? ARMING : DISARMED);
47 Serial.println(state == ARMING ? F("Kuruluyor / arming") : F("Kapatildi / disarmed"));
48 }
49 lastButton = button;
50
51 if (millis() - windowStart >= WINDOW_MS) { // her saniye darbe sayısına bak / check the pulse count every second
52 noInterrupts();
53 unsigned int n = pulses;
54 pulses = 0;
55 interrupts();
56 windowStart = millis();
57 if (state == ARMED && n >= MIN_PULSES) {
58 setState(ALARM);
59 Serial.print(F("ALARM! darbe / pulses: "));
60 Serial.println(n);
61 }
62 }
63
64 switch (state) {
65 case DISARMED:
66 digitalWrite(LED_PIN, LOW);
67 break;
68 case ARMING: // hızlı yanıp sönme: çıkış süresi / fast blink: exit delay
69 digitalWrite(LED_PIN, (millis() / 250) % 2);
70 if (millis() - stateTime >= EXIT_DELAY_MS) setState(ARMED);
71 break;
72 case ARMED:
73 digitalWrite(LED_PIN, HIGH);
74 break;
75 case ALARM: // kesik kesik siren / intermittent siren
76 digitalWrite(BUZZER_PIN, (millis() / 300) % 2);
77 if (millis() - stateTime >= ALARM_MS) setState(ARMED);
78 break;
79 }
80}Selain lewat kode, banyak hal yang bisa kamu lakukan untuk mengurangi alarm palsu:
- Pemasangan yang kokoh: Pasang modul ke permukaan dengan sekrup M3 atau lem yang keras; board yang longgar dan goyang akan bergetar sendiri.
- Jauhkan buzzer: Kalau sirene dipasang di board atau kotak yang sama dengan sensor, getarannya sendiri bisa memicu alarm lagi.
- Atur sensitivitas di tempatnya: Setel potensiometer di permukaan tempat sensor akhirnya dipasang, bukan di meja kerjamu.
- Kabel pendek dan terpasang kuat: Kabel panjang yang menggantung di udara menangkap derau; kalau perlu, pasang 100 nF antara DO dan GND.
- Pakai dua sensor: Di titik yang penting, mensyaratkan dua sensor terpicu bersamaan dalam waktu singkat sangat mengurangi alarm palsu.
- Konfirmasi dengan sensor lain: Menggabungkan getaran dengan sensor gerak PIR atau sensor pintu meningkatkan keandalan.
Bisakah membuat alarm gempa dengan SW-420? Batasan dan MPU6050
Alarm gempa adalah salah satu ide proyek sensor getaran yang paling populer, dan ini proyek yang mendidik; tapi penting untuk tahu batasannya. SW-420 hanya bilang “ada yang bergoyang”: ia tidak bisa mengukur percepatan, arah, atau frekuensi guncangan. Karena itu ia bereaksi sama terhadap pintu yang dibanting, truk yang lewat, mesin cuci yang sedang memeras (spin), atau gempa sungguhan. Yang lebih penting, satu sensor hanya mendeteksi guncangan setelah guncangan itu sampai di tempatnya. Sistem peringatan dini gempa resmi menggabungkan pengukuran dari banyak stasiun di dekat episentrum dan mengirim peringatan ke daerah yang jauh sebelum guncangan tiba; Arduino di rumah tidak bisa menggantikannya dan tidak boleh dipakai sebagai alat keselamatan jiwa.
Kalau ingin proyek gempamu lebih bermakna, naik level ke modul akselerometer dan giroskop MPU6050. MPU6050 mengukur percepatan di tiga sumbu dengan resolusi 16-bit dan rentang yang bisa dipilih dari ±2 g sampai ±16 g. Dengan begitu kamu bisa menghitung percepatan tanah puncak (PGA, peak ground acceleration) dari sebuah guncangan, membedakan pintu yang dibanting dari gerakan tanah yang panjang dengan melihat berapa detik percepatan itu berlangsung dan frekuensinya, serta mencatat datanya untuk dipelajari nanti. Memakai kedua sensor bersama juga masuk akal: SW-420 menunggu dengan daya yang sangat kecil dan membangunkan mikrokontroler pada getaran pertama, sementara MPU6050 melakukan pengukuran detailnya.

| Fitur | SW-420 | MPU6050 |
|---|---|---|
| Apa yang diukur? | Ada atau tidaknya getaran | Percepatan dan kecepatan putar di 3 sumbu |
| Output | Pulsa digital (DO) | I2C, data digital 16-bit |
| Sensitivitas | Potensiometer, kasar | Lewat software, ±2 g sampai ±16 g |
| Arah | Tidak ada | Ada (X, Y, Z) |
| Proyek gempa | Hanya peringatan “ada yang bergoyang” | Analisis percepatan puncak, durasi, dan frekuensi |
| Kode | Beberapa baris, tanpa library | Butuh library dan penyaringan |
| Harga | Sangat murah | Murah |
Notifikasi Telegram dari ESP32 ketika getaran terdeteksi
Dengan ESP32, sensor getaran bisa memberi tahu ponselmu ketika terjadi sesuatu pada brankas, sepeda, atau mesin selagi kamu jauh dari rumah. Untuk itu kamu perlu membuat bot dengan BotFather di Telegram, mendapatkan token dan chat ID-mu sendiri, lalu menginstal library UniversalTelegramBot dan ArduinoJson di Arduino IDE; langkah-langkah ini kami jelaskan secara detail di panduan bot Telegram ESP32. Kode di bawah menghitung pulsa dengan interrupt, mengirim pesan ketika melihat minimal 5 pulsa dalam 1 detik, dan menunggu minimal 60 detik di antara dua pesan supaya ponselmu tidak dibanjiri puluhan notifikasi per menit. Karena ESP32 punya dua inti, penghitungnya dilindungi dengan kunci portMUX.
1#include <WiFi.h>
2#include <WiFiClientSecure.h>
3#include <UniversalTelegramBot.h>
4#include <ArduinoJson.h>
5
6const char* WIFI_SSID = "AgAdi"; // Wi-Fi adın (2,4 GHz) / your Wi-Fi name (2.4 GHz)
7const char* WIFI_PASS = "Sifre123"; // Wi-Fi şifren / your Wi-Fi password
8#define BOT_TOKEN "1234567890:AAExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // BotFather'ın verdiği token / token from BotFather
9#define CHAT_ID "123456789" // kendi Telegram ID'n / your own Telegram ID
10
11const int VIB_PIN = 27; // SW-420 DO (modül 3V3 ile) / module powered from 3V3
12const unsigned long MIN_PULSES = 5; // 1 sn'de gereken darbe / pulses needed in 1 s
13const unsigned long WINDOW_MS = 1000;
14const unsigned long COOLDOWN_MS = 60000; // iki mesaj arası en az 60 sn / at least 60 s between messages
15
16volatile unsigned long pulseCount = 0;
17portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;
18unsigned long windowStart = 0;
19unsigned long lastAlert = 0;
20bool alertSent = false;
21
22WiFiClientSecure client;
23UniversalTelegramBot bot(BOT_TOKEN, client);
24
25void IRAM_ATTR onVibration() { // kesme fonksiyonu RAM'de / interrupt handler in RAM
26 portENTER_CRITICAL_ISR(&mux);
27 pulseCount++;
28 portEXIT_CRITICAL_ISR(&mux);
29}
30
31void setup() {
32 Serial.begin(115200);
33 pinMode(VIB_PIN, INPUT);
34 attachInterrupt(digitalPinToInterrupt(VIB_PIN), onVibration, RISING);
35
36 WiFi.mode(WIFI_STA);
37 WiFi.begin(WIFI_SSID, WIFI_PASS);
38 while (WiFi.status() != WL_CONNECTED) {
39 delay(500);
40 Serial.print(".");
41 }
42 Serial.println();
43 client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // api.telegram.org kök sertifikası / root certificate
44 bot.sendMessage(CHAT_ID, "Titreşim alarmı hazır / vibration alarm ready", "");
45 windowStart = millis();
46}
47
48void loop() {
49 if (millis() - windowStart < WINDOW_MS) return;
50 windowStart = millis();
51
52 portENTER_CRITICAL(&mux); // sayacı güvenle oku ve sıfırla / read and reset safely
53 unsigned long n = pulseCount;
54 pulseCount = 0;
55 portEXIT_CRITICAL(&mux);
56
57 if (n >= MIN_PULSES && (!alertSent || millis() - lastAlert >= COOLDOWN_MS)) {
58 lastAlert = millis();
59 alertSent = true;
60 String msg = "Titreşim algılandı / vibration detected: " + String(n) + " darbe / pulses";
61 Serial.println(msg);
62 if (!bot.sendMessage(CHAT_ID, msg, "")) {
63 Serial.println("Mesaj gonderilemedi / message failed");
64 }
65 }
66}Mengirim pesan ke Telegram bisa memakan waktu 1–2 detik; selama itu loop menunggu, tapi karena interrupt tetap berjalan, pulsa yang masuk menumpuk di penghitung dan tidak hilang. Kalau ingin menjalankan sensor dengan baterai, masukkan ESP32 ke mode deep sleep dan jadikan pin DO SW-420 sebagai sumber bangun (wake-up) dengan esp_sleep_enable_ext0_wakeup(); ESP32 lalu hanya bangun ketika ada getaran, mengirim pesan, dan tidur lagi. Dalam hal ini, pilih salah satu GPIO RTC sebagai pin bangun; GPIO 27 termasuk dalam kelompok itu.
SW-420 dengan Raspberry Pi Pico (MicroPython)
Di Pico, beri daya modul dari pin 3V3(OUT) dan hubungkan DO ke GP15. Kode di bawah memakai logika kejadian yang sama dengan versi Arduino: menghitung pulsa dengan interrupt, menyalakan LED bawaan board pada pulsa pertama, dan setelah 500 ms tanpa pulsa, mencetak durasi dan jumlah pulsa kejadian itu. Nama Pin("LED") memilih LED bawaan di Pico maupun Pico W.
1from machine import Pin, disable_irq, enable_irq
2import time
3
4vib = Pin(15, Pin.IN) # SW-420 DO (modül 3V3 ile) / module powered from 3V3
5led = Pin("LED", Pin.OUT) # dahili LED / onboard LED
6QUIET_MS = 500 # olayı bitiren sessizlik / silence that ends an event
7
8pulses = 0
9def on_vibration(pin):
10 global pulses
11 pulses += 1
12
13vib.irq(trigger=Pin.IRQ_RISING, handler=on_vibration)
14
15event_start = None
16event_pulses = 0
17last_pulse = 0
18while True:
19 state = disable_irq() # sayacı güvenle oku / read the counter safely
20 n = pulses
21 pulses = 0
22 enable_irq(state)
23
24 now = time.ticks_ms()
25 if n:
26 if event_start is None: # yeni olay / new event
27 event_start = now
28 event_pulses = 0
29 led.on()
30 event_pulses += n
31 last_pulse = now
32 elif event_start is not None and time.ticks_diff(now, last_pulse) > QUIET_MS:
33 duration = time.ticks_diff(last_pulse, event_start)
34 print("Titresim / vibration: %d ms, %d darbe / pulses" % (duration, event_pulses))
35 event_start = None
36 led.off()
37 time.sleep_ms(20)Ide proyek dengan sensor getaran
- Alarm sepeda dan motor: Kotak kecil yang berbunyi ketika kendaraan yang diparkir diguncang dan memberi tahu ponselmu lewat ESP32.
- Pemberi tahu mesin cuci selesai: Sensor yang mengirim pesan “cucian selesai” ketika getaran sudah berhenti selama 5 menit.
- Detektor ketukan rahasia: Kunci yang terbuka ketika seseorang mengetuk dengan ritme tertentu; cara kerjanya dengan membandingkan jeda waktu antar-kejadian guncangan.
- Penghitung jam kerja mesin: Penghitung yang mencatat berapa jam sehari sebuah kompresor, pompa, atau printer 3D bekerja.
- Brankas elektronik: Pengaman yang membunyikan alarm ketika brankas dibongkar paksa, bekerja bersama kunci kode; gabungkan dengan panduan kunci kode keypad.
- Game dan meja interaktif: Game drum atau game reaksi yang mengeluarkan cahaya dan suara ketika kamu memukul meja.
Kesalahan umum dan cara memperbaikinya
| Gejala | Kemungkinan penyebab | Solusi |
|---|---|---|
| Getaran ringan tidak terdeteksi | Pulsa dibaca dengan digitalRead() di loop() dan terlewat | Pakai interrupt dengan attachInterrupt() |
| Sensor terus terpicu | Sensitivitas terlalu tinggi atau board longgar | Atur potensiometer di tempatnya dan sekrup board-nya |
| Alarm berbunyi lagi dengan sendirinya | Getaran buzzer sampai ke sensor | Pasang buzzer jauh dari sensor, di permukaan terpisah |
| Logikanya terbalik | Output DO terbalik pada modul klon | Uji dengan Serial Monitor dan pakai FALLING kalau perlu |
| Pin ESP32 rusak atau tidak stabil | Modul diberi daya 5 V, jadi DO mengeluarkan 5 V | Beri daya modul dari 3,3 V |
| Puluhan pesan masuk ke ponsel | Tidak ada jeda antar-notifikasi | Pakai jeda (cooldown) minimal 60 detik di kode |
SW-420 adalah cara paling murah dan paling mudah untuk mengetahui bahwa sebuah permukaan terguncang; kekuatan sebenarnya muncul ketika kamu menangkap dan menghitung pulsa dengan interrupt lalu membaca hasilnya bersama durasi dan kepadatannya. Atur sensitivitas di tempatnya, saring alarm palsu lewat software, dan beralihlah ke MPU6050 kalau kamu butuh kekuatan atau arah guncangan. Di aplikasi BlueGrays, kamu akan menemukan proyek Menggunakan Buzzer, Pendeteksi Gerakan dengan Sensor Gerak, dan Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram), bersama Brankas Elektronik Pintar, lengkap dengan skema rangkaian dan kode langkah demi langkah.
Pertanyaan umum
Bagaimana cara kerja sensor getaran?
Sensor getaran seperti SW-420 berisi pegas dan bagian konduktif di dalam selubung logam. Ketika sensor diam, kontaknya tertutup; ketika terguncang, pegas berayun dan kontak membuka-menutup dalam semburan sangat pendek. Komparator LM393 di modul mengubah perubahan ini menjadi sinyal digital yang bersih berdasarkan ambang yang diatur dengan potensiometer.
Bagaimana cara mengatur sensitivitas SW-420?
Potensiometer di modul mengubah ambang komparator. Pasang sensor di permukaan tempat ia akan dipakai, putar potensiometer sampai titik di mana LED sinyal tetap stabil ketika diam tapi bereaksi pada ketukan ringan, lalu kurangi sensitivitas sedikit untuk menyisakan margin aman. Karena pengaturannya bergantung pada bahan permukaan, lakukan di tempatnya, bukan di meja kerjamu.
Kenapa SW-420 melewatkan sebagian getaran?
Selama ada getaran, output SW-420 hanya menghasilkan pulsa yang sangat pendek. Kalau kodemu membaca pin dengan digitalRead() di loop() dan pada momen itu sedang sibuk dengan delay() atau Serial.print(), pulsanya terlewat. Solusinya adalah memakai interrupt dengan attachInterrupt() dan menghitung pulsa di fungsi interrupt.
Bisakah membuat detektor gempa dengan sensor getaran?
Kamu bisa membuat alarm guncangan sederhana untuk belajar, tapi SW-420 hanya mendeteksi ada atau tidaknya getaran; ia tidak bisa mengukur kekuatan atau arahnya dan tidak bisa membedakan kejadian seperti pintu yang dibanting dari gempa. Satu sensor hanya menyadari guncangan setelah guncangan itu sampai ke sensor. Untuk pengukuran yang lebih bermakna, pakai akselerometer seperti MPU6050, dan jangan pernah menganggap proyek semacam ini sebagai pengganti sistem peringatan dini resmi.
Bisakah SW-420 dipakai dengan ESP32?
Bisa. Beri daya modul dari pin 3V3 ESP32 dan hubungkan output DO ke pin digital seperti GPIO 27. Kalau modul diberi daya 5 V, output DO juga 5 V dan bisa merusak pin ESP32. Di ESP32, deklarasikan fungsi interrupt dengan IRAM_ATTR dan lindungi penghitung bersama dengan kunci portMUX.
Apa perbedaan SW-420 dan SW-18010P?
Keduanya sakelar getaran pegas, tapi susunan kontaknya berbeda. SW-420 bersifat normally closed, artinya kontak tertutup ketika diam dan terbuka ketika ada getaran. Tipe normally open seperti SW-18010P terbuka ketika diam dan tertutup sebentar ketika ada getaran. Kalau kamu memakainya dalam bentuk modul, cukup cek level output dengan Serial Monitor.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
Menggunakan Buzzer
Pernah penasaran bagaimana bel pintu atau alarm mengeluarkan suaranya? Arduino membuat buzzer kecil berbunyi bip dengan jeda singkat: bip, jeda, bip, jeda. Kamu melihat bagaimana suara dibuat dengan l

Kendali LED dengan Tombol Tekan (Tekan)
Persis seperti bel pintu: lampu tetap menyala selama kamu menekan, dan mati ketika kamu melepasnya. Arduino terus mendengarkan tombol; selama ditekan LED menyala, dan begitu jarimu terangkat LED mati.

Pendeteksi Gerakan dengan Sensor Gerak
Penjaga sederhana yang memberi tahu ketika ada orang masuk ke ruangan. Sensor gerak menangkap panas yang dipancarkan tubuh manusia, dan Arduino menjaga LED tetap menyala selama ada gerakan lalu memati

Bel Pintu dan Lampu dengan Sensor Gerak
Ketika ada orang datang ke pintumu, kamu sudah tahu bahkan sebelum ia membunyikan bel. Begitu sensor gerak melihat seseorang, LED menyala dan buzzer memainkan bunyi bel tiga nada dari tinggi ke rendah

Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)
Sistem alarm keamanan pintar yang menyalakan buzzer dan LED ketika sensor PIR mendeteksi gerakan, sekaligus mengirim notifikasi instan ke pemilik lewat Telegram. Cooldown 30 detik membatasi seberapa sering alarm berulang; mekanisme ini tidak memvalidasi deteksi PIR atau menghilangkan pemicu palsu. Cocok untuk rumah, garasi, gudang, atau ruang kerja. Dengan ESP32-CAM bisa ditambahkan notifikasi berfoto; dengan ESP32 DevKit V1 klasik, notifikasinya berupa teks.

Brankas Elektronik Pintar
Brankas kecil untuk barang berhargamu yang terbuka dengan kode. Kamu mengetik kode empat digitmu di keypad; jika benar, motor servo membuka kunci, lampu hijau menyala, dan layar menampilkan keadaan br

Sistem Keamanan Laser
Persis seperti adegan perampokan dengan laser di film: sinar laser menyorot sensor cahaya, dan begitu ada orang masuk dan memutus sinarnya, LED merah menyala dan buzzer mulai berbunyi. Alarmnya tidak
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

