HC-SR501 tidak mengesan manusia β ia mengesan perubahan pada infrared yang sampai ke dua kepingan pengesannya. Satu ayat itu sudah menjelaskan dua aduan klasik: lampu yang tak pernah padam, dan sensor yang “lupa” anda sebaik sahaja anda berdiri diam. Resipinya pendek β trimmer Tx pada minimum, jumper pada L, hold time disimpan dalam kod β dan selepas itu Arduino yang memegang timing, bukan lagi bergaduh dengan sensor.
Apa yang anda perlukan untuk bina lampu automatik HC-SR501?
HC-SR501 hanya perlukan tiga wayar dan tiada apa-apa lagi: kuasa, ground, dan satu pin signal masuk ke Arduino. Selebihnya di bawah sensor itu ialah bahagian output β satu LED untuk melihat trigger, satu buzzer untuk mendengarnya, dan satu breadboard supaya tiada apa-apa perlu disolder.
Senarai komponen β lampu automatik dan penggera HC-SR501
Parts list
| Item | Price | Qty | |
|---|---|---|---|
Relay Module 3.3V 5V 12V 1/2/4/8 Ways Optocoupler Trigger Relay Module 1 2 4 8 Channel Relay Module - 5V RELAY MODULE(1WAY)1WRELAY | RM3.15 |
Tukar LED tunggal itu kepada LED strip 12 V sebenar atau lampu DC β 12 V itu anda bekalkan berasingan, ia bukan datang dari Arduino. DC voltan rendah sahaja; baca panduan keselamatan relay kami sebelum mewayarkan apa-apa yang lebih besar.
Dua butiran gender penyambung menentukan sama ada binaan ini bebas solder. HC-SR501 dan modul buzzer MH-FMD kedua-duanya menawarkan pin male, jadi ia perlukan hujung female pada jumper male-to-female; jumper male-to-male pula menguruskan sambungan breadboard-ke-Uno, manakala kaki LED merah 5 mm dan kaki resistor mencucuk terus ke dalam breadboard. Uno diprogram melalui USB-B bersaiz penuh, jadi ia perlukan kabel A-to-B. Mana-mana resistor dari 220 Ξ© hingga 1 kΞ© sudah memadai kalau anda memang sudah ada; pek 400 biji ialah pilihan resistor tetap dalam katalog kami.
Kenapa sensor PIR nampak pergerakan tetapi bukan manusia?
Elemen pengesan HC-SR501 ialah detektor pyroelectric yang mengandungi dua kepingan kristal yang diwayarkan secara bertentangan. Objek suam memancarkan infrared sekitar 8β14 Β΅m; apabila pancaran itu jatuh sama rata pada kedua-dua kepingan, outputnya saling membatalkan dan modul membaca sifar. Bilik yang penuh dengan perabot suam, atau seseorang yang berdiri betul-betul diam, menghasilkan gambaran seimbang yang tidak berubah itulah β sebab itu PIR buta terhadap badan yang tidak bergerak, tidak kira sepanas mana pun badan itu.
Dome putih bercorak sarang lebah itu ialah kanta Fresnel, dan itulah yang menukar kelemahan tadi menjadi pengesan pergerakan. Setiap fasetnya memfokuskan satu bilah sempit bilik yang berlainan ke atas elemen tersebut, jadi medan pandangannya bukan satu kon licin tetapi berpuluh-puluh pancaran berselang-seli di dalam kon lebih kurang 120Β° yang mencapai 3β7 m. Berjalan melintasi pancaran itu, dan haba anda jatuh pada satu kepingan, kemudian pada kepingan satu lagi, menghasilkan denyut positif diikuti denyut negatif β satu perubahan yang boleh dilihat oleh amplifier. Berjalan terus menghala ke arah sensor pula melintasi jauh lebih sedikit sempadan pancaran, dan sebab itulah pendekatan dari hadapan trigger lebih lambat dan kurang boleh diharap berbanding lalu-lalang yang melintang.
Fizik yang sama menjelaskan warm-up. Rantaian amplifier itu berjalan pada gain yang amat tinggi dan hanya melalukan perubahan, jadi ketika baru dihidupkan ia perlu duduk diam ke garis asasnya sendiri dahulu. Beri modul itu lebih kurang seminit selepas dihidupkan, dan dalam tempoh itu ia memang akan trigger walaupun tiada apa-apa berlaku.

Bagaimana cara wayar HC-SR501, LED dan buzzer ke Uno?
Output HC-SR501 ialah 3.3 V, bukan 5 V, kerana modul ini menurunkan bekalannya sendiri dan peringkat outputnya berayun ke rel dalaman itu. Uno membaca HIGH bermula dari 0.6 Γ VCC ke atas β 3.0 V pada board 5 V β jadi 3.3 V melepasi ambang itu dengan lebihan 0.3 V.
| Dari | Ke | Kenapa |
|---|---|---|
| VCC HC-SR501 (salah satu pin luar) | Uno 5V | Modul menerima 5β20 V dan menjana rel logiknya sendiri |
| OUT HC-SR501 (sentiasa pin tengah) | Uno D2 | 3.3 V semasa trigger, 0 V semasa idle |
| GND HC-SR501 (pin luar yang satu lagi) | Uno GND | Return dikongsi. Dua pin luar itu bertukar tempat antara revisi board, dan silkscreen VCC/GND biasanya berada pada board di bawah dome putih, bukan di sebelah header β baca board anda sendiri sebelum menghidupkan kuasa, kerana menyongsangkan VCC dan GND memandu modul secara terbalik dan boleh merosakkannya |
| VCC / GND buzzer | Uno 5V / GND | Modul ini ada transistor pemandunya sendiri |
| I/O buzzer | Uno D8 | Berbunyi apabila pin ini ditarik ke LOW |
| Kaki panjang LED (anode) + satu kaki resistor 220 Ξ© | Baris breadboard yang sama | Breadboard itulah yang menyambungkan kedua-duanya β lima lubang dalam satu baris ialah satu node, jadi tiada solder diperlukan |
| Kaki resistor yang satu lagi (barisnya sendiri) | Uno D9 | (5 β 2.0) V Γ· 220 Ξ© β 14 mA, di dalam had 20 mA bagi setiap pin |
| Kaki pendek LED (cathode, barisnya sendiri) | Uno GND | Jumper male-to-male melengkapkan litar |
Silkscreen modul MH-FMD menandakan I/O sebagai trigger aras rendah, jadi transistornya menghidupkan buzzer apabila pin itu turun ke low β maknanya pin output yang baru sahaja dikonfigurasi, yang duduk pada 0 V, akan membuatkannya menjerit sebaik board boot. Sketch di bawah menulis HIGH sebelum memanggil pinMode(OUTPUT), dan ia berkesan kerana digitalWrite() menetapkan bit port-register yang sama dalam kedua-dua keadaan: pada input, bit itu cuma mengaktifkan pull-up, dan sebaik sahaja pin bertukar menjadi output, bit yang sama itu sudah pun menjadi aras output, jadi pin itu tidak pernah dipandu ke 0 V.
Apa sebenarnya kerja dua trimmer oren dan jumper kuning itu?
HC-SR501 membawa hardware timingnya sendiri, dan itulah bahagian yang senyap-senyap melawan kod anda. Satu trimmer oren menetapkan sensitiviti β sejauh mana sesuatu badan masih dikesan, lebih kurang 3 m hingga 7 m. Satu lagi menetapkan Tx, iaitu berapa lama OUT kekal high selepas satu trigger, dari beberapa saat pada satu hujung hingga lebih kurang lima minit pada hujung satu lagi. Jumper kuning pula memilih mod retrigger. Pada H, pergerakan dalam tempoh Tx akan memulakan semula timer, jadi OUT kekal high selagi ada orang bergerak. Pada L ia berjalan sekali sahaja dan jatuh tanpa mengira apa-apa. Dua-dua mod pun diikuti satu tetingkap buta tetap kira-kira 2.5 s sebelum apa-apa boleh trigger semula β tidak nampak pada H, tetapi terasa selepas setiap denyut pada L.
Board HC-SR501 datang dari beberapa kilang dan panduan yang diterbitkan di luar sana bercanggah antara satu sama lain tentang trimmer mana duduk di mana, jadi kenal pasti board anda sendiri dalam masa seminit, dengan kuasa hidup dan sketch sedang berjalan:
- Pusing kedua-dua trimmer perlahan-lahan lawan jam sampai ke hujungnya dengan skru pemutar flat yang kecil. Jangan paksa.
- Lambai sekali, kemudian ambil masa berapa lama LED itu menyala. Pusing satu trimmer suku pusingan ikut jam dan lambai sekali lagi. Kalau tempoh menyala berubah, itulah Tx; kalau yang berubah cuma jarak anda mula disedari, itulah sensitiviti.
- Tandakan yang Tx itu dengan satu titik pen marker.
Tetapan yang membuatkan timing perisian benar-benar berfungsi ialah Tx pada minimumnya dan jumper pada L. Pada minimum, Tx menahan output high selama lebih kurang tiga saat, dan tetingkap buta selepasnya pula lebih kurang sama besar, jadi seseorang yang bergerak berterusan tetap men-trigger semula output sekurang-kurangnya sekali setiap enam saat lebih kurang. Mana-mana hold time dalam kod yang selesa lebih panjang daripada itu β sepuluh saat ke atas β tidak mungkin dipotong pendek oleh dead time sensor itu sendiri.
| Simptom | Punca | Penyelesaian |
|---|---|---|
| Lampu kekal menyala berminit-minit selepas semua orang keluar | Tx dipusing ikut jam; pada H, setiap orang yang lalu memulakannya semula | Tx ke minimum, jumper ke L, simpan tempohnya dalam kod |
| Output jatuh sedangkan anda masih berada di dalam bilik | Anda berhenti bergerak β kepingan kembali seimbang, tiada perubahan | Memang begitu perangainya; panjangkan hold time dalam kod |
| Lambaian kedua sejurus selepas yang pertama diabaikan | Tetingkap buta selepas setiap denyut | Tunggu beberapa saat, atau guna H supaya timer disegarkan semula |
| Trigger merapu sepanjang minit pertama selepas dihidupkan | Amplifier masih duduk diam ke garis asasnya | Abaikan pin itu sehingga tempoh warm-up tamat |
Menukar nilai delay() tetapi tiada apa-apa berubah |
Tx lebih panjang daripada timing kod anda | Turunkan Tx dahulu sebelum menyalahkan sketch |
Melihat skru pemutar benar-benar memusing trimmer itu memang membantu:

Sketch: biar Arduino yang memegang hold time
Tiada library diperlukan: PIR ialah input digital biasa, jadi digitalRead() dan millis() sudah cukup sebagai peralatan. Upload dengan board ditetapkan kepada Arduino Uno, kemudian buka Serial Monitor pada 9600 baud. Tiada apa-apa di sini memanggil delay(), jadi bunyi chirp dan timer lampu berjalan berasingan. Ia dikompil menjadi 2,318 bait, lebih kurang 7% daripada flash Uno.
// Lampu automatik + bip penggera HC-SR501, dengan hold time dipegang oleh sketch ini.
// Tetapan sensor yang dijangka: trimmer Tx pada minimum, jumper pada L.
const uint8_t PIR_PIN = 2; // OUT HC-SR501 (pin tengah pada header 3 pinnya)
const uint8_t LED_PIN = 9; // Anode LED melalui resistor 220 ohm ke GND
const uint8_t BUZZER_PIN = 8; // I/O buzzer aktif MH-FMD - ia berbunyi pada LOW
const unsigned long WARMUP_MS = 60000UL; // abaikan sensor selagi ia sedang duduk diam
const unsigned long HOLD_MS = 15000UL; // berapa lama lampu kekal menyala
const unsigned long BEEP_MS = 300UL; // satu chirp pendek bagi setiap tetamu baharu
bool lightOn = false;
unsigned long lastMotionMs = 0;
bool beeping = false;
unsigned long beepStartedMs = 0;
// Modul buzzer ini ialah trigger aras-LOW: menarik I/O ke LOW membuatkan ia berbunyi.
void buzzer(bool on) {
digitalWrite(BUZZER_PIN, on ? LOW : HIGH);
}
void setup() {
Serial.begin(9600);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
// Tetapkan arasnya SEBELUM pin menjadi output. Pin output yang baharu
// bermula pada LOW, dan LOW itulah yang membuatkan buzzer ini menjerit,
// jadi menulis HIGH dahulu (ia mengaktifkan pull-up) menjadikan boot senyap.
digitalWrite(BUZZER_PIN, HIGH);
pinMode(BUZZER_PIN, OUTPUT);
Serial.println(F("Warming up - ignoring the sensor for about a minute."));
}
void loop() {
unsigned long now = millis();
// Menolak unsigned long kekal betul apabila millis() rollover, dan sebab itulah
// timer hold dan beep di bawah ditulis sebagai (now - then >= limit).
// Warm-up pula ujian sekali sahaja ke atas millis() itu sendiri, jadi ia cuma
// berjalan sekali lagi selama seminit kalau board masih hidup pada rollover 49 hari.
bool warmedUp = (now >= WARMUP_MS);
bool motion = (digitalRead(PIR_PIN) == HIGH);
if (motion && warmedUp) {
lastMotionMs = now; // segarkan semula hold pada setiap denyut
if (!lightOn) { // tetamu BAHARU, bukan orang sama yang masih bergerak
lightOn = true;
digitalWrite(LED_PIN, HIGH);
beeping = true;
beepStartedMs = now;
buzzer(true);
Serial.println(F("Motion detected"));
}
}
if (lightOn && (now - lastMotionMs >= HOLD_MS)) {
lightOn = false;
digitalWrite(LED_PIN, LOW);
Serial.println(F("Quiet again"));
}
if (beeping && (now - beepStartedMs >= BEEP_MS)) {
beeping = false;
buzzer(false);
}
}
Naikkan HOLD_MS untuk lampu koridor, atau panjangkan BEEP_MS menjadi penggera sebenar seperti yang dibuat oleh panduan penggera sensor api kami.
Kenapa ia trigger sedangkan tiada sesiapa di situ?
Trigger palsu pada HC-SR501 hampir selalunya perubahan infrared yang betul-betul berlaku, cuma anda tidak menganggapnya sebagai pergerakan. Air-cond dan kipas ialah punca paling biasa β bukan kerana sensor nampak udara yang bergerak, tetapi kerana udara itu menyapu permukaan panas dan sejuk merentasi medan pandangan lalu menyejukkan elemen pengesan secara tidak sekata, jadi dua kepingan tadi berhenti sependapat. Halakan dome jauh daripada vent dan jangan sekali-kali pasang ia betul-betul dalam tiupan angin.
Cahaya matahari ialah punca kedua. Cahaya siang membawa banyak infrared, jadi tompok matahari yang merayap merentasi lantai, atau bayang awan yang melintas di tingkap, memang satu perubahan sebenar pada gambaran tadi. Jauhkan tingkap dan pintu kaca daripada kon pengesanan, atau tapis outputnya mengikut masa atau dengan sensor cahaya.
Punca ketiga ialah elektrik. Modul ini menguatkan isyarat pada aras mikrovolt, jadi rel 5 V yang melendut atau bising masuk ke input comparator seolah-olah ia satu isyarat. Coil relay atau motor yang berkongsi pin 5 V Uno akan menjunamkan rel itu setiap kali ia bertukar β trigger palsu yang datang tepat pada saat output anda aktif ialah punca ini, bukan sensor berhantu. Beri beban-beban itu bekalan mereka sendiri, dengan ground diikat bersama.
Baru selepas ketiga-tiga itu, capai trimmer sensitiviti. Menurunkannya mengecilkan jarak pengesanan, iaitu menyembunyikan simptom, bukan menyembuhkannya.

Daripada LED kepada lampu sebenar
Halakan LED_PIN ke sebuah relay dan sketch yang sama itu akan menghidupkan LED strip 12 V atau lampu DC. Modul relay 5 V menjalankan coilnya dari pin 5 V Uno β satu coil menarik dalam lingkungan 70 mA, yang mampu dibekalkan oleh Uno berkuasa USB, walaupun sebarisan relay tidak β dan bahagian kawalannya ialah screw terminal tiga laluan, jadi pin male terdedah sebatang jumper boleh diapit terus ke dalamnya.
Bahagian yang disuis itu ialah dry contact, bukan output β relay cuma menutup satu suis antara COM dan NO, jadi lampu dan bekalan 12 V miliknya sendiri membentuk satu litar yang langsung tidak menyentuh ground Arduino.
Periksa jumper trigger high/low yang kecil pada modul itu sebelum anda menulis apa-apa kod: ia menentukan sama ada coil bertenaga pada HIGH atau pada LOW, dan board dihantar dalam kedua-dua tetapan. Sahkan dengan satu digitalWrite dan telinga anda. Kalau anda memang sudah menjalankan sistem 12 V, versi coil 12 V itulah komponen yang betul β cuma dalam binaan ini tiada rel 12 V untuk ia berjalan.
Kekalkan bahagian yang disuis itu pada DC voltan rendah. Contact relay itu memang dinilai untuk kuasa mains, dan pensuisan mains membawa keperluan clearance, penebatan dan enclosure yang tempatnya dalam panduan keselamatan modul relay kami β baca dulu sebelum menghampiri 240 V.
Kesilapan biasa yang kami lihat daripada pelanggan sebenar
Menguji serta-merta, sambil tercangkung di atas board. Lengan anda sendiri memenuhi kon pengesanan sepanjang minit warm-up itu. Hidupkan, berjalan jauh, kemudian datang balik.
Menyalahkan sketch atas timer sensor. Kalau lampu kekal menyala jauh lebih lama daripada HOLD_MS, trimmer Tx ditetapkan panjang dan Arduino cuma sedang menunggu OUT turun ke low. Perisian tidak boleh memendekkan hardware.
Mewayarkan buzzer seolah-olah ia peranti active-high. Ia menjerit dari boot dan tidak pernah berhenti, dan itu nampak macam modul rosak. HIGH itulah senyap.
Mengharapkan PIR mengira orang atau mengukur jarak. Ia cuma melaporkan “ada sesuatu berubah dalam kon”, tiada lebih daripada itu; mengukur jarak ialah kerja untuk panduan HC-SR04 kami.
Soalan lazim
Trimmer oren yang mana sensitiviti dan yang mana time delay?
Pusing satu trimmer suku pusingan dan lambai. Kalau tempoh menyala berubah, itulah Tx, si time delay; kalau yang berubah cuma jarak pengesanan, itulah sensitiviti.
Kenapa lampu automatik saya kekal menyala berminit-minit?
Trimmer Tx dipusing tinggi dan jumper berada pada H, jadi setiap pergerakan baharu memulakan semula timer hardware yang panjang. Pusing Tx ke minimum, alihkan jumper ke L, dan tetapkan tempohnya dalam kod.
Boleh ke saya sambung HC-SR501 ke ESP32 atau Raspberry Pi Pico?
Boleh. Outputnya berayun ke 3.3 V dan bukan ke VCC, jadi tiada level shifter diperlukan. Bekalkan VCC dari pin 5 V board itu β regulator modul perlukan input lebih tinggi daripada 3.3 V.
Patutkah saya guna H atau L pada jumper kuning?
Guna L apabila kod anda yang memegang timing, supaya sensor tidak boleh terkunci pada high. Guna H apabila sensor memandu relay atau lampu terus tanpa microcontroller.
Kenapa ia kesan saya di muka pintu tetapi tidak di meja saya?
Lalu-lalang di muka pintu melintasi banyak pancaran Fresnel; orang di meja pula duduk di dalam satu pancaran dan hampir tidak bergerak. Pasangkannya supaya orang melintasi pandangannya, bukan menghampirinya.
Kemas kini terakhir Ogos 2026. Tersangkut? Chat dengan kami di WhatsApp.



PIR Motion Sensor HC-SR501 MN-SR501 MINI Human Sensor Human Detector Motion Detector Arduino HCSR501 MNSR501 - HC-SR501 PIR MOTION SENSOR
Arduino Compatible UNO R3 FT232 Development Board Arduino Compatible CH340 Alternative
Buzzer Active Passive Buzzer 5V Electronic Sound Alarm Module Tone Piezo - Active Buzzer Module
Round Head LED 3mm / 5mm / 8mm - Red/Yellow/Blue/Green/White - 5mm LED (RED)
400 pcs 1/4W Resistor Pack Resistor Kit 20 Common Value with 20 each
MB102 Breadboard 170 400 830 Holes Breadboard Donut Board Arduino Prototype Multi Color - BREADBOARD (400 HOLES)
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-M 20CM
40pcs Dupont Wire 10cm 20cm 30cm for Breadboard DIY Experiment Jumper Wire Breadboard wire - DUPONT WIRE M-F 20CM
Data Cable Type-A Type-C MicroUSB Type-B 0.5m 1m 30cm 0.3m 100cm Data Transfer Upload Code - TYPE-A TO TYPE-B (1.0M)
Relay Module 3.3V 5V 12V 1/2/4/8 Ways Optocoupler Trigger Relay Module 1 2 4 8 Channel Relay Module - 5V RELAY MODULE(1WAY)