Lampu menyala sendiri saat hari gelap dan mati saat terang. Lampu mobil yang lewat sekilas tidak membuatnya padam-nyala, dan dari HP kamu bisa mengatur kepekaannya atau mengendalikan lampu manual.
Sensor dan kalibrasinya sama dengan proyek 031. Lampu baru menyala kalau gelap bertahan 30 detik berturut-turut, dan baru mati kalau terang melewati batas + 15%. Dua syarat ini mencegah lampu bereaksi pada bayangan, awan, atau sorot lampu kendaraan. Untuk latihan, bebannya lampu USB 5V lewat relay dan 3 baterai AA. Polanya sama dengan lampu teras sungguhan.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| NodeMCU ESP8266 V3 (Lolin) | 1 | Rp42.000 |
| Modul sensor cahaya LDR | 1 | Rp7.200 |
| Modul relay 1 channel 5V | 1 | Rp17.000 |
| Soket USB female ke pin DIP | 1 | Rp3.500 |
| Lampu USB mini | 1 | Rp8.775 |
| Holder baterai 3×AA + kabelbaterai AA dibeli terpisah | 1 | Rp6.000 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 6 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp87.975 |
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 |
| Relay 1 ch 5V (jumper H) DC+ | → | VU | oranye |
| Relay 1 ch 5V (jumper H) DC− | → | G | hitam |
| Relay 1 ch 5V (jumper H) IN | → | D1 GPIO5 | biru |
| Baterai 3×AA (4,5V) + | → | Relay 1 ch 5V (jumper H) COM | merah |
| Relay 1 ch 5V (jumper H) NO | → | Soket USB + lampu USB VCC | merah |
| Soket USB + lampu USB GND | → | Baterai 3×AA (4,5V) − | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p032.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 |
|---|---|---|
| Gauge Cahaya Luar | ichibot/KODE/p032/cahaya | 0–100 % |
| Indikator Boolean Lampu Teras | ichibot/KODE/p032/lampu/status | ON = 1 “NYALA”, OFF = 0 |
| Switch Mode Otomatis | ichibot/KODE/p032/otomatis | payload ON / OFF |
| Switch Lampu Manual | ichibot/KODE/p032/lampu | payload ON / OFF |
| Slider Output Batas Gelap | ichibot/KODE/p032/batas | 5–90 % |
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 032 - Lampu Teras Otomatis Malam Hari
// 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_STATUS = "ichibot/budi1234/p032/lampu/status";
const char* TOPIK_CAHAYA = "ichibot/budi1234/p032/cahaya";
const char* TOPIK_OTOMATIS = "ichibot/budi1234/p032/otomatis";
const char* TOPIK_BATAS = "ichibot/budi1234/p032/batas";
const char* TOPIK_LAMPU = "ichibot/budi1234/p032/lampu";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int PIN_LDR = A0, PIN_RELAY = D1;
const int MENTAH_GELAP = 900, MENTAH_TERANG = 80; // isi dengan hasil kalibrasi proyek 031
int batas = 25; // nyala kalau terang di bawah 25%
bool otomatis = true, lampu = false;
unsigned long terakhir = 0, gelapSejak = 0;
void atur(bool nyala) {
lampu = nyala;
digitalWrite(PIN_RELAY, nyala ? HIGH : LOW);
mqtt.publish(TOPIK_LAMPU_STATUS, nyala ? "1" : "0", true);
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String topik = t, p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
if (topik == TOPIK_OTOMATIS) otomatis = (p == "ON");
else if (topik == TOPIK_BATAS) batas = constrain(p.toInt(), 5, 90);
else if (topik == TOPIK_LAMPU && !otomatis) atur(p == "ON");
}
void langganan() {
mqtt.subscribe(TOPIK_OTOMATIS);
mqtt.subscribe(TOPIK_BATAS);
mqtt.subscribe(TOPIK_LAMPU);
}
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_RELAY, OUTPUT);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir < 1000) return;
terakhir = millis();
int terang = constrain(map(analogRead(PIN_LDR), MENTAH_GELAP, MENTAH_TERANG, 0, 100), 0, 100);
mqtt.publish(TOPIK_CAHAYA, String(terang).c_str());
if (!otomatis) return;
// harus gelap 30 detik berturut-turut: lampu mobil lewat atau awan tidak memicu
if (terang < batas) { if (!gelapSejak) gelapSejak = millis(); }
else gelapSejak = 0;
if (!lampu && gelapSejak && millis() - gelapSejak > 30000) atur(true);
if (lampu && terang > batas + 15) atur(false);
}Langkah 4: Pahami kodenya
- Mencatat sejak kapan cahaya berada di bawah batas. Begitu terang lagi, catatan dikosongkan dan hitungan mulai dari awal.
- Syarat nyala: belum menyala, sudah gelap, dan gelapnya sudah lebih dari 30 detik.
- Syarat mati memakai batas yang lebih tinggi. LDR jangan diletakkan di bawah lampu itu sendiri, karena cahaya lampu akan terbaca sebagai siang.