Bab 15 · Arduino Uno R3
Sensor Gerak PIR HC-SR501 dengan Arduino
Kenali keluaran digital PIR, waktu penyesuaian awal, dan latihan menyalakan LED saat gerakan terdeteksi.
Apa yang dideteksi PIR?
PIR mendeteksi perubahan radiasi inframerah pada bidang pandangnya. Ketika orang bergerak melintas, modul dapat mengubah keluarannya menjadi HIGH. PIR bukan kamera dan tidak mengukur jarak. Orang yang diam bisa tidak lagi terdeteksi, jadi sensor ini tidak memastikan bahwa ruangan kosong.
Sambungan modul HC-SR501
Siapkan Uno R3, modul PIR HC-SR501, dan tiga jumper. Hubungkan VCC ke 5V, GND ke GND, serta OUT ke pin 2. Gunakan LED bawaan sebagai penanda sehingga tidak perlu LED luar. Pastikan letak pin dari label atau dokumentasi modul; posisi VCC dan GND tidak selalu sama pada setiap produk.
Program lengkap
const int PIN_PIR = 2;
const int PIN_LED = LED_BUILTIN;
int keadaanLama = LOW;
void setup() {
Serial.begin(9600);
pinMode(PIN_PIR, INPUT);
pinMode(PIN_LED, OUTPUT);
digitalWrite(PIN_LED, LOW);
Serial.println("Tunggu sekitar 60 detik untuk penyesuaian PIR.");
delay(60000);
Serial.println("Siap. Coba bergerak melintasi sensor.");
}
void loop() {
int gerak = digitalRead(PIN_PIR);
digitalWrite(PIN_LED, gerak);
if (gerak != keadaanLama) {
if (gerak == HIGH) {
Serial.println("Gerakan terdeteksi");
} else {
Serial.println("Keluaran PIR kembali LOW");
}
keadaanLama = gerak;
}
delay(50);
}Buka Serial Monitor pada 9600 baud. Setelah masa awal selesai, melintaslah di depan sensor. LED menyala selama OUT HIGH. Pesan hanya dicetak ketika keadaan berubah, sehingga layar tidak dipenuhi teks yang sama.
Mengapa LED tidak langsung padam?
HC-SR501 umumnya memiliki pengatur sensitivitas dan lama keluaran aktif, serta jumper pemicu ulang. Modul dapat menahan HIGH beberapa saat setelah gerakan berhenti. Pada mode pemicu ulang, gerakan berikutnya dapat memperpanjang waktu aktif. Kenali pengatur modul milikmu dan ubah sedikit demi sedikit; jangan memaksa putaran sampai melewati batasnya.
Saat hasilnya membingungkan
Diamkan sensor selama penyesuaian awal dan hindari menggerakkan modulnya. Jangan arahkan ke sinar matahari langsung atau sumber panas yang berubah-ubah. Jika LED terus menyala, tunggu sesuai setelan waktu modul sebelum menyimpulkan rangkaiannya salah.
Latihan dan rujukan
Bandingkan berjalan melintasi sensor dengan berdiri diam di depannya. Catat berapa lama LED tetap menyala setelah gerakan berhenti. Penjelasan tambahan tersedia pada panduan PIR dengan Arduino dari Adafruit.
Isi di dalam modul PIR
Di bawah kubah putih terdapat sensor piroelektrik dengan dua bagian yang membaca radiasi inframerah. Selama keduanya menerima panas yang sama, tidak terjadi apa-apa. Ketika tubuh hangat bergerak melintas, satu bagian menerima panas lebih dulu daripada bagian lain, dan selisih itu memicu sinyal. Kubah putih adalah lensa Fresnel yang membagi pandangan menjadi banyak zona sehingga gerakan kecil pun dapat tertangkap. Jangkauan HC-SR501 kira-kira 3 sampai 7 meter dengan sudut sekitar 110 derajat.
Pengatur pada papan
Ada dua potensiometer kecil dan satu jumper. Pengatur sensitivitas menentukan jarak deteksi. Pengatur waktu menentukan berapa lama OUT tetap HIGH setelah gerakan, dari sekitar beberapa detik sampai beberapa menit. Jumper pemicu memilih mode: pada mode single trigger (L), keluaran HIGH selama waktu yang ditetapkan lalu turun sekalipun masih ada gerakan; pada mode repeatable (H), gerakan baru memperpanjang waktu HIGH. Untuk latihan di kelas, atur waktu ke terpendek agar hasil percobaan cepat terlihat.
Tegangan dan keselamatan
Modul HC-SR501 menerima daya 5 V sampai 20 V dan memiliki regulator sendiri, tetapi untuk Uno cukup gunakan pin 5V. Pin OUT menghasilkan sekitar 3,3 V saat HIGH. Uno mengenali tegangan di atas sekitar 3 V sebagai HIGH, sehingga sambungan langsung biasanya bekerja. Jangan memberi tegangan lebih dari 5 V pada pin I/O Uno. Jangan menyentuh kaki sensor dengan tangan basah atau lembap, dan jauhkan rangkaian dari air.
Contoh kedua: lampu dengan penghitung waktu millis
Pasang LED merah melalui resistor 330 ohm antara pin 8 dan GND. Pin OUT PIR tetap ke pin 2.
const int PIN_PIR = 2;
const int PIN_LED = 8;
const unsigned long LAMA_NYALA = 5000;
unsigned long terakhirGerak = 0;
bool lampuNyala = false;
int jumlah = 0;
int sebelum = LOW;
void setup() {
Serial.begin(9600);
pinMode(PIN_PIR, INPUT);
pinMode(PIN_LED, OUTPUT);
delay(30000);
}
void loop() {
int gerak = digitalRead(PIN_PIR);
if (gerak == HIGH && sebelum == LOW) {
jumlah++;
Serial.print("Deteksi ke-");
Serial.println(jumlah);
}
sebelum = gerak;
if (gerak == HIGH) {
terakhirGerak = millis();
lampuNyala = true;
}
if (lampuNyala && millis() - terakhirGerak >= LAMA_NYALA) {
lampuNyala = false;
}
digitalWrite(PIN_LED, lampuNyala);
delay(50);
}Program ini meniru lampu koridor otomatis. Setiap gerakan mencatat waktu dengan millis() dan menyalakan lampu. Lampu padam hanya setelah 5 detik tanpa gerakan baru. Variabel jumlah naik satu kali setiap OUT berpindah dari LOW ke HIGH, bukan setiap putaran loop; itu fungsi variabel sebelum. Penundaan 30 detik di awal memberi waktu pemanasan. Pada praktik, waktu tunggu modul dan 5 detik program saling menjumlah, jadi lampu bisa menyala lebih lama dari yang diharapkan.
Kesalahan yang sering terjadi
- Deteksi acak saat baru dinyalakan. Ini wajar pada setengah menit pertama. Tunggu masa penyesuaian selesai.
- Sensor tidak pernah HIGH. Periksa kabel OUT, dan pastikan bukan GND yang tertukar dengan VCC. Pada beberapa modul letak pin berbeda dari gambar contoh.
- Sensor terlalu sensitif. Kipas angin, AC, atau jendela terkena matahari dapat memicu keluaran. Pindahkan sensor atau turunkan sensitivitas.
- Kubah ditutup. Lakban atau kaca di depan lensa menghalangi inframerah, karena kaca biasa menyerap sinar inframerah panjang.
- Memakai delay panjang di loop(). Pemanasan boleh memakai delay, tetapi jangan di dalam loop() karena sensor tidak dibaca selama menunggu.
Ringkasan
PIR mendeteksi perubahan panas inframerah, bukan keberadaan orang. Keluarannya digital sederhana, tetapi perilakunya ditentukan oleh dua pengatur dan satu jumper pada modul. Program yang baik mengenali perubahan keadaan dan memakai millis() untuk mengatur lama lampu.
Soal latihan
- Mengapa orang yang berdiri diam bisa tidak terdeteksi PIR?
Lihat jawaban
PIR membaca perubahan inframerah. Tubuh yang diam tidak lagi menimbulkan perubahan di antara dua bagian sensor.
- Apa beda mode single trigger dan repeatable?
Lihat jawaban
Single trigger menurunkan OUT setelah waktu tetap walau gerakan berlanjut. Repeatable memperpanjang HIGH setiap kali ada gerakan baru.
- Pada contoh kedua, apa fungsi variabel sebelum?
Lihat jawaban
Menyimpan keadaan OUT pada putaran lalu agar program hanya menghitung perpindahan LOW ke HIGH, bukan setiap putaran saat HIGH.
- Bagaimana membuat lampu menyala 10 detik?
Lihat jawaban
Ubah LAMA_NYALA menjadi 10000.