🚶 سنسور حرکت PIR با آردوینو: از دزدگیر ساده تا چراغ راهروی هوشمند
چراغ راهروی ساختمان که با رد شدن تو روشن میشود، یا دزدگیری که با یک قدم شروع به جیغ زدن میکند، هر دو یک قطعهی کوچک و ارزان دارند: سنسور حرکت PIR. در این آموزش میبینیم سنسور PIR دقیقاً چه چیزی را میبیند، دو پیچ نارنجی روی ماژول HC-SR501 چه کار میکنند، و با آردوینو اونو یک دزدگیر با بازر و شمارندهی حرکت میسازیم. در پایان هم یک چراغ راهروی هوشمند داریم که فقط در تاریکی روشن میشود. این مدار را میتوانی بدون خرید قطعه در شبیهساز فارسی هم بچینی؛ همان ایدهای که ووکوی (Wokwi) را معروف کرد، این بار به زبان خودمان.
PIR چطور حرکت را میبیند؟
PIR مخفف Passive InfraRed است، یعنی «مادون قرمز غیرفعال». «غیرفعال» یعنی سنسور خودش هیچ نوری نمیفرستد؛ فقط گوش میدهد. هر چیز گرمی، از جمله بدن ما، پرتوی مادون قرمز میتاباند. داخل سنسور یک حسگر پیروالکتریک با دو نیمه هست. وقتی همهچیز ساکن است، هر دو نیمه به یک اندازه گرما میبینند و اختلافی نیست. وقتی تو از جلویش رد میشوی، اول یک نیمه گرمای تو را میبیند و بعد دیگری. همین اختلاف است که مدار داخلی را تحریک میکند و خروجی را HIGH میکند.
آن گنبد سفید مات روی سنسور هم یک عدسی فرنل است که فضای جلوی سنسور را به چند ناحیهی کوچک تقسیم میکند تا رد شدن از هر ناحیه یک تغییر واضح بسازد. نتیجهی مهم این طرز کار: PIR تغییر را میبیند، نه حضور را. اگر جلوی آن کاملاً بیحرکت بایستی، بعد از مدتی دیگر تو را نمیبیند.
پایهها و تنظیمات ماژول HC-SR501
| بخش | کارش |
|---|---|
| VCC | تغذیهی ۵ ولت (ماژول معمولاً ۴٫۵ تا ۲۰ ولت را قبول میکند) |
| OUT | خروجی دیجیتال: حدود ۳٫۳ ولت هنگام حرکت، صفر در حالت آرام |
| GND | زمین |
| پیچ Sx (حساسیت) | برد دید را از حدود ۳ تا ۷ متر تنظیم میکند |
| پیچ Tx (زمان) | مدت HIGH ماندن خروجی بعد از حرکت، از چند ثانیه تا چند دقیقه |
| جامپر H / L | H: با هر حرکت تازه زمان تمدید میشود. L: یک بار HIGH و تمام |
۳٫۳ ولت خروجی برای آردوینو اونو HIGH حساب میشود، پس مستقیم به پین دیجیتال وصلش کن؛ نه مقاومت لازم است و نه مقسم ولتاژ. برای شروع، پیچ زمان را تا ته خلاف عقربهها بچرخان (کمترین زمان) و جامپر را روی H بگذار تا کنترل زمان دست کد خودت باشد.
قطعهها و سیمکشی
- یک آردوینو Uno
- یک سنسور حرکت PIR
- یک بازر
- یک LED قرمز با مقاومت ۲۲۰ اهم
| قطعه | پایه | آردوینو |
|---|---|---|
| PIR | VCC | 5V |
| PIR | OUT | پین 2 |
| PIR | GND | GND |
| بازر | + | پین 8 |
| بازر | − | GND |
| LED | آند (از راه مقاومت ۲۲۰) | پین 13 |
| LED | کاتد | GND |
کد کامل دزدگیر
// PIR motion sensor (HC-SR501) on an Arduino Uno.
// Beeps and counts once when motion starts, reports when it ends.
const int PIR_PIN = 2;
const int LED_PIN = 13;
const int BUZZER_PIN = 8;
const unsigned long WARMUP_MS = 30000; // the PIR needs ~30 s to settle
int lastState = LOW;
int motionCount = 0;
void setup() {
Serial.begin(9600);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
Serial.println("Warming up the PIR...");
delay(WARMUP_MS);
Serial.println("Ready!");
}
void loop() {
int state = digitalRead(PIR_PIN);
if (state == HIGH && lastState == LOW) { // motion just started
motionCount++;
Serial.print("Motion! count = ");
Serial.println(motionCount);
tone(BUZZER_PIN, 1200, 200);
}
if (state == LOW && lastState == HIGH) { // motion ended
Serial.println("All quiet.");
}
digitalWrite(LED_PIN, state); // LED mirrors the sensor
lastState = state;
delay(50);
}
توضیح کد
pinMode(PIR_PIN, INPUT);خروجی PIR خودش HIGH و LOW را محکم میسازد، پس بهINPUT_PULLUPنیازی نیست.delay(WARMUP_MS);سی ثانیهی اول، سنسور در حال یادگرفتن گرمای محیط است و ممکن است الکی تحریک شود. روی سنسور واقعی این صبر را حذف نکن. در شبیهساز برای تست سریعتر میتوانی عدد را موقتاً کم کنی.- تشخیص لبه: بهجای اینکه بپرسیم «الان HIGH است؟»، میپرسیم «الان HIGH است و دفعهی قبل LOW بود؟». این یعنی «همین الان حرکت شروع شد». بدون این ترفند، تا وقتی خروجی HIGH است، شمارنده در هر دور
loopبالا میرود و بازر بیوقفه بوق میزند. lastState = state;در آخر هر دور، وضعیت فعلی را برای مقایسهی دور بعد نگه میداریم. متغیر را بیرون ازloopتعریف کردهایم تا هر بار صفر نشود.digitalWrite(LED_PIN, state);LED دقیقاً همان چیزی را نشان میدهد که سنسور میبیند؛ برای تنظیم پیچها خیلی به کار میآید.
اجرا در شبیهساز، رایگان
سنسور PIR در تینکرکد فارسی جزو قطعههای رایگان آردوینو است. مثال آمادهی «دزدگیر PIR» مدار و کد را با هم بار میکند و درس ۲۵: دزدگیر با سنسور حرکت قدمبهقدم یک آژیر واقعی با صدای بالا و پایینرونده میسازد. در مود ساده (بدون کد) هم وقتی PIR را انتخاب کنی، گزینهی «حرکت میبینه؟» را در پنل ویژگیها داری و میتوانی واکنش مدار را بدون راه رفتن جلوی کامپیوتر ببینی. معنی دقیقتر این سنسور هم در واژهنامه: سنسور PIR آمده است.
پروژهی کوچک: چراغ راهروی هوشمند
چراغ راهرو نباید وسط روز روشن شود و نباید وقتی هنوز در راهرو هستی خاموش شود. پس دو قطعه اضافه میکنیم: یک سنسور نور LDR روی A0 (با یک مقاومت ۱۰ کیلواهم به GND، مثل آموزش LDR) و یک رله روی پین 7 برای لامپ. هر حرکت تازه، تایمر بیستثانیهای را از نو شروع میکند.
// Mini project: hallway light. On with motion, only when it is dark,
// and it stays on for 20 s after the last movement.
const int PIR_PIN = 2;
const int LDR_PIN = A0;
const int RELAY_PIN = 7;
const int DARK = 350; // below this the hallway is dark
const unsigned long HOLD_MS = 20000; // keep the light on for 20 s
unsigned long lastMotion = 0;
bool lightOn = false;
void setup() {
Serial.begin(9600);
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
}
void loop() {
bool dark = analogRead(LDR_PIN) < DARK;
if (digitalRead(PIR_PIN) == HIGH && (dark || lightOn)) {
lastMotion = millis(); // every movement restarts the timer
if (!lightOn) Serial.println("Light ON");
lightOn = true;
}
if (lightOn && millis() - lastMotion > HOLD_MS) {
lightOn = false;
Serial.println("Light OFF");
}
digitalWrite(RELAY_PIN, lightOn ? HIGH : LOW);
delay(50);
}
به شرط (dark || lightOn) دقت کن. وقتی لامپ روشن شد، خودش راهرو را روشن میکند و LDR دیگر «تاریکی» نمیبیند. اگر فقط dark را چک میکردیم، حرکتهای بعدی تایمر را تمدید نمیکردند و چراغ وسط راه رفتن تو خاموش میشد. نسخهی کامل همین ایده در مثال «خانهی هوشمند» آماده است و برای کار با لامپ واقعی ۲۲۰ ولت حتماً آموزش ماژول رله را بخوان.
اشکالهای رایج
- خروجی همیشه HIGH است: پیچ Tx روی زمان طولانی است (تا چند دقیقه). آن را تا ته خلاف عقربهها بچرخان، یا جامپر روی H است و هنوز در دید سنسور تکان میخوری.
- بیدلیل تحریک میشود: سنسور هنوز گرم نشده، یا جلوی بخاری، کولر، پنجرهی آفتابگیر یا پردهی تکانخور است. هر تغییر گرمایی برایش حرکت است.
- بازر بیوقفه بوق میزند: تشخیص لبه را جا انداختهای و در هر دور
loopکه خروجی HIGH است، دوباره بوق میزنی. - حرکت آرام را نمیبیند: PIR حرکت از عرض (رد شدن از جلوی سنسور) را خیلی بهتر از حرکت مستقیم به سمت خودش میبیند. سنسور را طوری نصب کن که مسیر رفتوآمد از جلویش رد شود.
- VCC را به 3.3V وصل کردهای: HC-SR501 برای کار مطمئن ۵ ولت میخواهد. برای بردهای ۳٫۳ ولتی مدلهای کوچکتری مثل AM312 هستند.
دزدگیرت را با رمز مسلح و غیرمسلح کن: کیپد ۴×۴ با آردوینو را بخوان و بعد مثال «دزدگیر کامل» را ببین. سنسورهای دیگر هم در بخش سنسورها منتظرند و همهی پروژههای این برد در صفحهی شبیهساز آردوینو هستند.
دزدگیر PIR را رایگان اجرا کن 🚶سؤالهای رایج
چرا سنسور PIR بعد از روشن شدن بیدلیل تحریک میشود؟
PIR بعد از روشن شدن حدود سی ثانیه تا یک دقیقه وقت لازم دارد تا تصویر حرارتی محیط را یاد بگیرد. در این مدت خروجیاش قابل اعتماد نیست؛ برای همین در کد یک تأخیر گرم شدن میگذاریم.
برد سنسور PIR چقدر است؟
ماژول رایج HC-SR501 معمولاً بین سه تا هفت متر را با زاویهای حدود ۱۲۰ درجه میبیند و با پیچ Sx روی ماژول تنظیم میشود.
آیا PIR از پشت شیشه حرکت را میبیند؟
معمولاً نه. شیشهی معمولی بیشتر پرتوی مادون قرمز گرمای بدن را رد نمیکند، پس PIR پشت پنجره عملاً کور است.