Tutorial Belanja komponen

Tutorial › Cahaya

Lampu Belajar Terang Otomatis (PWM)

ESP32-WROOM-32D23D22TX0RX0D21D19D18D5TX2RX2D4D2D15GND3V3ENVPVND34D35D32D33D25D26D27D14D12D13GNDVINVCCGNDSCLSDAADDRBH1750 GY-30 (I2C)+−LED putih + resistor 330 Ω

Lampu yang menjaga meja tetap seterang target, misalnya 300 lux. Siang hari lampu redup sendiri karena ada cahaya jendela, malam hari menyala lebih terang. Dasar sistem kontrol tertutup (closed loop) yang dipakai di industri.

Setiap 200 ms ESP32 membandingkan lux terbaca dengan target. Selisihnya dikalikan 0,02 lalu ditambahkan ke nilai PWM LED: kurang terang dinaikkan, kelebihan diturunkan. Ini bentuk paling sederhana dari kontroler integral. Lampu terus menyesuaikan sampai selisihnya hampir 0. Sensor harus diletakkan di permukaan meja, tidak menghadap langsung ke LED.

Komponen

KomponenQtyHarga
ESP32 DOIT DevKit V1 30 pin1Rp75.000
Sensor cahaya BH1750 (GY-30)1Rp19.400
LED 5 mm putih superbright (isi 10)isi 10, terpakai 11Rp2.850
Resistor 330 Ω (isi 10)isi 10, terpakai 11Rp1.800
Breadboard mini 170 titik1Rp4.875
Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 61Rp3.500
Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data1Rp11.700
Total (tanpa opsional)Rp107.425
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
LED putih + resistor 330 Ω +→D25 GPIO25biru
LED putih + resistor 330 Ω −→GNDhitam

Langkah 2: Siapkan dashboard Klenik

Terang di Mejaichibot/budi1234/p037/lux
0800296lux
0 detik lalu
Daya Lampuichibot/budi1234/p037/daya
0 – 10062%
0 detik lalu
Target Luxichibot/budi1234/p037/target
300lux300 of 600lux
0 detik lalu
Lampu Otomatisichibot/budi1234/p037/aktif
Aktif
0 detik lalu

Cara cepat: unduh p037.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
Gauge
Terang di Meja
ichibot/KODE/p037/lux0–800 lux
Gauge
Daya Lampu
ichibot/KODE/p037/daya0–100 %
Slider Output
Target Lux
ichibot/KODE/p037/target50–600 lux
Switch
Lampu Otomatis
ichibot/KODE/p037/aktifpayload ON / OFF

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).

p037.inoUnduh .ino
// Proyek 037 - Lampu Belajar Terang Otomatis (PWM)
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <BH1750.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_TARGET = "ichibot/budi1234/p037/target";
const char* TOPIK_AKTIF  = "ichibot/budi1234/p037/aktif";
const char* TOPIK_LUX    = "ichibot/budi1234/p037/lux";
const char* TOPIK_DAYA   = "ichibot/budi1234/p037/daya";

const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
BH1750 lux;
const int LED = 25;                   // LED putih superbright lewat resistor
float target = 300;                   // lux yang diinginkan di meja
float pwm = 0;                        // 0-255
bool aktif = true;
unsigned long terakhir = 0, terakhirLapor = 0;

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_TARGET) target = p.toFloat();
  else if (topik == TOPIK_AKTIF) aktif = (p == "ON");
}

void langganan() {
  mqtt.subscribe(TOPIK_TARGET);
  mqtt.subscribe(TOPIK_AKTIF);
}

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(); mqtt.setServer(BROKER, 1883); mqtt.setCallback(pesanMasuk); } void loop() { if (!mqtt.connected()) sambungMQTT(); mqtt.loop(); if (millis() - terakhir < 200) return; terakhir = millis(); float lx = lux.readLightLevel(); if (aktif) pwm += (target - lx) * 0.02; // kurang terang: tambah, kelebihan: kurangi else pwm = 0; pwm = constrain(pwm, 0, 255); analogWrite(LED, (int)pwm); if (millis() - terakhirLapor >= 2000) { terakhirLapor = millis(); mqtt.publish(TOPIK_LUX, String(lx, 0).c_str()); mqtt.publish(TOPIK_DAYA, String(pwm * 100 / 255, 0).c_str()); } }

Langkah 4: Pahami kodenya

  1. Inti kontrol. Angka 0,02 adalah "kepekaan". Terlalu besar membuat lampu naik-turun berayun, terlalu kecil membuatnya lambat menyesuaikan.
  2. PWM dibatasi 0-255. Kalau satu LED tidak cukup mencapai target, nilainya akan diam di 255 (daya 100%).
  3. Kontrol berjalan tiap 200 ms, tapi laporan ke dashboard cukup tiap 2 detik supaya broker tidak dibanjiri.