📳 سنسور لرزش SW-420 (SW-420 Vibration Sensor)
| اسم انگلیسی | SW-420 Vibration Sensor |
|---|---|
| در ووکوی (Wokwi) | نسخهی آمادهای سراغ نداریم |
| دسته | 🌡️ سنسورها |
| در شبیهساز فارسی | مود ساده (بدون کد) و مود آردوینو · رایگان |
سنسور لرزش SW-420 (Vibration Sensor) در شکل خامش یک استوانهی فلزی کوچک دوپایه است که داخلش یک فنر و یک میلهی فلزی هست. در حالت سکون اتصال داخلی بسته است؛ با هر ضربه یا تکان، فنر میلرزد و مدار برای کسری از میلیثانیه قطع و وصل میشود. همین پالسهای کوتاه چیزی است که باید بشماری. با آن دزدگیر دوچرخه، حسگر ضربه به در، شمارندهی لرزش ماشین لباسشویی یا بازی «تکانش بده» میسازی.
سنسور لرزش در ووکوی (Wokwi)
تا جایی که میدانیم ووکوی نسخهی آمادهی این قطعه را ندارد. نزدیکترین جایگزین یک wokwi-pushbutton است: هر بار فشار دادنش مثل یک ضربه، لبههای قطع و وصل روی پین میسازد. پایهی 1.l را به پین 2 و 2.l را به GND وصل کن.
{
"parts": [
{ "type": "wokwi-arduino-uno", "id": "uno", "top": 0, "left": 0, "attrs": {} },
{ "type": "wokwi-pushbutton", "id": "btn1", "top": -100, "left": 150, "attrs": { "color": "yellow" } }
],
"connections": [
[ "btn1:1.l", "uno:2", "green", [] ],
[ "btn1:2.l", "uno:GND.1", "black", [] ]
]
}
خود SW-420 در تینکرکد فارسی، هم به شکل قطعهی خام و هم به شکل ماژول SW-420، رایگان شبیهسازی میشود.
سیمکشی با آردوینو
سنسور خام قطبیت ندارد. پین 2 را انتخاب کردهایم چون در اونو یکی از دو پینی است که وقفهی خارجی (Interrupt) دارند؛ دیگری پین 3 است.
| پایهی قطعه | وصل به |
|---|---|
| پایهی اول سنسور | پین 2 (با INPUT_PULLUP) |
| پایهی دوم سنسور | GND |
| LED نشانگر | LED داخلی برد روی پین 13 |
سنسور را محکم به جسمی که میخواهی لرزشش را حس کنی بچسبان یا پیچ کن. سنسوری که روی بردبورد آزاد افتاده، ضربه به میز را خیلی ضعیف حس میکند.
کد نمونه
پالسهای SW-420 آنقدر کوتاهاند که digitalRead در حلقه بیشترشان را از دست میدهد. برای همین هر تغییر پین یک وقفه صدا میزند که فقط یک شمارنده را زیاد میکند. حلقه هر نیم ثانیه شمارنده را میخواند و صفر میکند؛ اگر تعداد پالسها از حد گذشت، یعنی «تکان شدید» و LED روشن میشود. درس وقفهها (Interrupts) این ابزار را از پایه توضیح میدهد.
// Bare SW-420 on pin 2: count pulses with an interrupt.
const int SENSOR_PIN = 2; // pin 2 has an external interrupt on the Uno
const int SHAKE_LIMIT = 5; // pulses per half second that mean shaking
volatile unsigned int pulses = 0;
void onPulse() {
pulses++; // keep interrupt code tiny
}
void setup() {
Serial.begin(9600);
pinMode(SENSOR_PIN, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
attachInterrupt(digitalPinToInterrupt(SENSOR_PIN), onPulse, CHANGE);
}
void loop() {
delay(500);
noInterrupts(); // copy and clear the counter safely
unsigned int count = pulses;
pulses = 0;
interrupts();
if (count > 0) {
Serial.print("pulses: ");
Serial.println(count);
}
digitalWrite(LED_BUILTIN, count >= SHAKE_LIMIT ? HIGH : LOW);
}
با SHAKE_LIMIT حساسیت را تنظیم کن: عدد کم یعنی یک تقه هم هشدار میدهد و عدد زیاد یعنی فقط تکانهای طولانی.
اشتباههای رایج
- Serial.print داخل تابع وقفه: کد وقفه باید خیلی کوتاه باشد. چاپ کردن یا delay در آن برنامه را کند یا قفل میکند؛ فقط شمارنده را زیاد کن و بقیه را به loop بسپار.
- جا انداختن volatile: بدون
volatile، کامپایلر ممکن است فرض کندpulsesهیچوقت عوض نمیشود و همیشه صفر بخوانی. - پین بدون وقفه: در اونو فقط پینهای 2 و 3 وقفهی خارجی دارند. روی پین 7،
attachInterruptکار نمیکند. - اشتباه گرفتن با سنسور شیب: سنسور شیب میگوید جسم کج مانده یا نه؛ SW-420 فقط لحظهی تکان را میگوید و بعد دوباره آرام است.
آموزشهای مرتبط
- ماژول SW-420 با خروجی دیجیتال تمیز
- دکمه و وقفه (IRQ) روی رزبری پای پیکو
- دزدگیر با سنسور حرکت PIR
- پیزو بزرگ برای آژیر
سؤالهای رایج
چرا digitalRead لرزش را از دست میدهد؟
پالسهای سنسور SW-420 خیلی کوتاهاند و ممکن است بین دو خواندن حلقه تمام شوند. با attachInterrupt روی پین 2 یا 3 هر پالس، هر قدر هم کوتاه، شمرده میشود.
سنسور لرزش خام بهتر است یا ماژول SW-420؟
ماژول با مقایسهگر LM393 و پیچ حساسیت، خروجی تمیزتری میدهد و برای شروع سادهتر است. سنسور خام ارزانتر و کوچکتر است ولی به پولآپ و معمولاً وقفه نیاز دارد.