Taruh sensor di dekat jendela, dan dashboard mencatat jam terang dan gelap setiap hari. Lama-lama terlihat polanya, misalnya hari mendung atau ruangan yang kebagian sinar pagi.
BH1750 dibaca tiap 30 detik. Supaya awan lewat tidak tercatat sebagai senja, perubahan baru diakui kalau 4 bacaan berturut-turut (2 menit) konsisten di sisi yang sama dari batas 400 lux. Begitu berubah, jam dari NTP dicatat ke Text Log dan status siang/malam dikirim dengan retain.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Sensor cahaya BH1750 (GY-30) | 1 | Rp19.400 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 4 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp97.900 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| BH1750 GY-30 (I2C) VCC | → | 3V3 | merah |
| BH1750 GY-30 (I2C) GND | → | GND | hitam |
| BH1750 GY-30 (I2C) SCL | → | D22 GPIO22 | kuning |
| BH1750 GY-30 (I2C) SDA | → | D21 GPIO21 | hijau |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p036.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 Siang / Malam | ichibot/KODE/p036/siang | ON = 1 “SIANG”, OFF = 0 |
| Chart Cahaya Hari Ini | ichibot/KODE/p036/lux | 0–5000 lux |
| Text Log Catatan Harian | ichibot/KODE/p036/log | menampilkan teks masuk |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary), BH1750 (Christopher Laws). Board di Arduino IDE: ESP32 Dev 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 036 - Pencatat Jam Matahari Terbit & Terbenam
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <BH1750.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_LUX = "ichibot/budi1234/p036/lux";
const char* TOPIK_LOG = "ichibot/budi1234/p036/log";
const char* TOPIK_SIANG = "ichibot/budi1234/p036/siang";
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);
}
BH1750 lux;
const float BATAS_LUX = 400; // di atas ini dianggap "siang"
bool siang = false;
int hitung = 0; // berapa bacaan berturut-turut melewati batas
unsigned long terakhir = 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);
Wire.begin();
lux.begin();
sambungWiFi();
configTime(7 * 3600, 0, "pool.ntp.org");
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (millis() - terakhir < 30000) return; // cukup tiap 30 detik
terakhir = millis();
float lx = lux.readLightLevel();
mqtt.publish(TOPIK_LUX, String(lx, 0).c_str());
bool terangSekarang = lx > BATAS_LUX;
hitung = (terangSekarang != siang) ? hitung + 1 : 0;
if (hitung >= 4) { // 4 x 30 detik = 2 menit konsisten
siang = terangSekarang;
hitung = 0;
String pesan = jamSekarang() + (siang ? " terang: matahari terbit" : " gelap: matahari terbenam");
mqtt.publish(TOPIK_LOG, pesan.c_str());
mqtt.publish(TOPIK_SIANG, siang ? "1" : "0", true);
}
}Langkah 4: Pahami kodenya
- Batas terang. Sensor di dalam ruangan menerima jauh lebih sedikit cahaya daripada di luar, jadi sesuaikan angkanya dengan lokasi sensor.
- Menghitung berapa bacaan berturut-turut yang berbeda dari keadaan sekarang. Satu bacaan sama mengulang hitungan ke 0.
- Baru dianggap berubah setelah 4 bacaan (2 menit) konsisten.