Tutorial Belanja komponen

Tutorial › Cahaya

Saklar Tepuk Cahaya: Kedip Senter ke HP

ESP-12ED0D1D2D3D43VGD5D6D7D8RXTXG3VA0GVUS3S2S1SCS0SKG3VENRSTGVINS+−Modul LDR KY-018

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

KomponenQtyHarga
NodeMCU ESP8266 V3 (Lolin)1Rp42.000
Modul sensor cahaya LDR1Rp7.200
Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 31Rp3.500
Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data1Rp11.700
Total (tanpa opsional)Rp52.700
Daftar komponen proyek ini otomatis masuk ke pesan. Hapus yang sudah kamu punya sebelum dikirim.

Langkah 1: Rangkai komponen

Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.

DariKeKabel
Modul LDR KY-018 S→A0kuning
Modul LDR KY-018 +→3Vmerah
Modul LDR KY-018 −→Ghitam

Langkah 2: Siapkan dashboard Klenik

Lampuichibot/budi1234/p040/lampu
NYALA
0 detik lalu
Kilatan Terbacaichibot/budi1234/p040/log
1 kilatan: diabaikan
2 kilatan: lampu dibalik
0 detik lalu

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.

WidgetTopicSetting
Indikator Boolean
Lampu
ichibot/KODE/p040/lampuON = 1 “NYALA”, OFF = 0
Text Log
Kilatan Terbaca
ichibot/KODE/p040/logmenampilkan 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).

p040.inoUnduh .ino
// 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

  1. Rata-rata bergerak: setiap bacaan biasa menggeser dasar 1/32 bagian. Perubahan cahaya lambat diikuti, kilatan cepat tidak.
  2. Pakai selisih mutlak, jadi kilatan terang di ruang gelap maupun bayangan tiba-tiba di ruang terang sama-sama terdeteksi.
  3. Setelah 2 detik sejak kilatan pertama, jumlahnya dinilai. Pola ini bisa dikembangkan jadi "kode" yang lebih rumit.