Sensor PIR mendeteksi orang yang bergerak sampai jarak ±7 m. Setiap gerakan dicatat dengan jamnya di dashboard. Mode siaga bisa dinyalakan saat ruangan seharusnya kosong.
PIR (passive infrared) tidak memancarkan apa-apa. Sensor ini menangkap perubahan panas tubuh yang bergerak di depan lensa putihnya. Keluarannya HIGH selama ada gerakan, ditambah waktu tahan yang diatur trimpot oranye. Setelah dinyalakan, PIR butuh 30-60 detik "pemanasan" dan bisa salah deteksi selama itu. HC-SR501 diberi daya 5V dari pin VU, tapi keluarannya hanya 3,3V, jadi aman langsung ke D5.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| NodeMCU ESP8266 V3 (Lolin) | 1 | Rp42.000 |
| Sensor gerak PIR HC-SR501 | 1 | Rp15.000 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 3 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp60.500 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| PIR HC-SR501 VCC | → | VU | merah |
| PIR HC-SR501 OUT | → | D5 GPIO14 | kuning |
| PIR HC-SR501 GND | → | G | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p041.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.
| Widget | Topic | Setting |
|---|---|---|
| Indikator Boolean Gerakan | ichibot/KODE/p041/gerak | ON = 1 “ADA GERAK”, OFF = 0 |
| Switch Mode Siaga | ichibot/KODE/p041/siaga | payload ON / OFF |
| Text Log Catatan Gerakan | ichibot/KODE/p041/log | menampilkan teks masuk |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary). Board di Arduino IDE: NodeMCU 1.0 (ESP-12E Module).
Isi dulu nama WiFi dan password di bagian ISI DULU, lalu ganti budi1234 di baris topic dengan KODE-mu, lalu upload dan buka Serial Monitor (115200).
// Proyek 041 - Sensor Gerak PIR Kirim Peringatan
// Board: NodeMCU ESP8266 V3 | Dashboard: klenik.ichibot.id
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <time.h>
// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";
// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_SIAGA = "ichibot/budi1234/p041/siaga";
const char* TOPIK_GERAK = "ichibot/budi1234/p041/gerak";
const char* TOPIK_LOG = "ichibot/budi1234/p041/log";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
String jamSekarang() {
time_t t = time(nullptr);
char buf[6];
strftime(buf, sizeof(buf), "%H:%M", localtime(&t));
return String(buf);
}
const int PIN_PIR = D5; // OUT HC-SR501: HIGH saat ada gerakan
bool siaga = true, gerakTadi = false;
int jumlah = 0;
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
siaga = (p == "ON");
}
void langganan() {
mqtt.subscribe(TOPIK_SIAGA);
}
sambungWiFi() dan sambungMQTT(): sama di semua proyek (klik untuk lihat)
void sambungWiFi() {
WiFi.begin(WIFI_NAMA, WIFI_PASS);
Serial.print("WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" OK, IP " + WiFi.localIP().toString());
}
void sambungMQTT() {
while (!mqtt.connected()) {
if (mqtt.connect(WiFi.macAddress().c_str())) {
Serial.println("Terhubung ke Klenik");
langganan();
} else {
Serial.println("Broker gagal, coba lagi 3 detik");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PIN_PIR, INPUT);
sambungWiFi();
configTime(7 * 3600, 0, "pool.ntp.org");
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
Serial.println("PIR pemanasan 30-60 detik...");
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
bool gerak = digitalRead(PIN_PIR);
if (gerak != gerakTadi) {
gerakTadi = gerak;
mqtt.publish(TOPIK_GERAK, gerak ? "1" : "0");
if (gerak && siaga) {
jumlah++;
mqtt.publish(TOPIK_LOG, (jamSekarang() + " ada gerakan (ke-" + String(jumlah) + ")").c_str());
}
}
}Langkah 4: Pahami kodenya
- Keluaran PIR sudah berupa HIGH/LOW yang jelas, jadi tidak perlu pull-up.
- Status dikirim hanya saat berubah: awal gerakan dan saat PIR kembali tenang.
- Catatan dengan jam hanya dibuat dalam mode siaga. Indikator di dashboard tetap jalan untuk melihat aktivitas.