Kalau lampu ruangan masih menyala setelah jam pulang, dashboard menyala merah dan mengirim satu pesan pengingat. Hemat listrik di kantor, kelas, atau gudang tanpa perlu keliling mengecek.
Sensor LDR membaca terang ruangan seperti proyek 031. Jam diambil dari internet (NTP). Lampu dianggap lupa dimatikan kalau terang di atas 40% dan jam sudah lewat jamPulang (atau antara tengah malam dan jam 6 pagi). Pesan pengingat hanya dikirim sekali per kejadian, lalu disiapkan lagi setelah lampu benar-benar mati. Jam pulang bisa diubah dari slider di HP.
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 p034.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 Lupa Dimatikan | ichibot/KODE/p034/lupa | ON = 1 “LUPA!”, OFF = 0 |
| Gauge Terang Ruangan | ichibot/KODE/p034/cahaya | 0–100 % |
| Slider Output Jam Pulang | ichibot/KODE/p034/jampulang | 12–23 |
| Text Log Pengingat | ichibot/KODE/p034/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 034 - Pengingat Lampu Lupa Dimatikan
// 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_JAMPULANG = "ichibot/budi1234/p034/jampulang";
const char* TOPIK_CAHAYA = "ichibot/budi1234/p034/cahaya";
const char* TOPIK_LUPA = "ichibot/budi1234/p034/lupa";
const char* TOPIK_LOG = "ichibot/budi1234/p034/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_LDR = A0;
const int MENTAH_GELAP = 900, MENTAH_TERANG = 80; // hasil kalibrasi proyek 031
int jamPulang = 17; // lampu masih nyala setelah jam ini = lupa
bool sudahIngatkan = false;
unsigned long terakhir = 0;
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
jamPulang = constrain(p.toInt(), 12, 23);
}
void langganan() {
mqtt.subscribe(TOPIK_JAMPULANG);
}
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);
sambungWiFi();
configTime(7 * 3600, 0, "pool.ntp.org");
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir < 10000) return;
terakhir = millis();
int terang = constrain(map(analogRead(PIN_LDR), MENTAH_GELAP, MENTAH_TERANG, 0, 100), 0, 100);
bool lampuNyala = terang > 40;
time_t t = time(nullptr);
int jam = localtime(&t)->tm_hour;
bool lupa = lampuNyala && (jam >= jamPulang || jam < 6);
mqtt.publish(TOPIK_CAHAYA, String(terang).c_str());
mqtt.publish(TOPIK_LUPA, lupa ? "1" : "0", true);
if (lupa && !sudahIngatkan) {
mqtt.publish(TOPIK_LOG, (jamSekarang() + " lampu ruangan masih menyala!").c_str());
sudahIngatkan = true; // satu pesan per kejadian, tidak tiap 10 detik
}
if (!lampuNyala) sudahIngatkan = false;
}Langkah 4: Pahami kodenya
- Ambang 40% memisahkan lampu menyala dengan sisa cahaya dari luar. Kalau ruangan dekat jendela, siang hari bisa terbaca menyala. Karena itu jam juga dicek.
- Lupa = lampu menyala DAN sudah lewat jam pulang (atau dini hari).
- Penanda supaya pengingat tidak dikirim tiap 10 detik. Indikator di dashboard tetap merah selama lampu masih menyala.