Sensor Pergerakan HC-SR501 dengan Arduino: Lampu Automatik dan Penggera

Cartoon of a large HC-SR501 PIR sensor with a white honeycomb dome on a royal blue board with two orange trimmers and a yellow jumper, casting a pale teal detection fan towards a small glowing red LED

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.

Parts list

ItemPriceQty
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)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)1WRELAYRM3.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.

Perbandingan kartun antara seorang yang berjalan melintang merentasi pancaran teal berbentuk sikat sebuah sensor PIR lalu dikesan, dengan seorang yang berdiri diam di dalam satu pancaran lalu terlepas pandang
Melintasi pancaran membuatkan dua kepingan pengesan itu tidak lagi sependapat, dan itulah pengesanan. Berdiri di dalam satu pancaran membuatkan kedua-duanya terus sependapat, dan itulah kesunyian.

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:

  1. Pusing kedua-dua trimmer perlahan-lahan lawan jam sampai ke hujungnya dengan skru pemutar flat yang kecil. Jangan paksa.
  2. 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.
  3. 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:

Kartun close-up board biru royal HC-SR501 menunjukkan dua trimmer oren dengan skru pemutar perak pada salah satunya, satu jumper shunt kuning terang, dan anak panah teal melengkung yang menunjukkan pusingan dan gelongsoran
Tiga kawalan, semuanya pada satu tepi: dua trimmer oren yang dilaraskan dengan skru pemutar flat kecil, dan satu jumper kuning yang digelongsor antara dua kedudukan.

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.

Keratan rentas bilik dalam gaya kartun menunjukkan sensor HC-SR501 pada dinding kelabu memancarkan kon pengesanan teal yang menangkap tiupan angin air-cond, tompok cahaya matahari kuning di sisi tingkap berlangsir krim, dan bekalan kuasa kelabu yang mengeluarkan percikan elektrik teal
Tiga perkara yang men-trigger PIR sedangkan bilik kosong: udara bergerak dari vent, tompok cahaya matahari yang melintasi lantai, dan rel kuasa dikongsi yang bising.

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.

Leave a Reply

Your email address will not be published. Required fields are marked *