Sinar laser ditembakkan melintang pintu atau lorong ke sebuah LDR. Begitu ada yang lewat dan memutus sinarnya, buzzer berbunyi dan dashboard mencatat kejadiannya, seperti adegan film pencurian.
Saat sinar laser mengenai LDR, angka A0 rendah dan stabil. Saat sinar terputus, LDR kembali membaca cahaya ruangan dan angkanya naik jauh. Ambang dihitung otomatis saat NodeMCU menyala (angka saat terkena laser + 150). Jadi laser harus sudah tepat mengenai LDR waktu alat dinyalakan. Switch Siaga mematikan alarm tanpa mematikan alat.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| NodeMCU ESP8266 V3 (Lolin) | 1 | Rp42.000 |
| Modul sensor cahaya LDR | 1 | Rp7.200 |
| Laser titik 5 mW (tabung) | 1 | Rp25.000 |
| Modul buzzer aktif KY-012 | 1 | Rp7.500 |
| Breadboard mini 170 titik | 1 | Rp4.875 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 8 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp90.075 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Modul LDR KY-018 S | → | A0 | kuning |
| Modul LDR KY-018 + | → | 3V | merah |
| Modul LDR KY-018 − | → | G | hitam |
| Modul buzzer aktif KY-012 S | → | D2 GPIO4 | biru |
| Modul buzzer aktif KY-012 + | → | 3V | merah |
| Modul buzzer aktif KY-012 − | → | G | hitam |
| Laser titik 5 mW (arahkan ke LDR) + | → | 3V | merah |
| Laser titik 5 mW (arahkan ke LDR) − | → | G | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p038.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 Sinar Laser | ichibot/KODE/p038/putus | ON = 1 “TERPUTUS”, OFF = 0 |
| Switch Siaga | ichibot/KODE/p038/siaga | payload ON / OFF |
| Text Log Kejadian | ichibot/KODE/p038/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 038 - Deteksi Laser Putus (Laser Tripwire)
// Board: NodeMCU ESP8266 V3 | Dashboard: klenik.ichibot.id
#include <ESP8266WiFi.h>
#include <PubSubClient.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/p038/siaga";
const char* TOPIK_LOG = "ichibot/budi1234/p038/log";
const char* TOPIK_PUTUS = "ichibot/budi1234/p038/putus";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_LDR = A0, BUZZER = D2;
int ambang = 0; // dihitung otomatis saat menyala
bool siaga = true, putusTadi = false;
unsigned long bunyiSampai = 0;
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(BUZZER, OUTPUT);
delay(500);
int kena = analogRead(PIN_LDR); // laser harus sudah tepat mengenai LDR saat menyala
ambang = kena + 150; // sinar terhalang = angka naik jauh di atas ini
Serial.printf("Laser kena: %d, ambang putus: %d\n", kena, ambang);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
bool putus = analogRead(PIN_LDR) > ambang;
if (putus && !putusTadi && siaga) {
jumlah++;
digitalWrite(BUZZER, HIGH);
bunyiSampai = millis() + 1500;
mqtt.publish(TOPIK_LOG, ("Sinar terputus! (ke-" + String(jumlah) + ")").c_str());
}
if (putus != putusTadi) mqtt.publish(TOPIK_PUTUS, putus ? "1" : "0");
putusTadi = putus;
if (bunyiSampai && (long)(millis() - bunyiSampai) >= 0) { digitalWrite(BUZZER, LOW); bunyiSampai = 0; }
}Langkah 4: Pahami kodenya
- Ambang otomatis. Angka 150 adalah jarak aman antara "kena laser" dan "terputus". Kalau ruangan sangat terang, perkecil angkanya.
- Bereaksi hanya di awal pemutusan, jadi orang yang berdiri di jalur sinar dihitung satu kali.
- Status UTUH/TERPUTUS selalu dilaporkan, walaupun siaga dimatikan. Siaga hanya mengatur buzzer dan catatan kejadian.