● online
- LCD 16x2 / 1602 Display Biru + I2C Backpack Sudah ....
- Kabel Jumper arduino Dupont Pelangi 30 cm Male to ....
- Breadboard 400 titik lubang Bread board Projectboa....
- SG90 Motor Servo For Arduino Uno Mega SG 90 Biru S....
- Tilt Sensor SW-520D Module Modul Sensor Kemiringan....
- Dimmer AC 4000W 220 Volt 4000 Watt 220V + Casing A....
- Kapton Tape Polymide Film 50mm Polimida 50 mm Isol....
- Kabel Jumper Arduino Dupont 20 cm Female to Male P....
- 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!
Menjaga kondisi lingkungan ruang server tetap stabil adalah hal yang sangat krusial bagi kelangsungan operasional sistem TI. Jika suhu dan... selengkapnya
Salah satu proyek pertama yang sering dilakukan oleh pemula dalam dunia Raspberry Pi adalah menyalakan LED. Meskipun terlihat sederhana, proyek... selengkapnya
Melihat potensi dari android itu sendiri, akhirnya banyak orang yang berlomba lomba belajar memperdalam sistem operasi ini. Tentunya akan... selengkapnya
Panel P10 LED Matrix merupakan sebuah display berisi kumpulan led-led yang disusun secara matrix. Fungsinya untuk menampilkan informasi berupa... selengkapnya
LDR (Light Dependent Resistor) adalah sensor cahaya yang berbasis nilai resistansi. Semakin banyak intensitas cahaya yang diterima maka semakin... selengkapnya
IC AtMega328p pada Arduino Uno anda rusak? panas? atau anda ingin membuat sistem minimum sendiri? tenang solusinya adalah dengan... selengkapnya
NodeMCU dikhususkan sebagai board yang dapat terhubung dengan jaringan internet (Wifi), jadi buat yang ingin belajar Internet of... selengkapnya
Sensor level A01 Series adalah perangkat yang digunakan untuk mengukur ketinggian permukaan benda padat atau cairan menggunakan gelombang ultrasonik. Sensor ini... selengkapnya
Sensor ultrasonik merupakan sensor yang dapat mendeteksi suatu benda yang ada di depannya dengan jarak tertentu. Prinsip kerja dari... selengkapnya
Dalam dunia fotografi, mengambil foto yang bagus merupakan suatu keahlian yang harus di kuasai oleh seorang fotografer. Karena dengan... selengkapnya
Support terus UKM indonesia dengan membeli produk-produk dalam negeri. Untuk kualitas tidak usah diragukan, udah kita tes QC dengan sangat… selengkapnya
Rp 8.500Kabel jumper Dupont untuk jumper Arduino atau Raspberry Pi 20 cm Male to Male 1 lembar = 40 kabel
Rp 11.300TILT SENSOR adalah sensor untuk mendeteksi sudut kemiringan / derajat, dimana cara kerja sensor ini adalah dengan menggunakan 2 buah… selengkapnya
Rp 9.800Modul sensor tegangan AC bolak balik 1 fasa ini menggunakan optocoupler sehingga tegangan input (AC) tidak akan mengganggu/membahayakan tegangan output… selengkapnya
Rp 21.000Harga untuk 10pcs Resistance: 1K Ohm Wattage Rating: 0.25 Watt Tolerance: 1% Metal Film
Rp 1.500Item Deskripsi : This module performance is stable, measure the distance accurately. performance nearly the same as SRF05, SRF02 SRF05,… selengkapnya
Rp 13.900Ini yang Seri SN – DS3231 I2C RTC Module khusus DS3231SN – Include Baterai – Module jam digital – Keperluan… selengkapnya
Rp 34.900Kabel Jumper Dupont Pelangi 10 cm male to male 1 lembar = 40 kabel
Rp 13.000Warna : biru dan merah Bahan Alumunium 25T include baut 2 pcs
Rp 8.750Buruan dibeli gan….barang murah-berkualitas SIAPA CEPAT DIA DAPAT Spesifikasi: LCD 1602 / 16×2 (16 karakter, 2 baris) merek QAPASS (cek… selengkapnya
Rp 24.500Bikin Lampu Belajar Pintar Pake PID & Arduino Cahaya Sat-Set, Mata Anti-Lelah!
Kategori
Artikel Terkait
-
Bikin Sistem Parkir Otomatis dengan Penghitung Kendaraan dan Indikator Slot Kosong
-
Rancang Sistem Pendeteksi Kebakaran dengan Kipas Otomatis dan Alarm Peringatan
-
Bikin Alat Monitoring Konsumsi Listrik Rumah Secara Real-Time Berbasis ESP32
-
Bikin Sistem Keamanan Pintu Berbasis RFID dengan Notifikasi Telegram
-
Rancang Sistem Penyiram Tanaman Otomatis Berbasis ESP32 dengan Monitoring Smartphone

Saat ini belum tersedia komentar.