● online
- Kabel Jumper 20cm Dupont 20 cm Female to Female Pe....
- Push Button Tactile Switch Saklar Tombol Tinggi - ....
- DS3231SN DS3231 SN I2C RTC Module & Baterai Mo....
- Kabel Jumper arduino Dupont Pelangi 30 cm Male to ....
- Kabel Jumper 10cm Dupont Pelangi 10 cm Female to M....
- Power module DC DC 9A 300W Step Down Buck Converte....
- SG90 Motor Servo For Arduino Uno Mega SG 90 Biru S....
- Kapton Tape Polymide Film 20mm Polimida 20 mm Isol....
- 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!
Sensor INA219 merupakan sensor yang berfungsi untuk mengukur 2 parameter sekaligus yaitu tegangan (volt) dan arus (ampere). Tegangan yang... selengkapnya
Motor servo merupakan salah satu aktuator yang paling sering digunakan dalam dunia robotika, terutama untuk gerakan yang membutuhkan ketelitian posisi.... selengkapnya
Secara bawaan, GPIO Raspberry Pi hanya bisa membaca input digital yang berarti hanya bisa mendeteksi dua kondisi, yaitu hidup atau... selengkapnya
Jumpa lagi dengan indomaker, salam hangat untuk anda-anda diluar sana yang selalu semangat belajar Arduino. Pada tutorial kali ini... selengkapnya
Optocoupler atau photo interrupter merupakan sensor optik slot tipe U yang menggunakan cahaya infra merah (IR) untuk mendeteksi ada atau... selengkapnya
Apa itu efek autumn? Efek autumn adalah efek musim gugur, dimana dedaunan akan berubah warna dari hijau menjadi coklat... selengkapnya
Halo Sobat Maker! Teman-teman pernah ngerasa ribet gak sih kalau harus bolak-balik ngecek ketinggian air kolam ikan secara manual? Apalagi... selengkapnya
Halo semuanya, pada kesempatan kali ini Saya ingin membahas tentang simulasi penggunaan sensor LDR (sensor cahaya) menggunakan Arduino untuk... selengkapnya
Pada kesempatan ini akan dijelaskan mengenai cara pembuatan export/download berupa file excel berdasarkan range tanggal yang dipilih. Filter ini... selengkapnya
Bagi orang-orang yang sering melihat konten-konten di aplikasi Instagram mungkin sudah tidak asing lagi, melihat gambar atau foto yang... selengkapnya
12A 300W DC Buck Step Down Converter CC CV Driver LED charge Battery Spesifikasi: Input Voltage: 5-40V Output Voltage: 1.2-35V… selengkapnya
Rp 39.400Description: TP5100 is a double switch buck 8.4V, single cell 4. 2V lithium battery charge management chip. Its ultra-compact QFN16… selengkapnya
Rp 10.600sg90 towerpro penggerak pada robot-robot kecil, dan bisa digunakan sebagai alat untuk hobi membuat robot dsb, dengan berat sekitar 9g… selengkapnya
Rp 15.500TILT SENSOR adalah sensor untuk mendeteksi sudut kemiringan / derajat, dimana cara kerja sensor ini adalah dengan menggunakan 2 buah… selengkapnya
Rp 9.800Warna : biru dan merah Bahan Alumunium 25T include baut 2 pcs
Rp 8.750Spesifikasi : – 16×2 – Warna Biru – Tegangan kerja : 5v Digunakan untuk keperluan display project seperti Arduino, Raspberry,… selengkapnya
Rp 17.000Tang Crimping Press Skun Ratchet YTH SN-48B Model YTH SN-48B FOR NON INSULATED TERMINAL YTH SN-48B dengan mata Press 0.5… selengkapnya
Rp 150.0002000W SCR Electronic Voltage Regulator Speed Controller Dimmer Thermostat Aplikasi : Kontrol temperature heater, kontrol kecepatan fan/bor tangan/gurinda tangan, kompor… selengkapnya
Rp 19.500Penurun tegangan DC-DC ekonomis yang bisa distel tegangan output nya. Cocok untuk pemasangan variasi mobil dan sepeda motor, dijadikan charger… selengkapnya
Rp 9.000Modul sensor tegangan AC bolak balik 1 fasa ini menggunakan optocoupler sehingga tegangan input (AC) tidak akan mengganggu/membahayakan tegangan output… selengkapnya
Rp 21.000Bikin Lampu Belajar Pintar Pake PID & Arduino Cahaya Sat-Set, Mata Anti-Lelah!
Kategori
Artikel Terkait
-
Jaga Kolam Ikan Tetap Stabil Pakai Arduino dan PID Biar Ikan Makin Happy
-
Stabil Terus! Cara Bikin Kontrol Kelembapan Ruangan Otomatis Pakai Arduino dan PID
-
Bikin Robot Anti Tumbang Panduan Lengkap Self-Balancing Robot Pakai Arduino
-
Bikin Mobil Parkir Otomatis Pakai Arduino dan PID dengan Budget di Bawah 100 Ribu
-
Bikin Stabilizer 1-Axis Low Budget Pakai Arduino dan PID

Saat ini belum tersedia komentar.