Buka Senin - Jumat jam 08.30 s/d jam 16.30 , Sabtu Jam 8.30 s/d jam 13.00 , Minggu tutup
  • 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.
Beranda » Blog » Bikin Lampu Belajar Pintar Pake PID & Arduino Cahaya Sat-Set, Mata Anti-Lelah!

Bikin Lampu Belajar Pintar Pake PID & Arduino Cahaya Sat-Set, Mata Anti-Lelah!

Diposting pada 17 September 2026 oleh indo maker / Dilihat: 11 kali / Kategori:

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:

  1. LDR (Mata Sistem): Hubungkan ke pin A0. Ini yang bakal “ngeliat” seberapa terang atau gelap meja kamu.
  2. LCD I2C: Sambungkan ke pin SDA dan SCL buat monitor status mode dan kecerahan secara real-time.
  3. Keypad 4×4: Ini interface utama buat kamu ganti-ganti mode atau input angka target cahaya.
  4. 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!

Bagikan ke

Bikin Lampu Belajar Pintar Pake PID & Arduino Cahaya Sat-Set, Mata Anti-Lelah!

Saat ini belum tersedia komentar.

Silahkan tulis komentar Anda

Bikin Lampu Belajar Pintar Pake PID & Arduino Cahaya Sat-Set, Mata Anti-Lelah!

Produk yang sangat tepat, pilihan bagus..!

Berhasil ditambahkan ke keranjang belanja
Lanjut Belanja
Checkout
Produk Quick Order

Pemesanan dapat langsung menghubungi kontak dibawah: