● online
- Kabel Jumper 20cm Dupont 20 cm Female to Female Pe....
- IIC I2C LCD 1602 16x2 2004 20x4 Backpack for LCD A....
- Relay Module 1 Channel Modul Relay 5V 10A 1 Channe....
- Push Button Tactile Switch Saklar Tombol Tinggi - ....
- Breadboard 400 titik lubang Bread board Projectboa....
- Potensiometer 10K - Mono Potensio Meter Linear Res....
- LM35DZ Sensor Suhu - LM35....
- Kabel Jumper Dupont Pelangi 30 cm female to Female....
- 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!
Siapa yang kenal dengan modul SIM? dengan modul ini kita bisa berkomunikasi dengan SIM GSM baik untuk mengirim... selengkapnya
Pada komponen tertentu dibutuhkan sebuah library agar komponen tersebut dapat berjalan sebagaimana mestinya. Apa itu library? library adalah sekumpulan... selengkapnya
SMS gateway merupakan layanan yang berguna untuk meneruskan pesan ke jaringan seluler lain... selengkapnya
Raspberry Pi tidak hanya bisa menyalakan LED atau membaca input dari tombol, tapi juga bisa digunakan untuk membuat simulasi lampu... selengkapnya
Selamat datang di indomaker.com, pada pembahasan kali ini admin akan mengupas tentang penggunaan ESP32-CAM. Module ini merupakan sebuah module... selengkapnya
Android Intent adalah struktur data atau objek yang terdapat deskripsi dari tugas yang akan dijalankan. Salah satu keunggulan dari... selengkapnya
Penggunaan LCD I2C sering kali gagal menampilkan teks karena deklarasi awal yaitu alamat I2C yang salah/keliru dikarenakan alamat yang... selengkapnya
Mengendalikan LED dengan tombol bisa dilakukan dengan berbagai cara. Kali ini, kamu akan mempelajari dua metode umum dan sangat berguna:... selengkapnya
MPU6050 merupakan sebuah sensor yang berfungsi untuk mengukur percepatan suatu benda yang bergerak. Nah kali ini kita akan belajar... selengkapnya
Dalam menjalankan bisnis online tentu saja harus memperhatikan beberapa aspek agar bisnis kita berjalan dengan lancar. Sebagai contoh di... selengkapnya
Bosan dengan modul arduino yang kalian punya, saatnya mencoba modul programmer yang lain yah ini dia RASPBERRY PI 4 COMPUTER… selengkapnya
Rp 1.570.000Spesifikasi : – 16×2 – Warna Biru – Tegangan kerja : 5v Digunakan untuk keperluan display project seperti Arduino, Raspberry,… selengkapnya
Rp 17.000Spesifikasi: 20mm Kapton Tape Polymide Film Gold High Temp isolasi Tahan Panas Harga Tertera: 1 Roll Kapton Tape Polymide Film… selengkapnya
Rp 219.000Kabel Jumper Dupont Pelangi 10 cm female to female 1 lembar = 40 kabel
Rp 9.000Bosan dengan modul arduino yang kalian punya, saatnya mencoba modul programmer yang lain yah ini dia RASPBERRY PI 4 COMPUTER… selengkapnya
Rp 1.199.000Specifications: Operating voltage: DC3-5V Operating current: less than 20mA Sensor Type: Analog Detection Area: 40mmx16mm Production process: FR4 double-sided HASL… selengkapnya
Rp 3.000Menerima jasa cetak PCB FR2 (pertinax) / FR4 (double) single / double layer. Silahkan ke web kalkulator biaya cetak pcb… selengkapnya
Rp 1.000Kabel jumper Dupont untuk jumper Arduino atau Raspberry Pi 20 cm Male to Male 1 lembar = 40 kabel
Rp 11.300Fitur: -Dapat mendeteksi api atau panjang gelombang sumber cahaya dalam 760nm ~ 1100nm – Api lebih ringan mendeteksi jarak 80cm… selengkapnya
Rp 9.000Kabel Jumper Dupont Pelangi 30cm female to Female 1 lembar = 40 kabel
Rp 13.500Bikin 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.