● online
- B0505S-1W 5V to 5V converter DC DC power module co....
- Kapton Tape Polymide Film 50mm Polimida 50 mm Isol....
- ESP32 ESP-32 Wireless Module ESP32-S ESP-WROOM-32 ....
- Kapton Tape Polymide Film 20mm Polimida 20 mm Isol....
- 10mm Kapton Tape Polymide Film Gold High Temp isol....
- 10X RESISTOR 1K 1KOHM 1/4W 1% METAL FILM....
- Raspberry Pi 4 Model B 8GB Original UK E14 Raspi 4....
- MP3 TF 16P Alternatif DFPlayer mini MP3 Player Ard....
- Selamat Datang di Indomaker ❯ Silahkan pesan produk sesuai kebutuhan anda, kami siap melayani.
- Selamat Datang di Indomaker ❯ Silahkan pesan produk sesuai kebutuhan anda, kami siap melayani.
Bikin Lampu Belajar Pintar Pake PID & Arduino Cahaya Sat-Set, Mata Anti-Lelah!
Pernah nggak sih kamu lagi asik-asiknya nugas atau belajar pas sore hari, eh tiba-tiba cahaya ruangan jadi redup gara-gara cuaca mendung atau transisi ke malam? Masalahnya, kalau lampu belajar kita cuma tipe statis (nyala gitu-gitu aja), mata jadi cepat lelah karena harus menyesuaikan diri terus. Terlalu terang bikin silau, terlalu redup malah bikin mata kerja ekstra. Pokoknya nggak aesthetic dan nggak nyaman banget buat produktivitas!
Nah, solusinya adalah bikin Lampu Belajar Pintar berbasis PID. Proyek ini bakal jadi “hero” buat meja belajar kamu karena lampunya nggak cuma sekadar nyala, tapi bisa mikir sendiri buat menyesuaikan kecerahan sesuai kondisi cahaya di sekitar kamu secara otomatis. Yuk, kita bedah cara bikinnya ala Sobat Indomaker!

Apa Itu Kendali PID? (Versi Gampang Banget)
Mungkin kamu sering dengar istilah PID di dunia robotik, tapi tenang, konsepnya sebenarnya simpel banget kalau diterapkan di lampu belajar ini. PID adalah singkatan dari Proportional, Integral, dan Derivative. Di proyek ini, ketiganya kerja bareng buat menjaga cahaya tetap stabil dan smooth:
- Proportional (P): Ini adalah respon cepat. Begitu sensor mendeteksi ruangan gelap, si P bakal langsung “gas pol” naikin kecerahan lampu.
- Integral (I): Tugasnya membereskan sisa error yang kecil-kecil. Si I bakal pelan-pelan dorong output sampai target cahaya benar-benar pas. Oh ya, di sini ada fitur Anti-Windup, yaitu semacam safety guard biar sistemnya nggak “halu” atau crash pas ngitung akumulasi error yang kelamaan.
- Derivative (D): Ini fungsinya sebagai “rem” atau peredam. Biar perubahan cahayanya mulus dan nggak kedap-kedip (anti-overshoot), si D bakal memantau seberapa cepat perubahan cahaya terjadi dan ngerem biar sistem nggak kaget.
Konsep kendali ini mirip banget dengan sistem otomatisasi lainnya, seperti yang bisa kamu baca di artikel Stabil Terus! Cara Bikin Kontrol Kelembapan Ruangan Otomatis Pakai Arduino dan PID buat membandingkan gimana PID menjaga kestabilan parameter yang berbeda dengan cerdas.
Alat dan Bahan (Budgeting)
Mau rakit sendiri? Tenang, proyek ini overpower tapi harganya tetap masuk akal buat kantong pelajar. Berikut estimasi komponen yang kamu butuhkan:
| No. | Alat dan Bahan | Jumlah | Estimasi Harga |
|---|---|---|---|
| 1 | Arduino Uno R3 (Clone) | 1 buah | Rp60.000 |
| 2 | Sensor Cahaya (LDR) | 1 buah | Rp3.000 |
| 3 | LCD 16×2 + Modul I2C | 1 buah | Rp25.000 |
| 4 | Keypad Membrane 4×4 | 1 buah | Rp10.000 |
| 5 | Driver Motor A4988 | 1 buah | Rp15.000 |
| 6 | LED Super Bright & Resistor | 1 set | Rp2.000 |
| 7 | Kabel Jumper & Breadboard | 1 set | Rp20.000 |
| Total Estimasi Biaya | Rp135.000 | ||
Total Estimasi Biaya: +/- Rp 135.000. Dengan modal segini, kamu udah bisa punya lampu belajar dengan teknologi kontrol industri!
Skematik Rangkaian & “Hardware Hack”
Rakitnya pelan-pelan ya, Sobat Indomaker. Ini panduan koneksinya biar sistem kamu langsung running:
- LDR (Mata Sistem): Hubungkan ke pin A0. Ini yang bakal “ngeliat” seberapa terang atau gelap meja kamu.
- LCD I2C: Sambungkan ke pin SDA dan SCL buat monitor status mode dan kecerahan secara real-time.
- Keypad 4×4: Ini interface utama buat kamu ganti-ganti mode atau input angka target cahaya.
- Driver A4988 (The Power Hack): Nah, ini trik rahasianya! Biasanya driver A4988 dipakai buat motor stepper, tapi kita pakai buat nge-drive LED berdaya tinggi biar aman dan nggak ngebakar Arduino.
- Sambungkan pin STEP ke pin 11 Arduino (sebagai jalur sinyal PWM).
- PENTING: Pin DIR (Pin 12) harus diatur ke HIGH, dan pin ENABLE (Pin 13) wajib dihubungkan dan diatur ke LOW di kode program biar driver-nya aktif. Kalau nggak, LED kamu nggak bakal mau nyala!
Cara Kerja & Fitur Utama
Sistem ini menggunakan mekanisme closed-loop, di mana sensor LDR terus memberikan feedback ke Arduino biar hasil outputnya selalu presisi. Saat baru nyala, kamu bakal disambut Splash Screen keren di LCD biar berasa pakai barang premium.
Ada 3 mode keren yang bisa kamu akses via Keypad:
- Mode A (Otomatis/PID): Mode paling cerdas. Kamu tinggal tentukan target cahaya (setpoint), dan lampu bakal menyesuaikan sendiri secara mulus.
- Mode B (Manual): Buat kamu yang pengen kendali penuh, kecerahan lampu bisa diatur manual (0-255) lewat keypad.
- Mode C (Tuning PID): Fitur buat para pro! Kamu bisa ubah nilai Kp, Ki, dan Kd secara real-time.
- Pro-Tip: Karena keypad nggak punya tombol titik (desimal), kita pakai trik “pembagian 100”. Misal mau input Kp = 1.2, kamu tinggal ketik 120 lalu tekan #. Sistem otomatis bakal konversi nilainya jadi desimal. Sat-set banget kan?
Bedah Logika Program
Inti dari program ini adalah Arduino menghitung selisih (error) antara cahaya yang diinginkan (setpoint) dengan cahaya asli yang dibaca LDR.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// =====================================================
// LCD
// =====================================================
LiquidCrystal_I2C lcd(0x27, 16, 2);
// =====================================================
// PIN
// =====================================================
#define LDR_PIN A0
#define LED_PIN 11
// =====================================================
// KEYPAD 4x4
// =====================================================
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8, 9};
Keypad keypad = Keypad(
makeKeymap(keys),
rowPins,
colPins,
ROWS,
COLS
);
// =====================================================
// PID PARAMETER
// =====================================================
float Kp = 1.2;
float Ki = 0.5;
float Kd = 0.3;
// =====================================================
// SETPOINT
// =====================================================
int setpoint = 600;
// =====================================================
// PID VARIABLE
// =====================================================
float error = 0;
float lastError = 0;
float integral = 0;
float derivative = 0;
float pidOutput = 0;
// Batas integral untuk Anti-Windup
float integralMin = -500;
float integralMax = 500;
// =====================================================
// MODE
// A = Automatic PID
// B = Manual
// C = PID Tuning
// =====================================================
char mode = 'A';
// Manual brightness
int manualPWM = 100;
// =====================================================
// TIMER
// =====================================================
unsigned long lastPIDTime = 0;
const unsigned long sampleTime = 100;
// =====================================================
// VARIABEL INPUT KEYPAD
// =====================================================
String inputBuffer = "";
// =====================================================
// SETUP
// =====================================================
void setup() {
Serial.begin(115200);
pinMode(LDR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
lcd.init();
lcd.backlight();
// Splash screen
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Smart Study Lamp");
lcd.setCursor(0, 1);
lcd.print("PID + Arduino");
delay(2000);
lcd.clear();
lcd.print("Mode: AUTO");
delay(1000);
}
// =====================================================
// LOOP
// =====================================================
void loop() {
char key = keypad.getKey();
// Baca sensor LDR
int ldrValue = analogRead(LDR_PIN);
// Navigasi mode
if (key == 'A') {
mode = 'A';
inputBuffer = "";
integral = 0;
lcd.clear();
lcd.print("Mode AUTO");
delay(500);
}
else if (key == 'B') {
mode = 'B';
inputBuffer = "";
lcd.clear();
lcd.print("Mode MANUAL");
delay(500);
}
else if (key == 'C') {
mode = 'C';
inputBuffer = "";
lcd.clear();
lcd.print("Mode TUNING");
delay(500);
}
// =================================================
// MODE A - PID OTOMATIS
// =================================================
if (mode == 'A') {
unsigned long now = millis();
if (now - lastPIDTime >= sampleTime) {
float dt = (now - lastPIDTime) / 1000.0;
lastPIDTime = now;
// Error
error = setpoint - ldrValue;
// Integral
integral += error * dt;
// Anti-Windup
if (integral > integralMax) {
integral = integralMax;
}
if (integral < integralMin) {
integral = integralMin;
}
// Derivative
derivative = (error - lastError) / dt;
// PID
pidOutput =
(Kp * error) +
(Ki * integral) +
(Kd * derivative);
// Simpan error sebelumnya
lastError = error;
// Batasi output PWM
pidOutput = constrain(pidOutput, 0, 255);
analogWrite(LED_PIN, (int)pidOutput);
}
// Tampilan LCD
static unsigned long lastLCD = 0;
if (millis() - lastLCD > 500) {
lastLCD = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("AUTO L:");
lcd.print(ldrValue);
lcd.setCursor(0, 1);
lcd.print("PWM:");
lcd.print((int)pidOutput);
lcd.print(" SP:");
lcd.print(setpoint);
}
}
// =================================================
// MODE B - MANUAL
// =================================================
else if (mode == 'B') {
if (key >= '0' && key <= '9') {
inputBuffer += key;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("PWM Manual:");
lcd.setCursor(0, 1);
lcd.print(inputBuffer);
}
// Reset input
if (key == '*') {
inputBuffer = "";
lcd.clear();
lcd.print("Input Reset");
delay(500);
}
// Enter
if (key == '#') {
if (inputBuffer.length() > 0) {
manualPWM = inputBuffer.toInt();
manualPWM = constrain(manualPWM, 0, 255);
analogWrite(LED_PIN, manualPWM);
inputBuffer = "";
lcd.clear();
lcd.print("PWM:");
lcd.print(manualPWM);
delay(500);
}
}
}
// =================================================
// MODE C - PID TUNING
// =================================================
else if (mode == 'C') {
/*
Menu tuning:
1 = Kp
2 = Ki
3 = Kd
Contoh:
Tekan 1
Masukkan 120
Tekan #
Maka Kp = 1.20
*/
if (key == '1') {
lcd.clear();
lcd.print("Set Kp:");
inputBuffer = "";
char selectedParameter = 'P';
while (true) {
char k = keypad.getKey();
if (k >= '0' && k <= '9') {
inputBuffer += k;
lcd.setCursor(0, 1);
lcd.print(inputBuffer);
}
if (k == '*') {
inputBuffer = "";
lcd.setCursor(0, 1);
lcd.print(" ");
}
if (k == '#') {
if (inputBuffer.length() > 0) {
Kp = inputBuffer.toFloat() / 100.0;
inputBuffer = "";
lcd.clear();
lcd.print("Kp = ");
lcd.print(Kp, 2);
delay(1000);
}
break;
}
}
}
// -------------------------------------------------
// KI
// -------------------------------------------------
if (key == '2') {
lcd.clear();
lcd.print("Set Ki:");
inputBuffer = "";
while (true) {
char k = keypad.getKey();
if (k >= '0' && k <= '9') {
inputBuffer += k;
lcd.setCursor(0, 1);
lcd.print(inputBuffer);
}
if (k == '*') {
inputBuffer = "";
lcd.setCursor(0, 1);
lcd.print(" ");
}
if (k == '#') {
if (inputBuffer.length() > 0) {
Ki = inputBuffer.toFloat() / 100.0;
inputBuffer = "";
lcd.clear();
lcd.print("Ki = ");
lcd.print(Ki, 2);
delay(1000);
}
break;
}
}
}
// -------------------------------------------------
// KD
// -------------------------------------------------
if (key == '3') {
lcd.clear();
lcd.print("Set Kd:");
inputBuffer = "";
while (true) {
char k = keypad.getKey();
if (k >= '0' && k <= '9') {
inputBuffer += k;
lcd.setCursor(0, 1);
lcd.print(inputBuffer);
}
if (k == '*') {
inputBuffer = "";
lcd.setCursor(0, 1);
lcd.print(" ");
}
if (k == '#') {
if (inputBuffer.length() > 0) {
Kd = inputBuffer.toFloat() / 100.0;
inputBuffer = "";
lcd.clear();
lcd.print("Kd = ");
lcd.print(Kd, 2);
delay(1000);
}
break;
}
}
}
// Tampilkan parameter PID
static unsigned long lastTuneLCD = 0;
if (millis() - lastTuneLCD > 1000) {
lastTuneLCD = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("P:");
lcd.print(Kp, 2);
lcd.print(" I:");
lcd.print(Ki, 2);
lcd.setCursor(0, 1);
lcd.print("D:");
lcd.print(Kd, 2);
}
}
// =================================================
// SERIAL MONITOR
// =================================================
static unsigned long lastSerial = 0;
if (millis() - lastSerial > 500) {
lastSerial = millis();
Serial.print("Mode: ");
Serial.print(mode);
Serial.print(" | LDR: ");
Serial.print(ldrValue);
Serial.print(" | SP: ");
Serial.print(setpoint);
Serial.print(" | PWM: ");
Serial.print((int)pidOutput);
Serial.print(" | Kp: ");
Serial.print(Kp);
Serial.print(" | Ki: ");
Serial.print(Ki);
Serial.print(" | Kd: ");
Serial.println(Kd);
}
}
Hasil Pengujian & Grafik
Dari hasil eksperimen, sistem ini terbukti responsif banget. Saat sensor LDR ditutup (simulasi ruangan gelap), nilai PWM langsung naik otomatis secara halus buat bikin LED terang benderang.

Berdasarkan pengujian manual, nilai tuning yang paling stabil (mencapai target tanpa goyang-goyang atau osilasi) adalah:
- Kp = 1.2
- Ki = 0.5
- Kd = 0.3
Dengan parameter ini, transisi cahaya jadi sangat mulus, nggak bakal bikin mata kaget kalau tiba-tiba ada perubahan cahaya di luar.
Kesimpulan
Bikin Lampu Belajar PID ini bukan cuma soal gaya-gayaan, tapi beneran solusi fungsional buat menjaga kesehatan mata dan kenyamanan belajar. Dengan budget 135 ribuan dan sedikit hardware hack pakai driver A4988, kamu udah punya perangkat belajar yang cerdas dan hemat energi.
Gimana? Tertarik buat nyoba rakit di rumah? Langsung aja gaskeun kumpulin bahannya dan rasakan sensasi belajar dengan cahaya yang selalu pas!
Bikin Lampu Belajar Pintar Pake PID & Arduino Cahaya Sat-Set, Mata Anti-Lelah!
Limit switch merupakan sebuah saklar yang memiliki tuas sebagai penghubung ataupun pemutus arus litrik. Prinsip kerjanya sama seperti push... selengkapnya
LoRa merupakan singkatan dari Long Range, dimana module ini menggunakan frekuensi radio dengan jarak yang jauh dan konsumsi daya... selengkapnya
Halo Sobat Indomaker! Apakah Teman-teman pernah merasa terganggu karena harus bolak-balik menyalakan, mematikan, atau mengatur kecepatan kipas angin secara manual?... selengkapnya
Pada beberapa profesi yang menggunakan bantuan suatu aplikasi ataupun perangkat lunak sangatlah banyak. Nyatanya dengan adanya berbagai macam perangkat... selengkapnya
Arduino Pro Micro adalah jenis arduino yang berukuran kecil, ukuranya hampir sama seperti Arduino Pro Mini. Secara fungsi dan... selengkapnya
Motor DC sering digunakan dalam proyek Raspberry Pi seperti robot, kipas otomatis, conveyor mini, dan berbagai sistem mekanik lainnya. Namun,... selengkapnya
LED RGB adalah lampu led yang mempunyai 3 warna utama yaitu RED/merah, GREEN/hijau dan BLUE/biru. Namun dengan kombinasi dari... selengkapnya
Potensiometer merupakan sebuah resistor yang nilainya dapat kita atur sesuai keinginan. Bagaimana cara mengaturnya? nah potensiometer memiliki 3... selengkapnya
Sesuai judulnya kali ini kita akan mencoba 7 segment 4 digit pada Arduino. Dengan 4 digit ini berarti terdapat... selengkapnya
Hallo apa kabar pada artikel ini saya berbagi cara kontrol led menggunakan potensiometer pada NodeMCU. Jadi nanti akan mengatur... selengkapnya
Modul sensor tegangan AC bolak balik 1 fasa ini menggunakan optocoupler sehingga tegangan input (AC) tidak akan mengganggu/membahayakan tegangan output… selengkapnya
Rp 21.000ESR meter/LCR meter dengan layar lebar lebih jelas dan mantap dan dengan tempat batre jd lebih rapih batre lebih aman… selengkapnya
Rp 131.000 Rp 134.0001 X LDR Sensor 5mm Cahaya 5528 Light Dependent Resistor LDR
Rp 4.000The power supply is isolated industrial power modules, with a temperature protection, overcurrent and short circuit full protection, high and… selengkapnya
Rp 15.900Bagaimana jika mikrokontroler yang anda gunakan tidak memiliki port ADC. atau anda masih kurang dengan spesifikasi resolusi ADC yang disediakan… selengkapnya
Rp 65.000Kabel Jumper Dupont Pelangi 10 cm male to male 1 lembar = 40 kabel
Rp 13.000Spesifikasi: 50mm Kapton Tape Polymide Film Gold High Temp isolasi Tahan Panas Harga Tertera: 1 Roll Kapton Tape Polymide Film… selengkapnya
Rp 75.000This is a set of transmitter and receiver in one of the photoelectric sensor. Detection distance can be adjusted according… selengkapnya
Rp 37.500Kabel jumper 20 cm merk Dupont untuk Arduino Female to male 1 lembar = 40 kabel
Rp 11.300Bikin Lampu Belajar Pintar Pake PID & Arduino Cahaya Sat-Set, Mata Anti-Lelah!
Kategori
Artikel Terkait
-
Cara Bikin Sistem Monitoring Getaran Gempa dan Stabilitas Kemiringan Pakai ESP32 dan MPU 6050
-
Cara Bikin Sistem Monitoring Kelembapan Tanah Berbasis Arduino Uno dan Sensor YL69
-
Bikin Sistem Monitor Volume Air Tandon Otomatis Pakai Arduino Uno dan Sensor Ultrasonik
-
Cara Bikin Kipas Angin Otomatis Berbasis Suhu Pakai Arduino Uno dan Sensor LM35
-
Bikin Smart Medicine Box Otomatis Pakai Arduino Nano dan Sensor Suhu DHT11

Saat ini belum tersedia komentar.