Tutorial Belanja komponen

Tutorial › Cahaya

Pencatat Jam Matahari Terbit & Terbenam

ESP32-WROOM-32D23D22TX0RX0D21D19D18D5TX2RX2D4D2D15GND3V3ENVPVND34D35D32D33D25D26D27D14D12D13GNDVINVCCGNDSCLSDAADDRBH1750 GY-30 (I2C)

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

KomponenQtyHarga
ESP32 DOIT DevKit V1 30 pin1Rp75.000
Sensor cahaya BH1750 (GY-30)1Rp19.400
Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 41Rp3.500
Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data1Rp11.700
Total (tanpa opsional)Rp97.900
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
BH1750 GY-30 (I2C) VCC→3V3merah
BH1750 GY-30 (I2C) GND→GNDhitam
BH1750 GY-30 (I2C) SCL→D22 GPIO22kuning
BH1750 GY-30 (I2C) SDA→D21 GPIO21hijau

Langkah 2: Siapkan dashboard Klenik

Siang / Malamichibot/budi1234/p036/siang
SIANG
0 detik lalu
Cahaya Hari Iniichibot/budi1234/p036/lux
10lux
0.0lux12 titik5000.0lux
0 detik lalu
Catatan Harianichibot/budi1234/p036/log
05:51 terang: matahari terbit
17:58 gelap: matahari terbenam
0 detik lalu

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.

WidgetTopicSetting
Indikator Boolean
Siang / Malam
ichibot/KODE/p036/siangON = 1 “SIANG”, OFF = 0
Chart
Cahaya Hari Ini
ichibot/KODE/p036/lux0–5000 lux
Text Log
Catatan Harian
ichibot/KODE/p036/logmenampilkan 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).

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

  1. Batas terang. Sensor di dalam ruangan menerima jauh lebih sedikit cahaya daripada di luar, jadi sesuaikan angkanya dengan lokasi sensor.
  2. Menghitung berapa bacaan berturut-turut yang berbeda dari keadaan sekarang. Satu bacaan sama mengulang hitungan ke 0.
  3. Baru dianggap berubah setelah 4 bacaan (2 menit) konsisten.