Kedipkan senter HP dua kali ke sensor, lampu di NodeMCU berbalik nyala/mati. Mirip saklar tepuk, tapi pakai cahaya. Proyek ini mengajarkan cara mendeteksi pola dalam waktu, bukan sekadar nilai.
NodeMCU menyimpan dasar, yaitu tingkat cahaya ruangan yang diperbarui pelan-pelan, sehingga perubahan lambat (pagi ke siang) tidak dianggap kilatan. Cahaya yang tiba-tiba berbeda lebih dari 200 dari dasar dihitung sebagai satu kilatan. Kilatan pertama membuka jendela 2 detik. Kalau jumlah kilatan dalam jendela itu tepat 2, lampu dibalik. Jumlah lain dicatat lalu diabaikan.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| NodeMCU ESP8266 V3 (Lolin) | 1 | Rp42.000 |
| Modul sensor cahaya LDR | 1 | Rp7.200 |
| 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) | Rp52.700 |
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 |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p040.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 Lampu | ichibot/KODE/p040/lampu | ON = 1 “NYALA”, OFF = 0 |
| Text Log Kilatan Terbaca | ichibot/KODE/p040/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 040 - Saklar Tepuk Cahaya: Kedip Senter ke HP
// 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_LAMPU = "ichibot/budi1234/p040/lampu";
const char* TOPIK_LOG = "ichibot/budi1234/p040/log";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_LDR = A0;
const int LED_PAPAN = LED_BUILTIN; // menyala saat LOW
int dasar = 0; // tingkat gelap ruangan (diperbarui pelan)
bool kilatTadi = false, lampu = false;
int kilat = 0;
unsigned long kilatPertama = 0;
void langganan() {}
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(LED_PAPAN, OUTPUT);
digitalWrite(LED_PAPAN, HIGH);
dasar = analogRead(PIN_LDR);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
int v = analogRead(PIN_LDR);
bool sekarang = abs(v - dasar) > 200; // beda jauh dari biasanya = ada kilatan
if (!sekarang) dasar = (dasar * 31 + v) / 32; // ikuti perubahan cahaya ruangan pelan-pelan
if (sekarang && !kilatTadi) {
if (kilat == 0) kilatPertama = millis();
kilat++;
}
kilatTadi = sekarang;
if (kilat > 0 && millis() - kilatPertama > 2000) { // jendela 2 detik selesai
if (kilat == 2) {
lampu = !lampu;
digitalWrite(LED_PAPAN, lampu ? LOW : HIGH);
mqtt.publish(TOPIK_LAMPU, lampu ? "1" : "0", true);
}
mqtt.publish(TOPIK_LOG, (String(kilat) + " kilatan" + (kilat == 2 ? ": lampu dibalik" : ": diabaikan")).c_str());
kilat = 0;
}
}Langkah 4: Pahami kodenya
- Rata-rata bergerak: setiap bacaan biasa menggeser
dasar1/32 bagian. Perubahan cahaya lambat diikuti, kilatan cepat tidak. - Pakai selisih mutlak, jadi kilatan terang di ruang gelap maupun bayangan tiba-tiba di ruang terang sama-sama terdeteksi.
- Setelah 2 detik sejak kilatan pertama, jumlahnya dinilai. Pola ini bisa dikembangkan jadi "kode" yang lebih rumit.